openssl之aes对称加密

AES:密码学中的高级加密标准(Advanced Encryption Standard,AES),又称 Rijndael加密法。

 

对称加密:用同一个密码  加密/解密  文件。

 

使用openssl中的两函数加密解密  (默认只能加密16字节)

AES_set_encrypt_key(unsigned char*)key, int, &AES_KEY)  --  加密密钥

AES_set_decrypt_key(unsigned char*)key, int, &AES_KEY)  --  解密密钥

AES_cbc_encrypt(unsigned char*)str_in, (unsigned char*)out, int len, &AES_KE Y, unsigned char*,  AES_DECRYPT)

复制代码
#include "openssl/aes.h"

unsigned char key[AES_BLOCK_SIZE];
unsigned char iv[AES_BLOCK_SIZE];

#define AES_BITS 10240
#define MSG_LEN 10240

/**********************************************************
函数名:getlen
参数:char *result        --字符串地址
返回值:int                --字符串长度
说明:                    --获取字符串长度
***********************************************************/
int getlen(char *result){
    int i = 0;
    while (result[i] != '\0'){
        i++;
    }
    return i;
}
复制代码

 

加密:

复制代码
/**********************************************************
函数名:aes_encrypt
参数:const char* str_in        --输入字符
参数:unsigned char* key        --key
参数:unsigned char* out        --输出字符
返回值:int                      --0失败  1成功
说明:加密 
***********************************************************/
int aes_encrypt(char* str_in, char* key, char* out)
{
    if (!str_in || !key || !out) return 0;

    //加密的初始化向量
    unsigned char iv[AES_BLOCK_SIZE];

    //16位密码
    char tmpIV[] = "0123456789abcdef";
    for (int i = 0; i < 16; ++i)
        iv[i] = tmpIV[i];
    
    AES_KEY aes;
    if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)
    {
        return 0;
    }

    int len = getlen(str_in);

    AES_cbc_encrypt((unsigned char*)str_in, (unsigned char*)out, len, &aes, iv, AES_ENCRYPT);
    return 1;
}
复制代码

 

解密:

复制代码
/**********************************************************
函数名:aes_decrypt
参数:const char* str_in        --输入
参数:unsigned char* key        --key
参数:unsigned char* out        --输出
返回值:int                  --0失败  1成功
说明:                --解密
***********************************************************/
int aes_decrypt(char* str_in, char* key, char* out)
{
    if (!str_in || !key || !out) return 0;
    unsigned char iv[AES_BLOCK_SIZE];//加密的初始化向量
    char tmpIV[] = "0123456789abcdef";
    for (int i = 0; i < 16; ++i)
        iv[i] = tmpIV[i];
   AES_KEY aes;
if (AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0) { return 0; } int len = getlen(str_in); AES_cbc_encrypt((unsigned char*)str_in, (unsigned char*)out, len, &aes, iv, AES_DECRYPT); return 1; }
复制代码

 

 

问题:每次只能加密16个字节

查看源码:

 

 

 

 

posted @   osbreak  阅读(6438)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示