3

文字列を暗号化するプログラムを作成しましたPolarSSL AES-CBC

これは私のコードです

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <polarssl/aes.h>
#include <polarssl/havege.h>

int main()
{
    char buff[2][64] = {"Who can tell me WHY?", ""};
    havege_state hs;
    int retval;
    unsigned char IV[16];

    aes_context enc_ctx;
    aes_context dec_ctx;

    aes_setkey_enc(&enc_ctx, "password", 256);
    aes_setkey_dec(&dec_ctx, "password", 256);

    havege_init(&hs);
    havege_random(&hs, IV, 16);

    //encrypt
    aes_crypt_cbc(&enc_ctx, AES_ENCRYPT, 64, IV, buff[0], buff[1]);
    havege_random(&hs, IV, 16);

    //decrypt
    aes_crypt_cbc(&dec_ctx, AES_DECRYPT, 64, IV, buff[1],buff[0]);

    printf("After decrypt:%s\n", buff[0]);
    return 0;
}

しかし、実行すると、復号化した後に間違ったテキストが表示されました。

私の英語は非常に悪いので、AESアルゴリズムを明確に理解していません。いくつかの記事を読むのは難しすぎます。

-------------------------midCatによって追加---------------------- ----------------------

私はあなたのアドバイスに従いました、そして今私は同じIVと256ビットキーを使用するコードを変更します、これは新しいコードです

int main()
{
    char buff[2][64] = {"ABCDEFGHIJKLMN", ""};
    havege_state hs;
    int retval;
    unsigned char IV[16];
    unsigned char IV2[16];
    unsigned char key[32];

    aes_context enc_ctx;
    aes_context dec_ctx;

    havege_init(&hs);
    havege_random(&hs, IV, 16);
    havege_random(&hs, key, 32);
    strncpy(IV, IV2, 16);           //copy IV

    aes_setkey_enc(&enc_ctx, key, 256);
    aes_setkey_dec(&dec_ctx, key, 256);


    //encrypt
    aes_crypt_cbc(&enc_ctx, AES_ENCRYPT, 64, IV, buff[0], buff[1]);
    printf("Before encrypt:%s\n", buff[0]);

    //decrypt
    aes_crypt_cbc(&dec_ctx, AES_DECRYPT, 64, IV2, buff[1],buff[0]);
    printf("After decrypt:%s\n", buff[0]);
    return 0;
}

私はそれをコンパイルし、何度も実行すると、同じ出力が得られました:

Before encrypt:ABCDEFGHIJKLMN
After decrypt:ABCDEFGHYC
                        LMN

入手方法はIV

4

3 に答える 3

4

編集: ダニエルが答えで指摘したように、大きな問題の 1 つは、ランダムな IV を使用して復号化しようとしていることです (期待した結果が得られません)。ただし、この回答の残りの部分も読むことをお勧めします。

まず第一に、入力としてパスワードaes_set_key_encaes_set_key_dec使用せず、キーを使用します。キーは、キーの長さ (256 ビットのキーを使用するため、この場合は 32 バイトのランダムな文字列) と同じくらい完全にランダムな値にする必要があります。

あなたの場合aes_set_key_enc/aes_set_key_dec、短いパスワードで呼び出していますが、256 ビットのキーを期待する必要があることを伝えると、これらの機能がパスワードの外部のメモリをキーの一部として使用することになり、暗号化と復号化キーが異なります。

要約すると、AES (またはその他の暗号アルゴリズム) はランダムなキーを想定しており、アルゴリズム自体にはパスワードをキーに拡張するという概念はありません。

パスワードをキーとして使用する場合は、非ランダム パスワードを疑似ランダム キーに拡張する関数が必要です。これを行うための唯一の正気な方法は、暗号的に安全であるように設計された関数を使用することですが、低速でもあります。これは、パスワードに対するブルート フォース攻撃のリスクを軽減するためです。

使用するのに適した機能は、Colin Percivals scryptbcryptまたはPBKDF2であり、その中で scrypt を最もお勧めします。

ただし、この抽象化レベルで作業するべきではないことを強調したいと思います。使用しているプリミティブ (ブロック暗号、CBC モード) は非常に低い抽象化レベルにあり、これらのプリミティブを使用して暗号システムを構築することは非常に危険です。たとえば、暗号文に対していかなる種類の認証も使用しないと、選択した暗号文攻撃に対して実装が開かれる可能性があります。

アプリケーションで暗号化を使用したい場合の最善の方法は、たとえば Dan Bernstein の優れたNaClや Googleの KeyCzarを使用するなど、より高い抽象化レベルで作業を試みることだと思います。

要約すると、特定の問題は 256 ビット キーを使用することで解決できますが、この抽象化レベルで独自の暗号システムを実装することについてはよく考える必要があります。

于 2012-12-12T08:54:06.727 に答える
-1

で 64 を 14 に変更しました

aes_crypt_cbc(&dec_ctx, AES_DECRYPT, 64, IV2, buff[1],buff[0]);

そして、すべてがうまくいきました!

于 2015-03-16T12:04:18.477 に答える