5

AES 256 文字列をデコードする関数がありましたが、16 文字しか返されません

bool decrypt_block(unsigned char* cipherText, unsigned char* plainText, unsigned char* key)
{
    AES_KEY decKey;
    if (AES_set_decrypt_key(key, 256, &decKey) < 0)
        return false;
    AES_decrypt(cipherText, plainText, &decKey);
    return true;
}

decrypt_block( encoded, resultText, ( unsigned char *) "57f4dad48e7a4f7cd171c654226feb5a");

何か案が

4

2 に答える 2

5

キーの長さとブロック サイズを混同しているようです。

AES は、128 ビット、192 ビット、および 256 ビットの3 つの異なるキー長で使用できます。

AES は常に128 ビット (16 バイト)のブロック サイズを使用します。長さが 16 バイトを超えるメッセージの場合、一度に 16 バイトを復号化 (または暗号化) する必要があり、毎回 16 バイトの出力が得られると予想されます。(CBC、CTR、ECB など、どのモードを使用するかを決定する必要もあります。他の誰かから提供されたテキストを復号化している場合、その決定は既に行われています。自分で決定を下す場合は、 ECB が正しい選択になることはほとんどないことに注意してください。) メッセージの長さが 16 バイトの倍数でない場合は、16 バイトの倍数になるようにパディングする必要があります。PKCS #7 パディングが最も一般的です。

詳細については、AES に関するウィキペディアの記事を参照してください。

于 2015-01-06T10:14:33.017 に答える
4

AESはブロック暗号です。128ビット(16バイト)のブロックを暗号化および復号化します。AES_decryptおよびAES_encryptは、一度に1つのブロックに作用します。したがって、最初の16バイトのみを取得します。他のブロックを手動で復号化または暗号化する必要があります。

モード(CBC、ECBなど)がわかっている場合は、AES_decrypt_cbcなどの関数を呼び出すことができます。

次のようにコードを変更する必要があります(例を示しています)。

 int len = strlen(ciphertext); //or get cipher text length by any mean.
 int i;
 for(i=0; i<=len; i+=16)
    AES_decrypt(cipherText+i, plainText+i, &decKey);

モードについて確信がある場合は、cbc / ecb / cfb/ofbモード関数を呼び出します。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-03-13T04:19:28.470 に答える