我在 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;
}
我的例子:
輸入十六進制:0x35313030
十六進制密鑰:0x2B7E151628AED2A6ABF7158809CF4F3C
輸出十六進制:0x2ba87a539758d476bb666bb525d14dbc
該站點已針對其他站點進行了測驗,并在 aes 硬體加速微控制器中實作了:
輸出十六進制:0xb13278c7f7413d515c549f4042a5de8c
如果我輸入這個:5100510051005100 那么他們都同意。
我必須介紹我自己的 PKCS#7 填充嗎?如果是這樣,有人可以指出我的實作嗎?
我試圖避免使用 EVP,因為我只會使用這種特定的加密方法和密碼。
謝謝
uj5u.com熱心網友回復:
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};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/417151.html
標籤:
上一篇:宏中看似毫無意義的操作
下一篇:是否有任何結構的通用鏈表功能
