1

そのため、OpenSSLのEVP-APIを使用して一部のデータを暗号化しようとしています。しかし、私はテストベクトルと同じ結果を受け取っていません。

これが主な機能です

#include <stdio.h>
#include <windows.h>
#include <openssl\aes.h>
#include <openssl\evp.h>

int main()
{

    unsigned char *to = (unsigned char*)malloc(2056);
    ZeroMemory(to,2056);
    int *tosize;
    unsigned char* key = (unsigned char*)"0000000000000000000000000000000000000000000000000000000000000000";
    unsigned char* iv = (unsigned char*)"00000000000000000000000000000000";
    unsigned char* plain = (unsigned char*)"00000000000000000000000000000000";
    to = AESEncrypt(key,iv,plain,strlen((const char*)plain));
    if (to != 0)
    {
        for (int i = 0; i < strlen((const char*)to);i++)
        {
            printf("%x02", (int*)UCHAR(to[i]));
        }

    }
}

そして、これは私が呼び出そうとしている関数です。エラーは受信されませんでした。すべての呼び出しは真です(エラーなし)。

 unsigned char* AESEncrypt(unsigned char* key, unsigned char*iv, unsigned char*plain, size_t plainsize)
{

EVP_CIPHER_CTX *x = (EVP_CIPHER_CTX*) malloc(sizeof(EVP_CIPHER_CTX));
EVP_CIPHER_CTX_init(x);
if (EVP_EncryptInit(x,EVP_aes_256_cbc(),key,iv))
{
    unsigned char* to = (unsigned char*) malloc(plainsize + EVP_CIPHER_CTX_block_size(x));
int tosize = 0;

if(EVP_EncryptUpdate(x,to,&tosize,plain,plainsize))
{
    if (EVP_EncryptFinal(x,to,&tosize))
    {
        return to;
    }   
  }
}

return 0;
}

これはテストベクトルです:

KEY = 0000000000000000000000000000000000000000000000000000000000000000
IV = 00000000000000000000000000000000
PLAINTEXT = 80000000000000000000000000000000
CIPHERTEXT = ddc6bf790c15760d8d9aeb6f9a75fd4e

これは私が受け取っているものです:CIPHERTEXT =5a0215028e....そしてそれは続きます。ご覧のとおり、正しくありません。

何が間違っているのでしょうか?

4

1 に答える 1

4

CAVSテストベクトルは、かなり単純なパターンに従います。テストごとにある程度異なりますが、一貫性のあるものが1つあります。

16進文字列はBYTE表現です。文字データではありません

したがって、あなたの「テスト」は完全に間違っています。キー、iv、およびバイト0ではなく文字「0」で埋められたプレーンテキストを使用しています。したがって、明らかに異なる結果が得られるのも不思議ではありません。

その特定のテストでは、アレイは次のようになります。

unsigned char key[64] = {0};
unsigned char iv[16] = {0};
unsigned char plain[16] = {0};

さらに、暗号化関数に送信されるサイズは、プレーンテキストのバイト数である必要があります。最後に、暗号化関数は、理想的には、出力パラメーターとしてターゲットバッファーと変更可能なサイズを使用する必要があります。

int AESEncrypt256(
    unsigned char* key,      // key must be 64 bytes wide.
    unsigned char *iv,       // IV must be 16 bytes wide.
    unsigned char *src,      // source buffer to encryt
    unsigned int src_len,    // length of source buffer in bytes
    unsigned char *dst,      // target buffer to write to
    unsigned int *dst_len);  // in: size of dst, out: bytes written to dst

そして、それらのパラメーターに一致するように関数をコーディングします。あなたはあなたがしたことをうれしく思うでしょう。

CAVSテストベクトルは「テキスト」ではありません。それらはバイトであり、そのように扱われる必要があります。モンテカルロテストでは、そうしないと髪の毛がいくらかかかる可能性があるため、今すぐそれを理解する必要があります。

非常に好意を持って、16進数の文字列をバイト配列に変換するコードを記述しください。unsigned char結果文字列に変換して戻すには、同じものが必要になります。そして、これらのテストを書くときにそれらを頻繁に使用するので、これらのルーチンをしっかりさせください


スポイラー警告

最初に、奇数の文字について文字列をテストします。奇数の場合、変換されたバッファの最初のバイトはに基づいている必要があります。0cここで、は入力文字列のc最初のバイトです。charそれ以降(または文字数が偶数の場合は、最初から)、残りのバイト文字列を実際のバイトに変換するときに、一度に2文字ずつ取得します。これはこれを意味します

123456

結果は次のバイト配列になります

{ 0x12, 0x34, 0x56 }

この間:

89AB1

する必要があります:

{0x08, 0x9A, 0xB1 }
于 2013-01-07T00:54:15.530 に答える