OpenSSL AES_cfb128_encrypt C++

 哲纸 发布于 2023-01-17 11:32

我试图实现一个"非常"简单的加密/解密示例.我需要一个项目,我想加密一些用户信息.我无法加密整个数据库,只能加密表中的某些字段.

除了加密之外,数据库和项目的大部分工作都有效:以下是它的简化版本:

#include 
#include 
#include 
#include 

using namespace std;

int main()
{
    /* ckey and ivec are the two 128-bits keys necessary to
       en- and recrypt your data.  Note that ckey can be
       192 or 256 bits as well
     */

    unsigned char ckey[] =  "helloworldkey";
    unsigned char ivec[] = "goodbyworldkey";

    int bytes_read;
    unsigned char indata[AES_BLOCK_SIZE];
    unsigned char outdata[AES_BLOCK_SIZE];
    unsigned char decryptdata[AES_BLOCK_SIZE];

    /* data structure that contains the key itself */
    AES_KEY keyEn;

    /* set the encryption key */
    AES_set_encrypt_key(ckey, 128, &keyEn);

    /* set where on the 128 bit encrypted block to begin encryption*/
    int num = 0;

    strcpy( (char*)indata , "Hello World" );
    bytes_read = sizeof(indata);

    AES_cfb128_encrypt(indata, outdata, bytes_read, &keyEn, ivec, &num, AES_ENCRYPT);
    cout << "original data:\t" << indata << endl;
    cout << "encrypted data:\t" << outdata << endl;

    AES_cfb128_encrypt(outdata, decryptdata, bytes_read, &keyEn, ivec, &num, AES_DECRYPT);
    cout << "input data was:\t" << decryptdata << endl;
    return 0;
}

但是"解密"数据的输出是一些随机字符,但在每次执行代码后它们都是相同的.outdata每次执行都会改变......

我试图调试并搜索解决方案,但我找不到任何解决方案来解决我的问题.
现在我的问题是,这里出了什么问题?或者我是否完全误解了所提供的功能?

1 个回答
  • 问题是AES_cfb128_encrypt修改ivec(它必须为了允许链接).您的解决方案是ivec在每次调用之前创建并初始化它的副本,AES_cfb128_encrypt如下所示:

    const char ivecstr[AES_BLOCK_SIZE] = "goodbyworldkey\0";
    unsigned char ivec[AES_BLOCK_SIZE];
    memcpy( ivec , ivecstr, AES_BLOCK_SIZE);
    

    然后memcpy在第二次打电话之前重复AES_cfb128_encrypt.

    注1:你的初始向量是一个字节太短,所以我\0在它的末尾添加了一个明确的附加.复制或传递时,应确保所有字符串的长度都正确.

    注意2:任何使用加密的代码都应该真正避免使用strcpy或未经检查长度的任何其他副本.这是一种危险.

    2023-01-17 11:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有