Friday, 23 August 2013

RSA encryption Android to C#, Bad Data Exception

RSA encryption Android to C#, Bad Data Exception

I want to encrypt some text from android and send to C# server, server
suppose to decrypt it but it keep throwing BadDataException. I've been
searching for solution for hours. Found none so far.
Here is android code
static final String pubKeyMod =
"weiz/bxDRnL2IotCt9zt51MhKa/k5nsOR4KSw5DUbtkv727vsvzdKGKXCmkGsJ9qbT30UIB80v57H0354+w1HxIO0nWTVzLWBveoYRQHL/UdkSLJPHFkp5KQWmUYvJtd8BjRG/agFCN4vbgNkqavYr/5HjhaxM8DpzZQ+KMQvTU=";
static final String pubKeyExpo = "AQAB";
static final BigInteger modulus = new BigInteger(1,
Base64.decode(pubKeyMod, Base64.DEFAULT));
static final BigInteger exponent = new BigInteger(1,
Base64.decode(pubKeyExpo, Base64.DEFAULT));
public static String Encrypt(String text) {
try {
PublicKey pubKey =
KeyFactory.getInstance("RSA").generatePublic(new
RSAPublicKeySpec(modulus, exponent));
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] textBytes = text.getBytes("UTF8");
byte[] encryptedBytes = cipher.doFinal(textBytes);
return Base64.encodeToString(encryptedBytes, Base64.DEFAULT);
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
here is C# decoder
public static string Decrypt(string stringData)
{
try
{
byte[] data =
Decrypt(System.Convert.FromBase64String(stringData));
return Encoding.UTF8.GetString(data);
}
catch (Exception ex)
{
ShowError(ex);
}
return null;
}
static byte[] Decrypt(byte[] encData)
{
string privateKey =
"<RSAKeyValue><Modulus>weiz/bxDRnL2IotCt9zt51MhKa/k5nsOR4KSw5DUbtkv727vsvzdKGKXCmkGsJ9qbT30UIB80v57H0354+w1HxIO0nWTVzLWBveoYRQHL/UdkSLJPHFkp5KQWmUYvJtd8BjRG/agFCN4vbgNkqavYr/5HjhaxM8DpzZQ+KMQvTU=</Modulus><Exponent>AQAB</Exponent><P>4OHcKJTRsf2oiXP+aWmwZp7PNbtQJ/D5hKzXFtaKmqxjoNzN8M3VSzO1Q2lI6L6gkXjKIv3cDBdvzcrGKjzNLw==</P><Q>3L2oh5TtzAlZidCh1yLXIJIR1ijDjDW4MEMp7Z3qVhVYuMjeX8nUNY/9LcAybZTJ7UCH1aC29OhrejWycPSq2w==</Q><DP>KtH2+Oc1cp3pPJsQo4PTagbtT77mCWTyLhg3MIsTg1Y19kh1ElgvOA2Vg0uF7YN20ZxdaQJLpyXDTT1CNIK1Uw==</DP><DQ>q83xnZUMgAHG7ryzOf6j8XW+7DBOApLNCMM9nvOJr/ZtV2T/rw4nXIj1ROaSWTe08jOHhX3Q6Ez9WeDxQXksgQ==</DQ><InverseQ>sutRBCOyScHh9ebgwqJLgVGHlzLtvWu/v17dWi/DYIp26/vJ0zmt1v92ZKQ0kgGI0eo04Z/DCQvN9lgR9mNWRg==</InverseQ><D>XtNemfnj6GK1zUTO9r0atmInuIwk4zVQUVYgUXTU/fRGBc/5dk1EFcjI1jVwKRV8ZTnD7U44PLJoIXHvfy929gXhfGXK8n5gMqNByP1iYVWIRsCbhiWtVDvye2LQU5+yTXfyVOIcAZHZ+U7Moj4RC8FU4pxUewKlRqgfQ80VuW0=</D></RSAKeyValue>";
var rsaCSP = new RSACryptoServiceProvider();
rsaCSP.FromXmlString(privateKey);
int maxChunkLength = rsaCSP.KeySize / 8;
List<byte> decData = new List<byte>();
int totalWrote = 0;
while (totalWrote < encData.Length)
{
int chunkSize = (
(encData.Length - totalWrote) >= maxChunkLength ?
maxChunkLength :
(encData.Length - totalWrote)
);
byte[] tbytes = new byte[chunkSize];
System.Buffer.BlockCopy(encData, totalWrote, tbytes, 0,
tbytes.Length);
decData.AddRange(rsaCSP.Decrypt(tbytes, false));
totalWrote += chunkSize;
}
return decData.ToArray();
}
PS : Keys are left for testing purpose. Thanks.

No comments:

Post a Comment