加密算法 - DES,AES, RSA, MD5, SHA, HMAC, Base64

Base64

  • Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3
  • base64 编码构成 : a-z, A-Z, 0-9, +/

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
    Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,需要解码后才能阅读。


转换实例:
转换前 11111111, 11111111, 11111111 (二进制)
转换后 00111111, 00111111, 00111111, 00111111 (二进制)
上面的三个字节是原文,下面的四个字节是转换后的Base64编码,其前两位均为0。
转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的:(摘自RFC2045)

  • Objective-C 中使用 base64 编码解码:
    - (NSString )base64:(NSData )data { return [data base64EncodedStringWithOptions:0]; }
    - (NSData )base64:(NSString )string { return [[NSData alloc] initWithBase64EncodedString:string options:0]; }

    哈希(散列)算法

  • 算法公开;

  • 对不同数据加密结构是定长的! 32位字符!!
  • 加密后的数据是不可逆的,
  • MD5, SHA, HMAC

    MD5

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3MD4

  • MD5算法具有以下特点:

    • 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
    • 2、容易计算:从原数据计算出MD5值很容易。
    • 3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    • 4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5的作用是让大容量信息在用数字签名软件签署私人**前被”压缩“成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1RIPEMD以及Haval等。

  • 原理:
    对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
  • 使用: 通常我们习惯对 MD5 加密的数据进行 base64编码后输出. ```objectivec
  • (NSData )md5WithData:(NSData )hashData { unsigned char *digest; digest = malloc(CC_MD5_DIGEST_LENGTH);

    CC_MD5([hashData bytes], (CC_LONG)[hashData length], digest);

    NSData *md5Data = [NSData dataWithBytes:digest length:CC_MD5_DIGEST_LENGTH]; free(digest); return md5Data; } ```

    SHA

    安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

  • SHA家族的五个算法,分别是SHA-1SHA-224SHA-256SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2SHA-1在许多安全协定中广为使用,包括TLSSSLPGPSSHS/MIMEIPsec,曾被视为是MD5(更早之前被广为使用的杂凑函数)的后继者。但SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的杂凑算法。
  • 应用:
    SHA-1, SHA-224, SHA-256, SHA-384SHA-512都被需要安全杂凑算法的美国联邦政府所应用,他们也使用其他的密码算法和协定来保护敏感的未保密资料。FIPS PUB 180-1也鼓励私人或商业组织使用SHA-1 加密。Fritz-chip将很可能使用SHA-1 杂凑函数来实现个人电脑上的数位版权管理。
    首先推动安全杂凑算法出版的是已合并的数位签章标准。
    SHA杂凑函数已被做为SHACAL分组密码算法的基础。

    1. + (NSData *)sha1WithData:(NSData *)hashData
    2. {
    3. unsigned char *digest;
    4. digest = malloc(CC_SHA1_DIGEST_LENGTH);
    5. CC_SHA1([hashData bytes], (CC_LONG)[hashData length], digest);
    6. NSData *sha1Data = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
    7. free(digest);
    8. return sha1Data;
    9. }

    HMAC

    HMAC Hash-based Message Authentication Code, 哈希消息认证码.

  • HMAC是相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个和一个消息为输入,生成一个消息摘要作为输出。就是所谓的加盐 !

  • 运算作用定义HMAC需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个**K。我们用B来表示数据块的字节数。(以上所提到的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字节数(MD5中L=16,SHA-1中L=20)。鉴别的长度可以是小于等于数据块字长的任何正整数值。应用程序中使用的长度若是比B大,则首先用使用散列函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的。一般情况下,推荐的最小[](https://link.jianshu.com/?t=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E5%25AF%2586%25E9%2592%25A5)K长度是L个[字节](https://link.jianshu.com/?t=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E5%25AD%2597%25E8%258A%2582)。
    • 验证TPM接受的授权数据和认证数据;
    • 确认TPM接受到的命令请求是已授权的请求,并且,命令在传送的过程中没有被改动过。
  • 算法表示

    算法公式 : HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M)) [1]
    H 代表所采用的HASH算法(如SHA-256)
    K 代表认证密码
    Ko 代表HASH算法的密文
    M 代表一个消息输入
    B 代表H中所处理的块大小,这个大小是处理块大小,而不是输出hash的大小
    如,SHA-1和SHA-256 B = 64
    SHA-384和SHA-512 B = 128
    L 表示hash的大小
    Opad 用0x5c重复B次
    Ipad 用0x36重复B次
    Apad 用0x878FE1F3重复(L/4)次

  • HMAC的应用
    hmac主要应用在身份验证中,它的使用方法是这样的:在这个过程中,可能遭到安全攻击的是服务器发送的随机值和用户发送的hmac结果,而对于截获了这两个值的黑客而言这两个值是没有意义的,绝无获取用户密码的可能性,随机值的引入使hmac只在当前会话中有效,大大增强了安全性和实用性。大多数的语言都实现了hmac算法,比如php的mhash、python的hmac.py、java的MessageDigest类,在web验证中使用hmac也是可行的,用js进行md5运算的速度也是比较快的。

    • (1) 客户端发出登录请求(假设是浏览器的GET请求)
    • (2) 服务器返回一个随机值,并在会话中记录这个随机值
    • (3) 客户端将该随机值作为**,用户密码进行hmac运算,然后提交给服务器
    • (4) 服务器读取用户数据库中的用户密码和步骤2中发送的随机值做与客户端一样的hmac运算,然后与用户发送的结果比较,如果结果一致则验证用户合法.

      认证流程
      (1) 先由客户端向服务器发出一个验证请求。
      (2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端。
      (3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的**进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
      (4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户**进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户

  1. + (NSData *)hmacSha1WithData:(NSData *)hashData hmacKey:(NSString *)key
  2. {
  3. unsigned char *digest;
  4. digest = malloc(CC_SHA1_DIGEST_LENGTH);
  5. const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
  6. CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), [hashData bytes], [hashData length], digest);
  7. NSData *hmacData = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
  8. free(digest);
  9. cKey = nil;
  10. return hmacData;
  11. }

对称加密算法

  • 类型: DES(数据加密标准), 3DES, AES(高级密码标准)
  • ECB(Electronic Codebook,电码本)模式是分组密码的一种最基本的工作模式。在该模式下,待处理信息被分为大小合适的分组,然后分别对每一分组独立进行加密或解密处理。
    ECB模式作为一种基本工作模式,具有操作简单,易于实现的特点。同时由于其分组的独立性,利于实现并行处理,并且能很好地防止误差传播。 另一方面由于所有分组的加密方式一致,明文中的重复内容会在密文中有所体现,因此难以抵抗统计分析攻击。 因此,ECB模式一般只适用于小数据量的字符信息的安全性保护,例如**保护。
  • CBC(Cipher Block Chaining)/密文分组链接方式.
    它的实现机制使加密的各段数据之间有了联系。其实现的机理如下:

    加密步骤如下:
    1)首先将数据按照8个字节一组进行分组得到D1D2……Dn(若数据不是8的整数倍,用指定的PADDING数据补位)
    2)第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)
    3)第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2
    4)之后的数据以此类推,得到Cn
    5)按顺序连为C1C2C3……Cn即为加密结果。 解密是加密的逆过程,步骤如下:
    1)首先将数据按照8个字节一组进行分组得到C1C2C3……Cn
    2)将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:一定是先解密再异或)
    3)将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D2
    4)之后依此类推,得到Dn
    5)按顺序连为D1D2D3……Dn即为解密结果。

这里注意一点,解密的结果并不一定是我们原来的加密数据,可能还含有你补得位,一定要把补位去掉才是你的原来的数据。

  • CFB
  • OFB