2016-04-27 21 views
1

私はDesktopソフトウェアでOpenSSLを使用していますが、WolfCrypt(オープンソースでもあります)は組み込みのものです。このプロジェクトでは、ECBモードでAESを使用する必要がありますが、ECBはAESの最も安全なモードではありません。このスレッド(壊れたリンク)によれば、WolfCryptは正しく文書化されていないにもかかわらず、ECBモードをサポートしています。WolfCryptを使用したECBモードのAES

OpenSSLでデータをエンコードしてデコードするのに問題はありませんでしたが、WolfCryptではデータをデコードできませんでした。 wolfCryptは192ビットと256ビットのキーを持つECBモードではバグが多いようですが(128ビット長のキーで動作するようです)私は、次のコードを使用してこの動作に気づいた。このコードは、データのチャンクを暗号化し、復号化し、その結果を元のデータと比較します。データが一致すると、成功メッセージが表示されます。 128ビット長のキーだけが正しい結果をもたらすようです。

私は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; 
} 

答えて

2

キーサイズとブロックサイズを混同しないでください。 AESは128,192、および256ビットのキーをサポートしますが、128ビットの固定ブロックサイズを持ちます。ブロックサイズはCBCモードのIVサイズにもなりますが、ECBモードにはIVがありません。

あなたはブロックサイズではなく、キーのサイズによってあなたのループを進める必要があります。

int block_length = BITS_TO_BYTES(128); 
for (int i = 0; i < DATA_LENGTH; i += block_length) {...} 
関連する問題