I am developing wp8 app. I send public key to server in 1st login request.In response server sends token (its simple base64 string with around 1200-1300 characters) which I need to sign with private key and send back to server in next request.Now server verifies that token with corresponding public key I sent in 1st request. I have working java code which does above thing.
String privateKey = sharedPref.getString("privateKey", "");
byte [] decoded = Base64.decode(privateKey, Base64.NO_WRAP);
KeyFactory kf = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decoded);
PrivateKey privateKeyNew = kf.generatePrivate(keySpec);
String tokenSp = sharedPref.getString("token", "");
byte[] tokenBytes = tokenSp.getBytes();
Signature dsa = Signature.getInstance("SHA1withRSA");
dsa.initSign(privateKeyNew);
dsa.update(tokenBytes);
byte[] signedData = dsa.sign();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(tokenBytes);
baos.write(signedData);
byte[] finalout = baos.toByteArray();
signedToken = new String(Base64.encode(finalout, 0, finalout.length, Base64.NO_WRAP));
I want achieve same in c#. Code I have written is :
UnicodeEncoding ByteConverter = new UnicodeEncoding();
CspParameters parameters = new CspParameters();
parameters.KeyContainerName = "MyContainer";
RSACryptoServiceProvider obj = new RSACryptoServiceProvider(parameters);
byte[] dataToEncrypt=ByteConverter.GetBytes(s[0]);
byte[] SignedData=obj.SignData(dataToEncrypt, "SHA256");
MemoryStream stream = new MemoryStream();
stream.Write(dataToEncrypt,0,dataToEncrypt.Count());
stream.Write(SignedData,0,SignedData.Count());
byte[] finalBytesToSend = stream.ToArray();
string s2 = Convert.ToBase64String(finalBytesToSend);
return s2;
And to server I send "SHA256" as public key to verify.Is it correct what I have done in c#?