私は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進数も暗号化されたテキストを尾引きしているようですが、なぜそれが起こっているのかわかりません。暗号化がうまくいかない理由について誰かに知らせることができますか?私のコードに必要な結果を提供していない間違いがありますか?どんな助けもありがとうございます。 ありがとう
暗号化/復号化機能は、C-文字列ではなくバイナリデータを処理します。 'for(x = 0; *(dec_out + x)!= 0x00; x ++)'のように単純にヌルバイトを探すことはできません。 –
ありがとうございます。私は最初のブロックの後に関数が機能するだろうと誤解していました。テキストを入力する代わりに入力の長さを使って暗号化するコードを変更する必要がありますか?ありがとうございます – akfe79
'string.h'を追加するか(単純なループを使用して)' text'の長さを取得します(例えば 'size_t textlen = strlen(text);' 'strlen'に' 'nul-terminated''という文字は含まれていません) –