我在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};