c-OpenSSL AES_ecb_encrypt填充选项



我在Visual Studio中构建了一个C项目,该项目仅使用OpenSSL使用AES128 ECB密码对输入数据进行加密。

如果我的输入是16字节,那么输出是正确的,只要比它短,我就会得到错误的输出。

#include <stdio.h>
#include <openssl/ssl.h>
#include <openssl/aes.h>
int main(void)
{
unsigned char aesKey[] = 
{
0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 
0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
};
const unsigned char aesData[] = {0x35, 0x31, 0x30, 0x30}; // results in wrong output
const unsigned char aesDataa[] = // results in correct output
{
0x35, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30 
}; 
unsigned char out[32];
AES_KEY aes_key;
AES_set_encrypt_key((const unsigned char *)aesKey, 128, &aes_key);
AES_ecb_encrypt(aesDataa, out, &aes_key, AES_ENCRYPT);
for (int i = 0; i < 33; i++)
printf("%x", out[i]);
return 1;
}

我的例子:

输入十六进制:0x33513030

六角扳手:0x2B7E151628AED2A6ABF715809F4F3C

输出十六进制:0x2ba87a539758d476bb666bb525d14dbc

该站点与其他站点进行了测试,并在aes硬件加速微控制器中实现:

输出十六进制:0xb13278c7f7413d515c549f4042a5de8c

如果我输入:5100510051005100,那么他们都同意。

我必须介绍我自己的PKCS#7填充吗?如果是的话,有人能给我指一下这个实现吗?

我尽量避免使用EVP,因为我只会使用这种特定的加密方法和密码。

感谢

AES 128算法需要16个字节作为输入。您的aesData数组只有4个字节长,因此这会导致AES_ecb_encrypt读取超过数组末尾,从而触发未定义的行为。

使阵列宽度为16字节:

const unsigned char aesData[16] = { 0x35, 0x31, 0x30, 0x30 }; 

这会隐式地将其余元素初始化为0,因此现在结果与链接网站的结果相匹配。

此外,你在这里有一个错误:

for (int i = 0;i < 33;i++)
printf("%x", out[i]);

它的读数超过了数组的末尾。您想要:

for (int i = 0;i < 32;i++)
printf("%x", out[i]);

此外,只有16个字节的输出数组被写入,所以您正在读取未初始化的字节。因此,将out初始化为全零:

unsigned char out[32] = {0};

最新更新