Programm3r Ответов: 2

Произошла ошибка при декодировании заполнения 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[]);
}


Может ли кто-нибудь помочь мне в этом деле?
Заранее большое спасибо.
С уважением,

2 Ответов

Рейтинг:
0

Programm3r

Не следовал примеру правильно.... :(
Полный пример можно посмотреть здесь: Шифрование RSA с открытым ключом в C# .NET[^]


Рейтинг:
0

Ehsan Maleki Zoeram

Вы можете использовать HttpUtility.Метод UrlEncode () для передачи зашифрованной строки.
я так и сделал, и у меня это прекрасно получается.