OpenSSL中AES加密的用法
来源:互联网 发布:差分方程matlab编程 编辑:程序博客网 时间:2024/05/29 09:09
《OpenSSL中AES加密的用法》
作者: 游蓝海
原文链接: http://blog.csdn.net/you_lan_hai/article/details/50992719
转载请注明出处
使用API的时候,需要特别小心数据长度,我在初次使用的时候简直被弄的晕头转向,遂作此文留个备忘。一般没有指定长度的参数,默认都是16(AES_BLOCK_SIZE
)个字节。输出数据的长度一般都是16字节的倍数,否则会出现数组越界访问。
以下API中,encrypt表示加密,decrypt表示解密。
1.生成加密/解密的Key
int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
参数说明:
如果函数调用成功,返回0,否则是负数。
2.使用AES加密/解密
void AES_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);void AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);
参数说明:
AES_encrypt/AES_decrypt一次只处理16个字节。如果输入数据较长,你需要使用循环语句,每16个字节处理一次,直到所有数据处理完毕。如果数据不足16字节,可以用0填充至16字节。
3.使用AES CBC加密/解密
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, unsigned char *ivec, const int enc);
参数说明:
这个函数比AES_encrypt多了一个ivec参数,ivec的内容可以任意指定,但是加密和解密操作必须使用同样的数据。在AES_cbc_encrypt底层,实际上是每16个字节做一次处理,先和ivec做异或运算,然后调用AES_encrypt函数进行加密。
AES_cbc_encrypt在加密的过程中会修改ivec的内容,因此ivec参数不能是一个常量,而且不能在传递给加密函数后再立马传递给解密函数,必须重新赋值之后再传递给解密函数。
关于输出数据的长度
虽然输出数据缓冲区的长度必须是16字节的倍数,但是加密完成后,比输入长度多出来的输出数据是可以丢弃的。
关于输入数据的长度不必是16字节的倍数(做个备忘):
下面是AES_cbc_encrypt函数的底层实现代码
... //处理16字节倍数的数据 while (len >= 16) { for (n = 0; n < 16; ++n) out[n] = in[n] ^ iv[n]; (*block) (out, out, key); //调用AES_encrypt处理数据 iv = out; len -= 16; in += 16; out += 16; } //当数据小于16字节的时候,进入下面的循环 while (len) { for (n = 0; n < 16 && n < len; ++n) out[n] = in[n] ^ iv[n]; for (; n < 16; ++n) out[n] = iv[n]; //使用ivec补齐不足16字节的部分 (*block) (out, out, key); //调用AES_encrypt处理数据 iv = out; if (len <= 16) break; len -= 16; in += 16; out += 16; }
4结尾
其他加密函数我还没有用过,在此就不继续列举了,但是参数跟上面几个相似,弄明白上面的就不成问题。
- OpenSSL中AES加密的用法
- 使用 openssl 的AES 加密
- 利用openssl中AES加密文件
- VS中使用openssl/aes加密解密
- openssl aes 加密
- openssl之aes加密
- openssl AES加密
- openssl——aes加密
- openssl中aes、rsa算法的使用
- linux下面C 利用openssl的AES库加密,解密
- Linux下使用openssl的AES加密-ECB模式
- Linux下使用openssl的AES加密-CBC模式
- 使用openssl库进行AES算法的加密
- openSSL AES 加密引擎代码分析
- openssl与cryptoAPI交互AES加密解密
- AES加密之openssl安装(1)
- AES加密之openssl使用(2)
- openssl与cryptoAPI交互AES加密解密
- 2016-03-27
- test~~~~~~
- 《数据结构》2.10设计一个算法,删除顺序表中值为item的元素,要求算法的时间复杂度是O(n),空间复杂度是O(1)
- ARM储存器介绍
- 关于c#中获取listbox中选中项的数量和所有选项的数量
- OpenSSL中AES加密的用法
- 多线程之NSOperation
- Android M上VideoCall中Audio的管理(2016.05.27 新增CallsManager部分)
- android 获得当前进程的名字
- POJ 3280 Cheapest Palindrome(区间DP)
- EL表达式截取字符串
- STL与泛型编程<九>:迭代器相关辅助函数
- spring3 struts2 利用aop在actioin层捕获异常
- PHP为什么慢?