2016-07-21 1 views
-1

私はOpenSSLライブラリをよりよく理解しようとしています。そうするために、さまざまな操作モードを使用してテキストを暗号化するプログラムを作ってみたかったのです。私はECBモードを使用して暗号化と復号化を行うプログラムを作成しましたが、結果は私が期待していたものではありません。ECBモードのAESでOpenSSLライブラリが期待通りの結果を得られない

以下は、これまでのコードです。

#include <stdio.h> 
#include <openssl/aes.h> 
#include <string.h> 
#include <stdlib.h> 
#include <openssl/rand.h> 


//static const unsigned char key[]={}; 


int main() 
{ 


    int keylength; 
    printf("Give a key length [only 128 or 192 or 256!]:\n"); 
    scanf("%d", &keylength); 

    /* generate a key with a given length */ 
    unsigned char aes_key[keylength]; 
    memset(aes_key, 0, sizeof(aes_key)); 
    if (!RAND_bytes(aes_key, keylength)) 
    { 
     exit(-1); 
    } 
    aes_key[keylength-1] = '\0'; 

    unsigned char text[] = "TestText TestText"; //Assign text to be encrypted 
    unsigned char enc_out[AES_BLOCK_SIZE]; //Set to 16 bytes 
    unsigned char dec_out[AES_BLOCK_SIZE]; 

    AES_KEY enc_key, dec_key; //establish AES enc and dec key 

    AES_set_encrypt_key(aes_key, 128, &enc_key); 
    AES_encrypt(text, enc_out, &enc_key); 

    AES_set_decrypt_key(aes_key, 128, &dec_key); 
    AES_decrypt(enc_out, dec_out, &dec_key); 

    int x; 

    printf("original:\t"); 
    for(x=0;*(text+x)!=0x00;x++)   
    printf("%X ",*(text+x)); 
    printf("\nencrypted:\t"); 
    for(x=0;*(enc_out+x)!=0x00;x++) 
    printf("%X ",*(enc_out+x)); 
    printf("\ndecrypted:\t"); 
    for(x=0;*(dec_out+x)!=0x00;x++) 
    printf("%X ",*(dec_out+x)); 
    printf("\n"); 

    return 0; 
} 

私はECBモードのため、同一の平文ブロックは、同一の暗号文ブロックに暗号化する必要がありますが、私は自分のコードを実行したときにこれが起こらないことを知っています。次に例を示します。

original: 54 65 73 74 54 65 78 74 2E 20 20 54 65 73 74 54 65 78 74 2E 
encrypted: A2 FE 93 40 F5 92 95 F A2 5A D0 4A A6 53 95 58 54 65 73 74 
      54 65 78 74 2E 20 20 54 65 73 74 54 54 65 73 74 54 65 78 74 
      2E 20 20 54 65 73 74 54 65 78 74 2E 
decrypted: 54 65 73 74 54 65 78 74 2E 20 20 54 65 73 74 54 54 65 73 74 
      54 65 78 74 2E 20 20 54 65 73 74 54 65 78 74 2E 

まず、私は、入力されたテキストは、それはECBモードを使用して暗号化する必要があり、六角になってきた、そして最後にすべてが暗号化解除する必要があります。私が暗号化したテキストの2つの文字列は同じですが、16進形式のテキストにはこれが表示されません。同一の平文は同じ暗号文を共有しない。平文の16進数も暗号化されたテキストを尾引きしているようですが、なぜそれが起こっているのかわかりません。暗号化がうまくいかない理由について誰かに知らせることができますか?私のコードに必要な結果を提供していない間違いがありますか?どんな助けもありがとうございます。 ありがとう

+0

暗号化/復号化機能は、C-文字列ではなくバイナリデータを処理します。 'for(x = 0; *(dec_out + x)!= 0x00; x ++)'のように単純にヌルバイトを探すことはできません。 –

+0

ありがとうございます。私は最初のブロックの後に関数が機能するだろうと誤解していました。テキストを入力する代わりに入力の長さを使って暗号化するコードを変更する必要がありますか?ありがとうございます – akfe79

+0

'string.h'を追加するか(単純なループを使用して)' text'の長さを取得します(例えば 'size_t textlen = strlen(text);' 'strlen'に' 'nul-terminated''という文字は含まれていません) –

答えて

2

ここにはいくつかの問題があります。

最初に、サイズをビットとバイトでミックスしています。 128ビットのキーは128バイトではなく16バイトです。これは、大量のキーが生成されてしまい、ほとんど無害です。

2番目:キーを含むAESの入力と出力がNULLで終了すると仮定しています。ではない。あなたが印刷している最初の16バイトの出力はすべて無駄なゴミで、キーはヌルで終了しません。

第3:テスト入力("TestText TestText")が長すぎて、1つのAESブロックに収まりません。 AES_encrypt()は1つのブロックでのみ動作します。

+0

ありがとう、それは最初のブロックの後に暗号化が起こっていない理由を説明しています – akfe79

+0

また、ifあなたは次のようにします:keylength = keylength/8; // length * in * bytes * aes_key [keylength-1] = '\ 0'; // < - キーを切り捨てません!! !(「切り捨て」とは、最後の8ビットを既知の一定の値に設定することです) –

+0

@JimFloodそれを強調してくれてありがとう。 – duskwuff

関連する問題