0

OpenSSL から MS CryptoAPI に移行する必要があります。

OpenSSLを使用すると、データのNバイト(すでに整列されています-たとえば、データ長= 32バイトとしましょう)を取得し、あるバッファから別のバッファにエンコード/デコードします。すべて正常に動作します。

今度は「CryptoAPI を使用する必要があります!」。だから私は次のようなものを書きます:

    // Import AES key
    if(!CryptImportKey(m_hProvider, (CONST BYTE*)&aeskey, structsize, NULL, 0, &m_hAesKey ) ) {
        throw WinAESException("SetKey: Import key failed");
    }

    // Set Mode
    DWORD dwMode = CRYPT_MODE_ECB; //I can also use CRYPT_MODE_CBC with set of IV but let simple the code;
    if(!CryptSetKeyParam(m_hAesKey, KP_MODE, (BYTE*)&dwMode, 0)) {
        throw WinAESException("SetKey: Set ECB mode failed");
    }

問題なく動作し、データをエンコードしようとしています

    DWORD d = (DWORD)psize;
    result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, buffer, &d, (DWORD)bsize );

そして、私は何を見ますか?データのエンコードされた部分がソースよりも大きくなっています。CryptEncrypt 関数が何らかの方法で既にパディング データをパディングしたことを理解していますか?

とにかく、暗号化された結果をプレーンデータと同じサイズにすることは可能ですか?

32 バイトを暗号化するときに、48 バイトではなく正確に 32 バイトを取得するために、整列されていないブロックを使用しません...

予想されるサイズをテストすると

    DWORD d = 16;
    result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize );  //need 32

    d = 32;
    result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize );  //need 48 

    d = 48;
    result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize );   //need 64

    d = 64;
    result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize );  //need 80

WTHF私は間違っていますか?PS 暗号化された結果を目的のサイズに切り捨ててから復号化しようとすると、予期されるエラー コードが返されて復号化が行われますが、データは正しく復号化されます。しかし、このハックは私のためではありません...

4

2 に答える 2

-1

一時的な解決策を見つけたようです。ブロック全体を暗号化/復号化する必要がある場合-必要なのは関数を嘘をつくことだけです-「それは最後の/唯一のブロックではありません」:だからタイプしない:

result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, buffer, &d, (DWORD)bsize );

しかし:

result = CryptEncrypt( m_hAesKey, NULL, FALSE, 0, buffer, &d, (DWORD)bsize );

今では動作します。そして、ブロックの先頭に配置を追加するために、最後のピースの最後にデータを埋め込むという概念を変更しないことを願っています...

于 2016-10-25T12:46:10.923 に答える