1

因此,当我尝试在 WinRT ( Windows::Security::Cryptography) 中使用新的加密命名空间时遇到了一个有趣的问题。也就是说,当我尝试使用CryptographicEngine::Encrypt()orCryptographicEngine::Decrypt()方法时,它们会抛出一个InvalidArgumentException. 我绝不是这方面的专业人士,但我觉得我已经将其缩小到一个相当基本的场景并且仍然失败:

//------------------------------------------------------------------------------
// TestEncryptDecrypt
// Simple test that encrypts a string, then decrypts it and compares the result.
void TestEncryptDecrypt()
{
    // Select asymmetric algorithm
    Platform::String^ strAlgorithm = Windows::Security::Cryptography::Core::AsymmetricAlgorithmNames::RsaOaepSha512;
    Windows::Security::Cryptography::Core::AsymmetricKeyAlgorithmProvider^ spAlgorithm = Windows::Security::Cryptography::Core::AsymmetricKeyAlgorithmProvider::OpenAlgorithm(strAlgorithm);

    // Create public/private keys
    unsigned int nKeySize = 512;
    Windows::Security::Cryptography::Core::CryptographicKey^ spKeyPair = spAlgorithm->CreateKeyPair(nKeySize);

    // Message to encrypt/decrypt
    Platform::String^ strMessage = L"Test Message";
    Windows::Storage::Streams::IBuffer^ spMessageBuffer = Windows::Security::Cryptography::CryptographicBuffer::ConvertStringToBinary(strMessage, Windows::Security::Cryptography::BinaryStringEncoding::Utf8);

    // Encrypt the data
    // *** InvalidArgumentException throw here ***
    Windows::Storage::Streams::IBuffer^ spEncryptedBuffer = Windows::Security::Cryptography::Core::CryptographicEngine::Encrypt(spKeyPair, spMessageBuffer, nullptr /*Initialization vector not used with asymmetric algorithms.*/);

    // Decrypt the data
    Windows::Storage::Streams::IBuffer^ spUnencryptedBuffer = Windows::Security::Cryptography::Core::CryptographicEngine::Decrypt(spKeyPair, spEncryptedBuffer, nullptr /*Initialization vector not used with asymmetric algorithms.*/);

    // Retrieve the original message
    Platform::String^ strUnencryptedMessage = Windows::Security::Cryptography::CryptographicBuffer::ConvertBinaryToString(Windows::Security::Cryptography::BinaryStringEncoding::Utf8, spUnencryptedBuffer);
    Assert(strUnencryptedMessage == strMessage);
}

我仍然可以做一些愚蠢的事情(可能是),但不幸的是我没有看到它......有什么想法吗?

提前致谢!:)

4

1 回答 1

1

和往常一样,我在发布大约半小时后偶然发现了答案...... :)

事实证明,我使用的密钥大小不受 RSA_OAEP_SHA512 的支持。您需要使用更大的密钥(在切换到 512 之前,我实际上曾尝试过 1024,但似乎也太小了)。不过,使用 2048 或 4096 的密钥大小可以正常工作。

无论如何,我通过使用可以在http://code.msdn.microsoft.com/windowsapps/CryptoWinRT-54ff3d9f找到的 WinRT Crypto 示例来解决这个问题。它也抛出异常,但附近有一些错误处理代码,指示在捕获相当无用的异常后发生了什么。该示例写得很好,因此如果您遇到类似问题,我建议您检查一下。

在单独的说明中,我确实发现在创建密钥时没有抛出异常有点烦人,因为获取 InvalidArgumentException 足够神秘,而不会将其抛出一个有趣的地方。并且似乎可以在创建密钥期间抛出它,因为此时已经选择了算法。

无论如何,问题解决了,希望这篇文章能帮助别人!

于 2012-10-12T22:30:53.207 回答