当前位置: 首页 > 知识库问答 >
问题:

AES CBC 128位加密-OpenSSL

阎令
2023-03-14

我只需要通过代码加密AES CBC 128位模式的字符串。我使用openssl库完成了这项工作,但无法获得正确的输出。

到目前为止,我已经完成了。

#include <cstring>
#include <iostream>
#include <openssl/evp.h>
#include <openssl/aes.h>

using namespace std;

int main(){
    string in = "abcdefgh";
    unsigned char input[in.length()];
    strcpy((char*) input, in.c_str());
    string key ="123456781234456678";
    unsigned char key_aes[key.length()];
    strcpy((char*) key_aes, key.c_str());
    cout<<input<<endl;
    cout<<key_aes<<endl;
    unsigned char iv[key.length()];
    strcpy((char*) iv, key.c_str());
    cout<<iv<<endl;
    const size_t encslength = ((in.length()/AES_BLOCK_SIZE)) * AES_BLOCK_SIZE;
    unsigned char out[encslength];
    memset(out, 0, sizeof(out));
    AES_KEY enc_key;
    AES_set_encrypt_key(key_aes,128, &enc_key);
    AES_cbc_encrypt(input,out,in.length(),&enc_key,iv,1);

    for(int i=0;out[i]!='\0';i++){

    printf("%X ",out[i]);

    }

    return 0;
}

我的十六进制输出是:B0 15 751B50 80 D4 FF 81 68 146BB71B95 99 37 38

但正确的输出是:< code > 73 5C 04 F9 57 18 43 7C EE 68 27 59 2B 41 A8 DA (通过在线网站和c#代码验证)。

帮帮我。。这个问题已经在这里回答了,但它也不适合我。提前致谢。

共有1个答案

能业
2023-03-14
string in = "abcdefgh";
unsigned char input[in.length()];
strcpy((char*) input, in.c_str());

strcpy 函数用于 C 样式的字符串。这意味着您需要使输入变大,才能将“abcefgh”作为C样式的字符串保存。但是,您使它一个字节太小,因为 C 样式字符串的末尾有一个 nul 终止符。

string key ="123456781234456678";
unsigned char key_aes[key.length()];
strcpy((char*) key_aes, key.c_str());

又是同样的事情。为什么你从C风格的字符串构造C字符串只是为了将它们转换回C风格的字符串?!

然后,将C样式字符串传递给< code>AES_set_encrypt。但是< code>AES_set_encrypt函数不接受C风格的字符串作为输入。那么你为什么要创建这些C风格的字符串呢?

 类似资料:
  • 本文向大家介绍python实现移位加密和解密,包括了python实现移位加密和解密的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python实现移位加密和解密的具体代码,供大家参考,具体内容如下 代码很简单,就不多做解释啦。主要思路是将字符串转为Ascii码,将大小写字母分别移位密钥表示的位数,然后转回字符串。需要注意的是,当秘钥大于26的时候,我使用循环将其不断减去26,直到密钥

  • 因此,这种特殊的异常非常常见,但我的问题与通常被问到的略有不同。 我有一个AES解密和加密函数,定义如下: 现在,如果我像这样执行单个解密: 字节数组输出很好。而如果我执行双重加密/解密: 我得到了著名的<code>javax.crypto。BadPaddingException:给定的最终块未正确填充异常。请注意,和只是整数(假设它们都是0)。目前,IVBytes只是一个大小为16的空字节数组,

  • 问题内容: 我需要实现256位AES加密,但是我在网上找到的所有示例都使用“ KeyGenerator”来生成256位密钥,但是我想使用自己的密码。如何创建自己的密钥?我尝试将其填充到256位,但是随后出现错误消息,提示密钥太长。我确实安装了无限管辖权补丁,所以那不是问题:) 就是 KeyGenerator看起来像这样… 从这里获取的代码 编辑 我实际上是将密码填充到256个字节而不是位,这太长了

  • 1.我有java函数,它加密xml文件并返回加密的字符串。 2.我有c#函数,它可以解密由java函数加密的消息。 Java加密功能运行良好。但问题是C函数, 当我解密时,会得到下面的错误消息 我使用下面的参考搜索解决方案 Java中的AES加密和C#中的解密 C#/Java|AES256加密/解密 C#和Java中的加密/解密 但我仍然面临同样的错误。谁能给我提个建议吗。 我只是改变我的C#加密

  • 问题内容: 1.我有java函数来加密xml文件并返回加密的字符串。 2.我有c#函数可以解密通过java函数加密的消息。 Java加密功能运行良好。但是问题是C#函数, 当我解密时出现以下错误消息 我通过使用下面的参考来搜索解决方案 Java中的AES加密和C#中的解密 C#/ Java | AES256加密/解密 C#和Java中的加密/解密 但我仍然遇到同样的错误。有人可以给我建议吗? 更新

  • 问题内容: 如何基于Java 256位AES密码的加密? 问题答案: 与带外接收者共享和salt 所选择的 - 8个字节,这是个好习惯,不需要保密)。然后从此信息中得出一个好的密钥: 幻数(可以在某处定义为常数)65536和256分别是密钥派生迭代计数和密钥大小。 迭代密钥派生功能需要大量的计算工作,并且可以防止攻击者快速尝试许多不同的密码。可以根据可用的计算资源来更改迭代次数。 密钥大小可以减少