免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10663 | 回复: 4
打印 上一主题 下一主题

[函数] 请教一个openssl中aes cbc函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-12 10:00 |只看该作者 |倒序浏览
下面是我从openssl-fips-1.1.1中找到的crypto/aes/aes_cbc.c ,aes 中cbc加密过程是要加如一个初始化向量(参数中的ivec),同时解密的过程也用到了这个ivec,问题是为什么他的加密过程会有一个

“memcpy(ivec,iv,AES_BLOCK_SIZE);”
这样不仅没有作用,而且把ivec中的内容也破坏了,使他在解密过程中不能用了,如果我理解的不正确,谁能告诉我这个函数加密和解密是怎么使用的?



  1. void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
  2.                      const unsigned long length, const AES_KEY *key,
  3.                      unsigned char *ivec, const int enc) {

  4.         unsigned long n;
  5.         unsigned long len = length;
  6.         unsigned char tmp[AES_BLOCK_SIZE];
  7.         const unsigned char *iv = ivec;

  8.         assert(in && out && key && ivec);
  9.         assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc));

  10.         if (AES_ENCRYPT == enc) {
  11.                 while (len >= AES_BLOCK_SIZE) {
  12.                         for(n=0; n < AES_BLOCK_SIZE; ++n)
  13.                                 out[n] = in[n] ^ iv[n];
  14.                         AES_encrypt(out, out, key);
  15.                         iv = out;
  16.                         len -= AES_BLOCK_SIZE;
  17.                         in += AES_BLOCK_SIZE;
  18.                         out += AES_BLOCK_SIZE;
  19.                 }
  20.                 if (len) {
  21.                         for(n=0; n < len; ++n)
  22.                                 out[n] = in[n] ^ iv[n];
  23.                         for(n=len; n < AES_BLOCK_SIZE; ++n)
  24.                                 out[n] = iv[n];
  25.                         AES_encrypt(out, out, key);
  26.                         iv = out;
  27.                 }
  28.                 memcpy(ivec,iv,AES_BLOCK_SIZE);
  29.         } else if (in != out) {
  30.                 while (len >= AES_BLOCK_SIZE) {
  31.                         AES_decrypt(in, out, key);
  32.                         for(n=0; n < AES_BLOCK_SIZE; ++n)
  33.                                 out[n] ^= iv[n];
  34.                         iv = in;
  35.                         len -= AES_BLOCK_SIZE;
  36.                         in  += AES_BLOCK_SIZE;
  37.                         out += AES_BLOCK_SIZE;
  38.                 }
  39.                 if (len) {
  40.                         AES_decrypt(in,tmp,key);
  41.                         for(n=0; n < len; ++n)
  42.                                 out[n] = tmp[n] ^ iv[n];
  43.                         iv = in;
  44.                 }
  45.                 memcpy(ivec,iv,AES_BLOCK_SIZE);
  46.         } else {
  47.                 while (len >= AES_BLOCK_SIZE) {
  48.                         memcpy(tmp, in, AES_BLOCK_SIZE);
  49.                         AES_decrypt(in, out, key);
  50.                         for(n=0; n < AES_BLOCK_SIZE; ++n)
  51.                                 out[n] ^= ivec[n];
  52.                         memcpy(ivec, tmp, AES_BLOCK_SIZE);
  53.                         len -= AES_BLOCK_SIZE;
  54.                         in += AES_BLOCK_SIZE;
  55.                         out += AES_BLOCK_SIZE;
  56.                 }
  57.                 if (len) {
  58.                         memcpy(tmp, in, AES_BLOCK_SIZE);
  59.                         AES_decrypt(tmp, out, key);
  60.                         for(n=0; n < len; ++n)
  61.                                 out[n] ^= ivec[n];
  62.                         for(n=len; n < AES_BLOCK_SIZE; ++n)
  63.                                 out[n] = tmp[n];
  64.                         memcpy(ivec, tmp, AES_BLOCK_SIZE);
  65.                 }
  66.         }
  67. }


复制代码

论坛徽章:
0
2 [报告]
发表于 2007-06-12 19:03 |只看该作者
顶起

论坛徽章:
0
3 [报告]
发表于 2007-06-12 19:15 |只看该作者
ivec[] 必须可写。每一次迭代都会修改 ivec[] 的数据,为下一次迭代做准备,这是 CBC 的特点。
解密前应当重新设置 ivec[],而不是直接利用原来的值——那是为下一次迭代做准备的 ivec[]

论坛徽章:
0
4 [报告]
发表于 2007-06-13 22:31 |只看该作者
thx,我也看到了他的调用方法,不过这个函数一次可以处理n个16字节的数据,所以我当时迷惑了,呵呵

论坛徽章:
0
5 [报告]
发表于 2011-09-13 23:15 |只看该作者
3楼正解。你可以查一下WIKI,有关于AES算法的具体解释。
所以,在解密前必须要重新设置该ivec.
每次处理16字节,是因为AES算法本身是block cipher,按照块方式处理的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP