Я переношу некоторый криптокод в UWP для HoloLens. AFAIK, я реализовал это отлично в соответствии с требованиями UWP, но я получаю таинственный InvalidCastException из следующего кода:Windows.Security.Cryptography.Core.CryptographicEngine.Encrypt() throwing 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)
Вы пытаетесь зашифровать что-то с помощью ключа «PBKDF2», который не существует. Что именно должен делать код? Можете ли вы показать нам существующий код, из которого вы его переносите? –
@ArtjomB., Приведенный выше код основан на шаблоне шаблона из образцов MSDN: https://msdn.microsoft.com/en-us/library/windows/apps/windows.security.cryptography.core.cryptographicengine ... это мое понимание из документации, что ключ не является PBKDF2, а скорее алгоритмом. Затем ключ генерируется из algortihm с использованием предоставленного буфера. Если я ошибаюсь, сообщите мне. Должен ли я использовать другой алгоритм? Они не предоставляют много информации о MSDN о различиях между ними, и я не уверен, как это может вызвать InvalidCastException. – user2848240
Вот старый код, но понимаем, что старый код не имеет никакого отношения к вопросу, который я задал, поскольку он полностью не поддерживается в UWP/голографическом: 'MemoryStream ms = new MemoryStream(); Rijndael alg = Rijndael.Create(); alg.Key = Key; alg.IV = IV; CryptoStream cs = new CryptoStream (ms, alg.CreateEncryptor(), CryptoStreamMode.Write); cs.Write (clearData, 0, clearData.Length); cs.Close(); byte [] encryptedData = ms.ToArray(); \t \t \t return encryptedData; ' – user2848240