首页 > 其他 > 详细

生成AES密钥对

时间:2021-06-13 00:58:44      阅读:20      评论:0      收藏:0      [点我收藏+]

OpenSSL中 AES 加解密的API:

  1. 生成加密/解密的Key

    #include <openssl/aes.h>
    # define AES_BLOCK_SIZE 16	// 明文分组的大小
    // 加密的时候调用
    // aes中的秘钥格式 AES_KEY
    // 封装加密时候使用的秘钥
    AES_KEY 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);
    
    参数名称 描述
    userkey 对称加密的秘钥-> 字符串, 长度: 16, 24, 32byte
    bites 指定秘钥的长度: 单位->bit
    key 传出参数
  2. 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);
    	参数:
    		- in: 要加密/解密的数据
    		- out: 传出参数
    			- 加密: 存储密文
    			- 解密: 存储明文
    		- length: 修改第一个参数in的长度
    			- (len = (字符串长度 + \0) % 16) == 0
                - 如果不是在函数内部会自动填充
                	- 实际长度: ((len / 16) + 1 ) * 16
            - key: 初始化之后的秘钥
            - ivec: 初始化向量, 字符串 ==> 长度和分组长度相同
    		- enc: 指定数据要解密还是解密
    			- # define AES_ENCRYPT     1 -> 加密
    			- # define AES_DECRYPT     0 -> 解密
    
    

代码示例

#include <iostream>
#include <openssl/aes.h>
#include <openssl/pem.h>
#include <string.h>

using namespace std;

void aesCBCCrypto()
{
    // 准备数据
    string data = "我是峰子";
    // 准备密钥
    //  密钥长度 16/24/32
    const char* key = "1234567887654321"; 
    // 初始化密钥
    // 每组8个字节所以是128
    AES_KEY encKey;
    AES_set_encrypt_key((const unsigned char*)key,128,&encKey);
    // 加密
    // 计算长度
    int len = data.size();
    int length = 0;
    if(len % 16 != 0)
    {   
        length = ((len/16)+1)*16;
    }else{
        length = len;
    }   
    unsigned char* out = new unsigned char[length];
    unsigned char ivec[AES_BLOCK_SIZE];
    memset(ivec,9,sizeof(ivec));
    // 密文存储在out中
    AES_cbc_encrypt((const unsigned char*)data.data(),out,length,&encKey,ivec,AES_ENCRYPT
    // 解密
    AES_KEY decKey;
    AES_set_decrypt_key((const unsigned char*)key,128,&decKey);
    unsigned char* res = new unsigned char[length];
    memset(ivec,9,sizeof(ivec));                                                         
    AES_cbc_encrypt(out,res,length,&decKey,ivec,AES_DECRYPT);
    // 打印
    cout<<res<<endl;
    delete [] out;
    delete [] res;
}
int main()
{
    aesCBCCrypto();
    return 0;
}

生成AES密钥对

原文:https://www.cnblogs.com/lodger47/p/14878644.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!