记录自己的点滴。。。
我也是第一次正试的用openssl加解密, 所以还望大家以后可以指点一下
1. 使用 echo "xxx" | openssl enc -e -a -aes192 -K xxxx ....与编程得出结果不同原因
首先 echo 命令默认含有\n 使用-n选项可以去除, 而aes192 是192位密钥长度的cbc模式, 并且 -K -iv 都是十六进制
2. 使用 echo -n "xxx" | openssl enc -e -a -aes192 -k xxx 与编程得出结果不同原因
-k 这个选项是传统的密码 而不是密钥
可以使用-p选项 将salt key iv三个值打印出来
这时有人就会激动了, 跑去用这个key和iv解密, 发现解不回去!!
你会发现 每运行一次命令 这三个值都会不同 那该怎么解密呢??
大家不仿看看加密不作base64时的密文, 你会发现Salted__开头的字符串, 除开字母部份, 观看16进制 它就是与-p选项打印出来的salt值一致, 也就是说 使用密码的方式会把salt值作为密文的前缀
要解密就需要使用密码和这个salt值提取出key与iv来解密。
介绍一个函数
int
EVP_BytesToKey(
const EVP_CIPHER *type,
const EVP_MD *md,
const unsigned char *salt,
const unsigned char *data,
int datal,
int count,
unsigned char *key,
unsigned char *iv
);
type : 加密算法回调函数, 不同算法和模式及密钥长度都会影响密钥与向量
md : 这里使用md5算法
salt : 就是你从密文前缀中取出的salt值
data : 这个应该取名为password也就加密是使用的密码
datal : password的字符长度
count : 默认使用1, 除了0和1 其他值都会影响key和iv
key : 输出密钥
iv : 输出向量
下面给出一个调用例子
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/evp.h>
// 从密码和salt值中提取key 与 iv
int main()
{
const EVP_CIPHER *cipher = EVP_aes_192_cbc();
const EVP_MD *dgst = NULL;
dgst = EVP_md5();
char* sptr = "\x67\x43\x0F\x39\x88\xD8\x23\x53";
char* str = "123456";
char key[1024] = {0};
char iv[1024] = {0};
printf("\n");
//dgst is MD5
//sptr is salt
//str is passwd
EVP_BytesToKey(cipher, dgst, sptr,
(unsigned char *)str, strlen(str), 1, key, iv);
int i;
for(i = 0; i < strlen(key); i++)
{
printf("%02X", (unsigned char)key[i]);
}
printf("\n");
for(i = 0; i < strlen(iv); i++)
{
printf("%02X", (unsigned char)iv[i]);
}
printf("\n");
}
这样就得出了key 与 iv 去对密文后半段解密即可。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!