C ++中的AES / Rijndael Microsoft CryptoAPI

时间:2014-09-01 15:31:11

标签: c++ vb.net encryption cryptoapi mscapi

如何使用Microsoft CryptoAPI(CryptDeriveKey,BCrypt [...]函数,CryptAcquireContext等)将以下加密代码(VB.NET 4.0)转换为C ++等效代码? (我没有在互联网上找到一篇描述使用Microsoft CryptoAPI的AES的文章......)

Dim Key(31) As Byte
Dim IV(15) As Byte

Array.Copy(SomeByteArray, IV, 16)
Array.Copy((New SHA512Managed).ComputeHash(SomeByteArray), Key, 32)

Using AESEncr As New RijndaelManaged() With {.Padding = PaddingMode.ISO10126}

    FinalEncrypted = AESEncr.CreateEncryptor(Key, IV).TransformFinalBlock(AnotherByteArray, 0, AnotherByteArray.GetLength(0))

End Using

和解密的:

Dim Key(31) As Byte
Dim IV(15) As Byte

Array.Copy(SomeByteArray, IV, 16)
Array.Copy((New SHA512Managed).ComputeHash(SomeByteArray), Key, 32)

Using AESEncr As New RijndaelManaged() With {.Padding = PaddingMode.ISO10126}

    FinalDecrypted = AESEncr.CreateDecryptor(Key, IV).TransformFinalBlock(FinalEncrypted, 0, FinalEncrypted.GetLength(0))

End Using

(注意:我已经有了关于SHA-512方法的C ++代码,所以不要为此烦恼。)

1 个答案:

答案 0 :(得分:3)

因此,我为AES-256加密/解密所做的代码如下:(它需要BYTE* DataBYTE* IV作为参数)

    BYTE *hash, *res;
    HCRYPTPROV hCrypt = NULL;
    HCRYPTKEY hKey = NULL;

    struct {
        BLOBHEADER hdr;
        DWORD len;
        BYTE key[32];
    } key_blob;

    key_blob.hdr.bType = PLAINTEXTKEYBLOB;
    key_blob.hdr.bVersion = CUR_BLOB_VERSION;
    key_blob.hdr.reserved = 0;
    key_blob.hdr.aiKeyAlg = CALG_AES_256;
    key_blob.len = 32;

    hash = ComputeSHA512Hash(IV);
    copy(hash, hash + 32, key_blob.key);

    res = new BYTE[16];
    copy(Data, Data + 15, res);
    res[15] = 0;

    // Get the Microsoft Enhanced RSA and AES Cryptographic Service Provider

    if (!CryptAcquireContext(&hCrypt, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0))
        throw E_FAIL;

    // Import our key blob

    if (!CryptImportKey(hCrypt, (BYTE *)&key_blob, sizeof(key_blob), NULL, 0, &hKey))
        throw E_FAIL;

    // Set the mode to Cipher Block Chaining

    DWORD dwMode = CRYPT_MODE_CBC;

    if (!CryptSetKeyParam(hKey, KP_MODE, (BYTE *)&dwMode, 0))
        throw E_FAIL;

    // Set the Initialization Vector to ours

    if (!CryptSetKeyParam(hKey, KP_IV, IV, 0))
        throw E_FAIL;

    // Do the main encryption

    DWORD pdwDataLen = 15;

    if (!CryptEncrypt(hKey, NULL, TRUE, 0, res, &pdwDataLen, 16))
        throw E_FAIL;

    // Do the main decryption

    pdwDataLen = 16;

    if (!CryptDecrypt(hKey, NULL, TRUE, 0, res, &pdwDataLen))
        throw E_FAIL;

     // Destroy whatever was created before (free memory)

     delete hash;

     delete res;

     if (hKey)
            CryptDestroyKey(hKey);

     if (hCrypt)
            CryptReleaseContext(hCrypt, 0);

正如我之前所说,我已经有了ComputeSHA512Hash()函数的代码,所以我的代码完全符合我的目的。我希望这段代码对每个想要编写AES-256代码的人都有用。