1

そのため、WinRT で新しい暗号化名前空間を使用しようとすると、興味深い問題が発生しました ( Windows::Security::Cryptography)。つまり、CryptographicEngine::Encrypt()またはCryptographicEngine::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

そしていつものように、私は投稿してから約30分後に答えに出くわしました... :)

私が使用していたキーサイズはRSA_OAEP_SHA512でサポートされていないことがわかりました。より大きなキーを使用する必要があります(512に切り替える前に実際に1024を試しましたが、小さすぎるようです)。ただし、2048または4096のキーサイズを使用すると問題なく機能します。

とにかく、私はhttp://code.msdn.microsoft.com/windowsapps/CryptoWinRT-54ff3d9fにあるWinRTCryptoサンプルで遊んでこれを理解しました。例外もスローしますが、かなり役に立たない例外をキャッチした後に何が起こったかを示すエラー処理コードが近くにあります。サンプルは非常によく書かれているので、同様の問題が発生している場合はチェックすることをお勧めします。

別の注意点として、InvalidArgumentExceptionを取得すると、面白い場所にスローされなくても十分に不可解であるため、キーの作成時に例外がスローされないのは少し面倒です。また、この時点でアルゴリズムがすでに選択されているため、キーの作成中にスローすることは可能だったようです。

とにかく、問題は解決しました、そしてうまくいけば、この投稿は他の誰かを助けるでしょう!

于 2012-10-12T22:30:53.207 に答える