2016-10-14 2 views
0

Я переношу некоторый криптокод в 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) 
+0

Вы пытаетесь зашифровать что-то с помощью ключа «PBKDF2», который не существует. Что именно должен делать код? Можете ли вы показать нам существующий код, из которого вы его переносите? –

+0

@ArtjomB., Приведенный выше код основан на шаблоне шаблона из образцов MSDN: https://msdn.microsoft.com/en-us/library/windows/apps/windows.security.cryptography.core.cryptographicengine ... это мое понимание из документации, что ключ не является PBKDF2, а скорее алгоритмом. Затем ключ генерируется из algortihm с использованием предоставленного буфера. Если я ошибаюсь, сообщите мне. Должен ли я использовать другой алгоритм? Они не предоставляют много информации о MSDN о различиях между ними, и я не уверен, как это может вызвать InvalidCastException. – user2848240

+0

Вот старый код, но понимаем, что старый код не имеет никакого отношения к вопросу, который я задал, поскольку он полностью не поддерживается в 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

ответ

0

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

+0

Если примеры неверны, у вас есть пример кода? –

+0

Этот вопрос с 2012 года полностью объясняет и устраняет проблему: http://answers.flyppdevportal.com/MVC/Post/Thread/85b1b57a-3b4b-420a-b01f-154cdaa68cbc?category=winappswithcsharp – user2848240

+0

Хотя это неясно документировано, разные поставщики алгоритмов используются для деривации ключей и шифрования. Подобно тому, что вы говорили ранее, @ArtjomB., Разница в том, что я правильно выводил ключ, но передача этого ключа в Encrypt() неверна. Вам нужны два ключа - один для генерации iv буфера для шифрования - и еще один симметричный ключ для шифрования. Ключевой буфер от первого ключа также подается в процесс создания симметричного ключа. Примеры на странице для CryptographicEngine, к сожалению, носят общий характер и не фиксируют эти данные хорошо. – user2848240

 Смежные вопросы

  • Нет связанных вопросов^_^