首页
社区
课程
招聘
[原创]关于openssl库与shell加解密不一致问题与使用密码加密的解密方法
发表于: 2016-5-23 17:40 6024

[原创]关于openssl库与shell加解密不一致问题与使用密码加密的解密方法

2016-5-23 17:40
6024
记录自己的点滴。。。
我也是第一次正试的用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 去对密文后半段解密即可。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 231
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶自己
2016-5-24 09:56
0
游客
登录 | 注册 方可回帖
返回
//