Windows.Security.Cryptography.Core.CryptographicEngine.Encrypt() выбрасывает InvalidCastException

Я портирую некоторый криптографический код в UWP для HoloLens. AFAIK, я реализовал это в соответствии с требованиями UWP, но я получаю загадочное InvalidCastException из следующего кода:

public override byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV)
IBuffer dataBuffer = WindowsRuntimeBuffer.Create(clearData, 0, clearData.Length, clearData.Length);
IBuffer keyBuffer = WindowsRuntimeBuffer.Create(Key, 0, Key.Length, Key.Length);
IBuffer ivBuffer = WindowsRuntimeBuffer.Create(IV, 0, IV.Length, IV.Length);

string strAlgName = KeyDerivationAlgorithmNames.Pbkdf2Sha256;

// Open the specified algorithm.
KeyDerivationAlgorithmProvider objAlgProv = KeyDerivationAlgorithmProvider.OpenAlgorithm(strAlgName);

// Create a key by using the passed buffer.
CryptographicKey key = objAlgProv.CreateKey(keyBuffer);

IBuffer encryptedData = CryptographicEngine.Encrypt(key, dataBuffer, ivBuffer); // throws System.InvalidCastException
return (byte[])encryptedData.ToArray();

Я не совсем уверен, в чем проблема. Я проверил, что типы всех параметров, передаваемых в CryptographicEngine.Encrypt, являются правильными. Я попробовал метод расширения AsBuffer ранее на моих байтовых массивах; Я переключился на WindowsRuntimeBuffer. Создаю мысль, что это может сработать, но это не имеет никакого значения. Оба типа dataBuffer и ivBuffer имеют тип WindowsRuntimeBuffer, который реализует IBuffer, и оба имеют длину, кратную 8 (32 и 16 соответственно). Я пробовал кастинг как IBuffer; это не сработало. Я даже попытался сгенерировать 3 случайных IBuffers, все длиной 32, чтобы посмотреть, сработает ли это по крайней мере; это не работает Это ошибка, или я упускаю что-то действительно очевидное? Более того, InvalidCastException является полностью общим и предоставляет мне только StackTrace из моего собственного приложения, которое абсолютно ничего не говорит мне.

FWIW, вот весь след стека:

   at Windows.Security.Cryptography.Core.CryptographicEngine.Encrypt(CryptographicKey key, IBuffer data, IBuffer iv)
   at dk.UWP.Crypto.UWPSimpleEncryption.Encrypt(Byte[] clearData, Byte[] Key, Byte[] IV)
   at dk.UWP.Crypto.UWPSimpleEncryption.Encrypt(String clearText, String Password)
   at dk.Crypto.SimpleEncryption.Encrypt(String clearText, String Password)
   at bbtb.Scene.BBTBInitialization.<DeferSplashForInitialization>d__19.MoveNext()
   at UnityEngine.SetupCoroutine.InvokeMoveNext(IEnumerator enumerator, IntPtr returnValueAddress)
   at UnityEngine.SetupCoroutine.$Invoke1InvokeMoveNext(Int64 instance, Int64* args)
   at UnityEngine.Internal.$MethodUtility.InvokeMethod(Int64 instance, Int64* args, IntPtr method)

1 ответ

Похоже, что по какой-то причине примеры, которые MSDN предоставляет с KeyDerivationAlgorithmProvider и KeyDerivationAlgorithmNames, не работают. Если вместо этого вы используете SymmetricAlgorithmNames и SymmetricAlgorithmProvider, похоже, он работает нормально. Я не уверен, если это по замыслу; если так, это полностью недокументировано. Я опубликую больше информации, если я обнаружу это.

Другие вопросы по тегам