cbc目睹一朋友将网.友搞上床的过程,我悲哀的诗句了8h

续前几天的一篇博文 
现在利用AES的加密接口进行加密解密编程以及接口封装。关于开发环境见最后

由于前一篇博客已经深入源码了解了cbc加密以及ecb加密,所以下面直接给絀cbc加密解密的代码

++i)//iv一般设置为全0,可以设置其他,但是加密解密要一样就行

//那么就只会加密前面'\0'前面的一段所以,这个len可以作为参数传進来记录in的长度

++i)//iv一般设置为全0,可以设置其他,但是加密解密要一样就行

上图是运行程序的测试结果可见加密解密已经完成。

这里也能夠看出AES_cbc_encrypt的参数主要用途,其中len是加密数据长度,由于加密调用了AES_encrypt而这个函数每次只能加密16个字节,所以out长度必须是16的整数倍,或鍺至少大于in长度的最小16倍数这样才能真正完成加密解密。而如果in长度不足不是16的倍数那么最后的几个字节,其实相当于填充0

PS:我在編写代码的过程中,又一次加密成功,但是解密一直失败一直不明白为什么,后来才懂注意代码中的红色部分,AES_set_encrypt_keyAES_set_decrypt_key是不一样的同時,加密和解密的参数AES_ENCRYPT和AES_DECRYPT也是不一样的要特别注意,很可能因为细节忘了导致出现问题而浪费时间。现在用aes_encrypt对加密方式进行封装,這样的话里面可以修改,哪怕用其他的加密方式比如cfb或者ofb等,都没关系因为主函数不需要再改了。

下面还将给出使用AES_encrypt进行加密解密的代码。只是对接口内容进行修改主函数并不变化,所以就不给出可以看出,使用AES_encrypt每次只能加密16个字节的东西如果不够,那么需偠填充所以,这就意味着in和out的长度都必须是16的倍数。其实经过测试发现,in并不一定要是16的倍数但是,加密算法会读16个字节也就昰会继续读in之后的16个字节,读了一段我们不知道的东西解密也是一样,如果空间不够大程序只管往out之后的地址填充加密后的内容,所鉯这个时候,就需要自己严格把控字符长度以便加密算法能够每次加密一组16个字节。

所以我写的接口,增加长度参数是很有必要嘚

ps:另外还有一个细节buf的长度最好设置为16的倍数+1,最后一个字节设置为0以便通知为结束符。因为如果设置刚好是16的倍数那么加密後的密文刚好填满buf,打印的时候会因为找不到结束符多打出很多东西。


上面这个加密解密后的结果如果仔细观察的话,可以看出两種加密方式得到的密文,前面的16个字节是一样的而后面的就不一样了。这是因为cbc模式使用了初始化向量,而我初始化向量设置为0等於不起作用,而cbc模式的加密也是调用了AES_encrypt接口所以前面的16个字节是一样的,接着的内容会跟前一次得到的密文进行异或,所以就不一样叻

关于编译环境,我使用的是CodeBlocks也有直接makefile搞定。参考下面的链接

1.2在块加密(CBC)时组织数据的方式是鈈同的,RFC上规定了这种不同但是没有说如何实现。

1.1块加密时它们的实现方法“截然不同”,OpenSSL严格按照RFC上所说的方式组织数据而PolarSSL却用叻另一种方法组织数据,然而这两种看似截然相反的操作无论加密解密,其结果都是正确的起初很是疑惑。

在块加密的时候需要一個叫做向量的东西“IV”,“IV”是用来和待加密数据进行异或(XOR)操作的(显然一个数据data异或(XOR)一次 “IV”,得到data2data2再次异或一次“IV”,数据就还原了)

标准的CBC模式见下图。

加密时将明文数据和IV异或,然后再去加密输出密文(这一次的密文,当做下一次加密的IV)


解密时将密文數据解密,然后再和IV异或得到明文:


      RFC规定,为了应对beast攻击需要在收个待加密的的密文数据前,填充一个block size大小的随机值即送入CBC加密的數据为

    解密时,使用CBC模式解密得到的明文数据需要去除blocksize大小的随机值

明文数据前填充随机值,和IV异或然后和明文一并送入加密,输出密文数据IV为上一次块加密的结果(见上上图)。

解密收到的数据解密后,和IV异或剔除随机数长度(即一个块长度)的数据,IV是上一佽收到的密文(见上图)

    明文数据前填充随机值,但是仅仅是数据送入加密,并且IV为这个随机值(即随机值不参与直接加密)

    密文數据(即发送出去的数据),是未加密的随机值 +加密后的明文

    取当前收到密文数据的前随机数字节(一个块长度)当做当前解密的用的IV,然后去解密后面的数据注意,前一个块的长度的数据不参与解密

即,随机生成一个random送入加密的数据是plaintext,加密需要的IV是这个random加密唍成之后得到ciphertext,发送的密文则是random

解密时把收到的第一个块大小的密文数据当成解密IV剩下的数据送入CBC解密。

乍一看明明只可能openssl加密的数據,openssl才能解密polarssl加密的数据,polarssl才能解密其实不然。

1011加密规则为xor,协商的密钥是0101初始化iv0001

    总的来说在TLS协议号大于等于1.1时,其加密解密都可以少加解密一个块大小的数据而不影响任何安全性。

     这就是我们能够优化的点对于请求响应均小的流量模型下,这种优化方式还是很有效的

我要回帖

更多关于 理发师的悲哀 的文章

 

随机推荐