Encryption Algorithm

AES

AES(Advanced Encryption Standard),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES。其密钥长度则可以是128,192或256比特。

  1. SubBytes:通过一个非线性的替换函数,用查找表(S-Box)的方式把每个字节替换成对应的字节。
  2. ShiftRows:将矩阵中的每个横列进行循环式移位。
  3. MixColumns:每一列的四个字节通过线性变换互相结合得到新的4字节值.
  4. AddRoundKey:将输入与轮密钥进行XOR。

以上就是AES加密中的一轮,不同密钥长度进行的轮数不同,128位10轮,192位12轮,256位14轮。

下面具体分析每一步

SubBytes

从一张拥有256个值的替换表(S-Box)中找出对应的值替换。S-Box是固定的,查找公式也是固定。具体可参见Rijndael S-box。用此步骤混淆了输入内容。

ShiftRows

上一步处理后将16个字节分为4组,每组4字节。以字节位单位进行乱序处理,这种打乱是有规律的。如上图中输入第一组第一个字节移动到输出第一组第一个字节,输入第一组第二个字节移动到输入第二组第二个字节,输入第一组第三个字节移动到输出第三组第三个字节。

MixColumns

可以理解为采用固定的公式,将每组4个字节做运算得出另外4个字节。具体可参见Rijndael mix columns

AddRoundKey

与轮密钥做异或。

轮密钥

轮密钥是通过密钥编排得到:将原始输入的密钥(128位、192位、256位)作为输入,得到子密钥。

RSA

RSA加密算法是一种非对称加密算法,是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。

RSA基于一个数学难题:

对两个质数相乘容易,而将其合数分解很难的这个特点进行的加密算法。 n=p1*p2,已知p1、p2求n简单,已知n求p1、p2困难。

例如很快就能算出53*61=3233, 但已知3233算出53和61恐怕得一会。目前已经算出最长RSA密钥长度为768位,目前使用的密钥长度一般为1024或2048位。

密钥生成

RSA密钥由一对公私钥组成,这对密钥如何生成,里头都包含什么?密钥生成过程:

  1. 随机选择两个不相等的质数p和q,N = pq
  2. φ(n) = (p-1)(q-1)
  3. 随机选择一个整数E,条件是1< E < φ(n),且E与φ(n) 互质
  4. ED MOD φ(n) = 1 (扩展欧几里得算法)
  5. 将N和E封装成公钥,N和D封装成私钥
公钥 E 和 N
私钥 D 和 N
加密 密文=明文^E % N
解密 明文=密文^D % N

假设攻击者获取到公钥和密文,明文=密文^D % N。N=pq,由于大整数因数分解很难,所以攻击者无法获取到pq,同理也无法获取到D,如果有一天找到有效的方法计算出N=pq,那么RSA算法就被破解了。

数字证书

  • 公钥加密,私钥解密——用于加密信息

    如果你想把某个消息秘密的发给某人,那你就可以用他的公钥加密。因为只有他知道他的私钥,所以这消息也就只有他本人能解开,于是你就达到了你的目的。

  • 私钥加密,公钥解密——用于数字签名

    严格来说,这里说的私钥加密是用私钥对摘要进行加密,接收方可以用公钥解密,解密成功则可验证信息的发送者是私钥的拥有人。因为公钥是公开的,所以起不了保密信息的作用。

    如果你想发布一个公告,需要一个手段来证明这确实是你本人发的,而不是其他人冒名顶替的。那你可以在你的公告开头或者结尾附上一段用你的私钥加密的内容,那所有其他人都可以用你的公钥来解密,看看解出来的内容是不是相符的。如果是的话,那就说明这公告确实是你发的—因为只有你的公钥才能解开你的私钥加密的内容,而其他人是拿不到你的私钥的。

    但这仅仅做到了数字签名的第一部分:证明这消息是你发的。数字签名还有第二部分:证明这消息内容确实是完整的—也就是没有经过任何形式的篡改(包括替换、缺少、新增)。

    要做到数字签名的第二部分,需要做的是:把你公告的原文做一次哈希(md5或者sha1都行),然后用你的私钥加密这段哈希作为签名,并一起公布出去。当别人收到你的公告时,他可以用你的公钥解密你的签名,如果解密成功,并且解密出来的哈希值确实和你的公告原文一致,那么他就证明了两点:这消息确实是你发的,而且内容是完整的。

  • 对公钥进行认证——数字证书

    究竟什么叫认证,说白了,就是对公钥做签名,

    黑客可以替换你的公钥,然后用他的私钥做数字签名给你发信息,而你用黑客伪造的公钥能成功验证,会让你误认为消息来源没变。

    这种情况下需要CA(证书中心certificate authority)对公钥进行认证。证书中心用自己的私钥,对信息发送者的公钥和一些相关信息一起加密,生成”数字证书”(Digital Certificate)。

参考文献

https://l2x.gitbooks.io/understanding-cryptography/content/docs/chapter-1/aes.html
https://l2x.gitbooks.io/understanding-cryptography/content/docs/chapter-3/rsa.html
https://blog.csdn.net/alimingh/article/details/105581656
https://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html