对称加密
对称加密又叫传统密码算法,就是加密和解密使用同一个密钥。潜伏里面孙红雷通过电台收听到一堆数字,然后拿出一本书(密码本)比对,找到数字对应的汉字,就明白上级传达的是什么指令了。而军统的监听台没有密码本,只看到一堆没有意义的数字。
用数学公示表示就是:
▲加密:Ek(P) = C
▲解密: Dk(C) = P
- E 表示加密算法
- D 表示解密算法
- P表示明文
- C表示密文。
留意以后会经常看到。常见的对称加密方法有DES
、3DES
、Blowfish
、RC2
、AES
以及国密的SM4
。
什么是国密啊?其实它的全称叫“国家商用密码”,是为了保障商用密码安全,国家商用密码管理办公室制定了一系列密码标准。
非对称加密
对称加密又快又方便,但是有个很大的坑 —— 密码本容易被偷或被破解。从红军到二战,胜利的最大贡献其实就是破解密码。红军在数十倍的包围圈里面自由跳来跳去,那两台大功率电台功劳莫大。
怎么能够防止这种情况呢?1977年三位数学家Rivest、Shamir 和 Adleman 设计了一种算法(所以叫RSA
),把密钥分成两个,一个自己持有叫私钥(Private Key),另一个发给对方,还可以公开,叫公钥(Public Key),实现用公钥加密的数据只能用私钥解开:
▲加密: E公钥(P) = C
▲解密: D私钥(C) = P
这下就不用再头痛如何把密码本给对方或被破解了,私钥由自己保管,敌方拦截到密文也没有办法。
除了RSA
之外,常见的非对称算法还有Elgamal
、背包算法
、Rabin
、D-H
、ECC(椭圆曲线加密算法)
以及国家商用密码SM2
算法。
非对称算法核心原理其实就是设计一个数学难题,用公钥和明文推导密文很容易,但是很难根据公钥、明文和密文推导私钥。
RSA是基于大整数因式分解难度,也就是两个质数相乘很容易,但是找一个大数的质因子非常困难,理论上破解RSA-2048(2048-bit)
的密钥可能需要耗费10亿年的时间。
这儿说点题外话:强烈不建议使用RSA,原因如下:
容易被破解:RSA-768可以在3个小时内破解,1024在理论上100小时内也可以破解。所以使用RSA,长度起步要2048。但是数学家彼得·舒尔研究了一个针对整数分解问题的量子算法 (舒尔算法),理论上破解2048的RSA在100秒之内(好在量子机还未投入使用)。
慢:密钥长度加到2048可以提升安全,但是计算过慢。
数字签名
有了非对称加密,数字签名就很容易理解了。
乙方收到甲方传过来的一串信息,怎么能够确定确实是甲方而不是有人伪造呢?
我们把非对称加密反过来做就可以了,因为只有甲方自己才持有一份秘密的私钥,他拿这个私钥对数据进行加密得到密文 C = EA私(M)
,乙方持有甲方的公钥,解密明文P = DA公(C)
,如果能够解密成功就证明信息确实是甲方所发。
不过通常不需要对发送信息的整个内容都加密,那样太慢。只需要计算一个信息的唯一信息摘要并对信息摘要加密解密即可,下面就会讲到数据摘要算法(俗称HASH算法
),这也是数字签名的算法名称,很多时候是摘要算法+非对称算法
,例如SHA1RSA
, SHA256RSA
等。
摘要算法
俗称HASH算法
,学名杂凑算法,也就是从明文P
生成较短的固定长度的杂凑值,保证不同的输入产生的输出是唯一的(重复几率非常非常小)。这样就可以广泛用于完整性检查、数字签名等场景。
常见的摘要算法有MD5
、RIPEMD
、SHA
和国密的SM3
。【MD5不建议使用,已经被爆】。