在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
OpenSSL提供了AES加解密算法的API
const char *AES_options(void); AES算法状态,是所有支持或者是部分支持。 返回值:“aes(full)” 或者"aes(partial)"
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,AES_KEY *key); 设定加密用的Key; userKey: 密钥数值。 bits:密钥长度,以bit为单位。假设密钥数字是16个字节,则此參数值应为128。 key: AES_KEY对象指针; 返回值: 0 成功, -1 userkey,key为空, -2: 密钥长度不是128。192。256;
int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
设定解密用的Key; userKey: 密钥数值; bits:密钥长度,以bit为单位,假设密钥数字是16个字节。则此參数值应为128; key: AES_KEY对象指针; 返回值: 0 成功, -1 userkey。key为空。 -2: 密钥长度不是128。192,256。
void AES_encrypt(const unsigned char *in, unsigned char *out,const AES_KEY *key); AES 加密。加密单个数据块。in,out能够是同一内存区; in: 须要加密的数据; out: 加密后的数据。 key:AES 密钥。
void AES_decrypt(const unsigned char *in, unsigned char *out,const AES_KEY *key);
AES 解密。解密单个数据块,in。out能够是同一内存区; in: 须要解密的数据。 out: 解密后的数据; key:AES 密钥。
void AES_ecb_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key, const int enc); AES加密/解密单个数据块,ECB模式 in: 须要加密/解密的数据;
out: 计算后输出的数据。 key:密钥 enc: AES_ENCRYPT 代表加密, AES_DECRYPT代表解密。
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加密/解密单个数据块,CBC模式 in: 须要加密/解密的数据; out: 计算后输出的数据。
length: 数据长度 key:密钥
ivec: 初始向量 enc: AES_ENCRYPT 代表加密, AES_DECRYPT代表解密;
size_t length, const AES_KEY *key, unsigned char *ivec, int *num, const int enc); AES CFB128位模式加密/解密。输入输出数据区能够重叠。 in: 须要加密/解密的数据。 out: 计算后输出的数据; length: 数据长度; key: 密钥; ivec: 初始化向量 num: 输出參数。计算状态。多少个CFB数据块 enc: 计算模式。 加密: AES_ENCRYPT 。 解密: AES_DECRYPT void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, unsigned char *ivec, int *num, const int enc); AES CFB1位模式加密/解密。输入输出数据区能够重叠; in: 须要加密/解密的数据; out: 计算后输出的数据; length: 数据长度; key: 密钥; ivec: 初始化向量 num: 输出參数,计算状态,多少个CFB数据块 enc: 计算模式, 加密: AES_ENCRYPT , 解密: AES_DECRYPT void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, unsigned char *ivec, int *num, const int enc); AES CFB8位模式加密/解密。输入输出数据区能够重叠; in: 须要加密/解密的数据; out: 计算后输出的数据; length: 数据长度; key: 密钥; ivec: 初始化向量 num: 输出參数,计算状态,多少个CFB数据块 enc: 计算模式, 加密: AES_ENCRYPT , 解密: AES_DECRYPT void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, unsigned char *ivec, int *num); AES OFB128位模式加密/解密,输入输出数据区能够重叠; in: 须要加密/解密的数据; out: 计算后输出的数据。 length: 数据长度; key: 密钥。 ivec: 初始化向量 num: 输出參数,计算状态,多少个CFB数据块 enc: 计算模式, 加密: AES_ENCRYPT , 解密: AES_DECRYPT void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, unsigned char ivec[AES_BLOCK_SIZE], unsigned char ecount_buf[AES_BLOCK_SIZE], unsigned int *num); AES CTR128位模式加密/解密,输入输出数据区能够重叠; in: 须要加密/解密的数据。 out: 计算后输出的数据; length: 数据长度; key: 密钥。 ivec: 初始化向量 ecount_buf: 输出參加,加密的次数,在第一次调用此函数时,须要初始化为0 num: 输出參数,计算状态,多少个CFB数据块,在第一次调用此函数时,须要初始化为0 enc: 计算模式。 加密: AES_ENCRYPT , 解密: AES_DECRYPT void AES_ige_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, unsigned char *ivec, const int enc); AES 加密/解密,输入输出数据区能够重叠,初始化向量是加密数据块的2倍,加密前用前半部分做一次异或。加密后用后半部分做一次异或; in: 须要加密/解密的数据; out: 计算后输出的数据。 length: 数据长度; key: 密钥; ivec: 初始化向量 enc: 计算模式。 加密: AES_ENCRYPT , 解密: AES_DECRYPT void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, const AES_KEY *key2, const unsigned char *ivec, const int enc); AES 加密/解密。输入输出数据区能够重叠。初始化向量是加密数据块的4倍,加密前用第一部分做一次异或。加密后用第二部分做一次异或; 最后一个加密数据块,加密前用第三部分异或,加密后用第四部分异或; in: 须要加密/解密的数据; out: 计算后输出的数据; length: 数据长度。 key: 密钥。 ivec: 初始化向量 enc: 计算模式, 加密: AES_ENCRYPT , 解密: AES_DECRYPT
int AES_wrap_key(AES_KEY *key, const unsigned char *iv, 用AES算法对明文key数据加密 key: AES Key,用于加密密钥数据 iv: 初始化向量 out: 加密后的密钥数据 in: 密钥数据 inlen: 密钥数据长度 返回值: 1: 成功。 0: 失败
int AES_unwrap_key(AES_KEY *key, const unsigned char *iv,
用AES算法对明文key数据加密 key: AES Key,用于加密密钥数据 iv: 初始化向量 out: 加密后的密钥数据 in: 密钥数据 inlen: 密钥数据长度 返回值: 1: 成功, 0: 失败
C实例分析: 首先要了解AES加密是什么。以及几种加密模式的差别。之后才是编程。 详细的编程案例,在以下的链接。 openssl之aes加密(AES_cbc_encrypt 与 AES_encrypt 的编程案例)
以下这个链接有具体图解。
http://fossies.org/dox/openssl-1.0.1f/index.html (具体源代码)
http://www.cnblogs.com/adylee/archive/2007/09/14/893438.html
ECB模式
长处:
1.简单;
2.有利于并行计算。
3.误差不会被传送。
缺点:
1.不能隐藏明文的模式;
2.可能对明文进行主动攻击;
CBC模式:
长处:
1.不easy主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
缺点:
1.不利于并行计算。
2.误差传递。
3.须要初始化向量IV
CFB模式:
长处:
1.隐藏了明文模式;
2.分组password转化为流模式;
3.能够及时加密传送小于分组的数据;
缺点:
1.不利于并行计算;
2.误差传送:一个明文单元损坏影响多个单元;
3.唯一的IV;
ofb模式:
长处:
1.隐藏了明文模式;
2.分组password转化为流模式;
3.能够及时加密传送小于分组的数据;
缺点:
1.不利于并行计算;
2.对明文的主动攻击是可能的;
3.误差传送:一个明文单元损坏影响多个单元;
了解这些加密模式之后,再看openssl提供的接口就好理解了。
下面接口来自“crypto/aes/aes.h”。有openssl源代码。
//设置加密和解密器
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);
//默认的加密解密方式,參数好理解
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);
//以下这些也是经常使用的加密方式,可是參数非常多,而源代码对于參数使用介绍不多。仅仅能摸索
void AES_ecb_encrypt(const unsigned char *in, unsigned char *out,
const AES_KEY *key, const int enc);
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
size_t length, const AES_KEY *key,
unsigned char *ivec, const int enc); //參数相对复杂
void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out,
size_t length, const AES_KEY *key,
unsigned char *ivec, int *num, const int enc);
void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out,
size_t length, const AES_KEY *key,
unsigned char *ivec, int *num, const int enc);
void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out,
size_t length, const AES_KEY *key,
unsigned char *ivec, int *num, const int enc);
void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out,
size_t length, const AES_KEY *key,
unsigned char *ivec, int *num);
void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
size_t length, const AES_KEY *key,
unsigned char ivec[AES_BLOCK_SIZE],
unsigned char ecount_buf[AES_BLOCK_SIZE],
unsigned int *num);
从以下这个文件能够看出,AES_encrypt就是ecb加密的方式。而AES_set_encrypt_key和AES_encrypt,它们的实如今"crypto/aes/aes_x86core.c"和"crypto/aes/aes_core.c",也就是有两个版本号,依据平台选择。
看源代码。 调用实例:
最后给出一个链接,利用openssl的AES接口进行编程。
參考资料:
分组对称加密模式:ECB/CBC/CFB/OFB缺CTR
命令行下openssl对文件加密解密:
全部评论
专题导读
热门推荐
热门话题
阅读排行榜
|
请发表评论