Произошла ошибка при декодировании заполнения OAEP
Всем привет,
Я разработал веб-службу, которая шифрует строку подключения и передает обратно зашифрованную строку консольному приложению (в тестовых целях).
Веб-служба работает на другом компьютере, чем консольное приложение. Но я продолжаю получать следующее сообщение об исключении: произошла ошибка при декодировании заполнения OAEP.
Когда я запускаю шифрование и дешифрование кода на одном компьютере, все работает просто отлично?!?! И веб-служба, и консольное приложение используют одно и то же имя KeyContainerName.
метод шифрования:
private static string EncryptString(string inputString, int dwKeySize, string keyContainerName) { // TODO: Add Proper Exception Handlers CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = keyContainerName; RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider(dwKeySize, cspParams); //rsaCryptoServiceProvider.FromXmlString(xmlString); int keySize = dwKeySize / 8; byte[] bytes = Encoding.UTF32.GetBytes(inputString); // The hash function in use by the .NET RSACryptoServiceProvider here // is SHA1 // int maxLength = ( keySize ) - 2 - // ( 2 * SHA1.Create().ComputeHash( rawBytes ).Length ); int maxLength = keySize - 42; int dataLength = bytes.Length; int iterations = dataLength / maxLength; StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i <= iterations; i++) { byte[] tempBytes = new byte[(dataLength - maxLength * i > maxLength) ? maxLength : dataLength - maxLength * i]; Buffer.BlockCopy(bytes, maxLength * i, tempBytes, 0, tempBytes.Length); byte[] encryptedBytes = rsaCryptoServiceProvider.Encrypt(tempBytes, true); // Be aware the RSACryptoServiceProvider reverses the order of // encrypted bytes. It does this after encryption and before // decryption. If you do not require compatibility with Microsoft // Cryptographic API (CAPI) and/or other vendors. Comment out the // next line and the corresponding one in the DecryptString function. //Array.Reverse(encryptedBytes); // Why convert to base 64? // Because it is the largest power-of-two base printable using only // ASCII characters stringBuilder.Append(Convert.ToBase64String(encryptedBytes)); } return stringBuilder.ToString(); }
Способ Расшифровки:
private static string DecryptString(string inputString, int dwKeySize, string keyContainerName) { // TODO: Add Proper Exception Handlers CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = keyContainerName; RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider(dwKeySize, cspParams); int base64BlockSize = ((dwKeySize / 8) % 3 != 0) ? (((dwKeySize / 8) / 3) * 4) + 4 : ((dwKeySize / 8) / 3) * 4; int iterations = inputString.Length / base64BlockSize; ArrayList arrayList = new ArrayList(); for (int i = 0; i < iterations; i++) { byte[] encryptedBytes = Convert.FromBase64String(inputString.Substring(base64BlockSize * i, base64BlockSize)); // Be aware the RSACryptoServiceProvider reverses the order of // encrypted bytes after encryption and before decryption. // If you do not require compatibility with Microsoft Cryptographic // API (CAPI) and/or other vendors. // Comment out the next line and the corresponding one in the // EncryptString function. Array.Reverse(encryptedBytes); arrayList.AddRange(rsaCryptoServiceProvider.Decrypt(encryptedBytes, true)); } return Encoding.UTF32.GetString(arrayList.ToArray(Type.GetType("System.Byte")) as byte[]); }
Может ли кто-нибудь помочь мне в этом деле?
Заранее большое спасибо.
С уважением,