Click here to Skip to main content
15,890,512 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi all,

I have developed a web service that encrypts a connection string and passes back the encrypted string to a console application (test purposes).

The web service runs on a different PC than the console application. But I keep receiving the following exception message: Error occurred while decoding OAEP padding.

When I run the encrypt and decrypt code on the same PC everything works just fine?!?! Both the web service and the console application makes use of the same KeyContainerName.

Encryption Method:
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();
}


Decryption Method:
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[]);
}


Can anyone please assist me in the matter?
Many thanks in advance.
Kind regards,
Posted
Updated 27-Jun-16 3:31am

Did not follow the example correctly.... :(
Full example can be viewed here: Public Key RSA Encryption in C# .NET[^]
 
Share this answer
 
You can use HttpUtility.UrlEncode() method to pass encrypred string.
i did and works fine to me.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900