gpt4 book ai didi

c - 使用 WolfCrypt 的 ECB 模式下的 AES

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:15 25 4
gpt4 key购买 nike

我在桌面软件中使用 OpenSSL,在嵌入式软件中使用 WolfCrypt(也是开源的)。对于这个项目,我必须在 ECB 模式下使用 AES,尽管我知道 ECB 不是 AES 最安全的操作模式。根据此线程(断开的链接),WolfCrypt 支持 ECB 模式,即使没有正确记录。

我可以在 OpenSSL 中毫无问题地编码和解码数据,但在 WolfCrypt 中却做不到。似乎 wolfCrypt 在 ECB 模式下有 192 位和 256 位长的 key (但它似乎适用于 128 位长的 key )。我使用以下代码注意到了这种行为。此代码加密一大块数据,对其进行解密并将结果与​​原始数据进行比较。如果数据匹配,则会显示一条成功消息。似乎只有 128 位长的 key 才能产生正确的结果。

我使用 WolfSSL 3.8.0 在 VS 2013 (Windows 7) 中测试了这段代码。

我是不是做错了什么,还是 WolfCrypt 真的有问题?

#include <stdlib.h>
#include <stdio.h>

#include <wolfssl/wolfcrypt/aes.h>

#define POINTER_TO_INDEX(v, i) ( &( ( v )[ i ] ) )
#define BITS_TO_BYTES(x) ( ( x ) / 8 )

#define MAX_KEY_BITS ( 256 )
#define MAX_KEY_LENGTH BITS_TO_BYTES( MAX_KEY_BITS )
#define DATA_LENGTH ( 768 )

byte aes_key[MAX_KEY_LENGTH];
byte aes_iv[MAX_KEY_LENGTH];

byte original_data[DATA_LENGTH];
byte encrypted_data[DATA_LENGTH];
byte decrypted_data[DATA_LENGTH];

Aes aes_encrypt;
Aes aes_decrypt;

void wait_before_exit(void)
{
printf("\nPress 'q' to quit.\n");
while (1)
{
char c = getchar();
if (c == 'q' || c == 'Q') return;
}
}

int main(int argc, char* argv[])
{
int actual_key_length = 0;
printf("Choose key length:\n ( A ) 128 bits\n ( B ) 192 bits\n ( C ) 256 bits\n");
while (actual_key_length == 0)
{
char c = getchar();
switch (c)
{
case 'A': case 'a':
actual_key_length = BITS_TO_BYTES(128);
break;
case 'B': case 'b':
actual_key_length = BITS_TO_BYTES(192);
break;
case 'C': case 'c':
actual_key_length = BITS_TO_BYTES(256);
break;
}
}

// generate aes_key and aes_iv.
for (int i = 0; i < actual_key_length; i++)
{
aes_key[i] = (byte)rand();
aes_iv[i] = (byte)rand();
}

// initialize AES engines.
if (wc_AesSetKeyDirect(&aes_encrypt, (const byte *)aes_key, actual_key_length, (const byte *)aes_iv, AES_ENCRYPTION))
{
printf("Cannot create AES engine for encryption.\n");
wait_before_exit();
return 0;
}
if (wc_AesSetKeyDirect(&aes_decrypt, (const byte *)aes_key, actual_key_length, (const byte *)aes_iv, AES_DECRYPTION))
{
printf("Cannot create AES engine for decryption.\n");
wait_before_exit();
return 0;
}

// generate original data.
for (int i = 0; i < DATA_LENGTH; i++)
{
original_data[i] = (byte)rand();
}

// encrypt data.
for (int i = 0; i < DATA_LENGTH; i += actual_key_length)
{
wc_AesEncryptDirect(&aes_encrypt, POINTER_TO_INDEX(encrypted_data, i), (const byte*)POINTER_TO_INDEX(original_data, i));
}

// decrypt data.
for (int i = 0; i < DATA_LENGTH; i += actual_key_length)
{
wc_AesDecryptDirect(&aes_decrypt, POINTER_TO_INDEX(decrypted_data, i), (const byte*)POINTER_TO_INDEX(encrypted_data, i));
}

// check data.
for (int i = 0; i < DATA_LENGTH; i++)
{
if (original_data[i] != decrypted_data[i])
{
printf("Data mismatch at index %i: original value was %i but decrypted value is %i.\n", i, original_data[i], decrypted_data[i]);
wait_before_exit();
return 0;
}
}

printf("Decrypted data matches original data.\n");
wait_before_exit();
return 0;
}

最佳答案

不要混淆 key 大小和 block 大小。 AES 支持 128、192 和 256 位的 key ,但具有 128 位的固定 block 大小。 block 大小也是 CBC 模式的 IV 大小,但 ECB 模式没有 IV,这也是它如此糟糕的部分原因。

您需要按 block 大小而不是 key 大小推进循环:

int block_length = BITS_TO_BYTES(128);
for (int i = 0; i < DATA_LENGTH; i += block_length) {...}

关于c - 使用 WolfCrypt 的 ECB 模式下的 AES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36879533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com