C# 如何在wp8中对C中的数据进行签名
我正在开发wp8应用程序。我在第一个登录请求中向服务器发送公钥。作为响应,服务器向令牌发送其简单的base64字符串,其中包含大约1200-1300个字符,我需要使用私钥签名,然后在下一个请求中发送回服务器。现在,服务器使用我在第一个请求中发送的相应公钥验证令牌。我有正在工作的java代码,可以完成上面的事情C# 如何在wp8中对C中的数据进行签名,c#,java,windows-phone-8,rsa,encryption-asymmetric,C#,Java,Windows Phone 8,Rsa,Encryption Asymmetric,我正在开发wp8应用程序。我在第一个登录请求中向服务器发送公钥。作为响应,服务器向令牌发送其简单的base64字符串,其中包含大约1200-1300个字符,我需要使用私钥签名,然后在下一个请求中发送回服务器。现在,服务器使用我在第一个请求中发送的相应公钥验证令牌。我有正在工作的java代码,可以完成上面的事情 String privateKey = sharedPref.getString("privateKey", ""); byte [] decoded = Base64.decode(p
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));
我想在c中实现同样的效果。我写的代码是:
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;
我将SHA256作为公钥发送到服务器进行验证。我在c语言中所做的是否正确?我相信您需要的是以下内容。您可能需要检查publicKeyXml并对其格式做一些工作
// create a RSA provider with a 1024 bits key
using(RSACryptoServiceProvider rsaProv = new RSACryptoServiceProvider(1024))
{
// export public key and send it to server to obtain base64 token
string publicKeyXml = rsaProv.ToXmlString(false);
string base64TokenFromServer = GetTokenFromServer(publicKeyXml);
// decode base64 token
byte[] tokenBytes = Convert.FromBase64String(base64TokenFromServer);
// sign token bytes using RSA provider's private key and SHA1
byte[] tokenSignatureBytes;
using (var ms = new MemoryStream(tokenBytes))
{
tokenSignatureBytes = rsaProv.SignData(ms, SHA1.Create());
}
// concat token bytes and signature bytes
byte[] finalOut;
using (var ms = new MemoryStream())
{
ms.Write(tokenBytes, 0, tokenBytes.Length);
ms.Write(tokenSignatureBytes, 0, tokenSignatureBytes.Length);
ms.Flush();
finalOut = ms.ToArray();
}
// encode final out to base64
string signedToken = Convert.ToBase64String(finalOut);
}
签名时,wp8 API中的Abstract SHA1类中没有名为Create的方法,这是标准的.NET Framework代码。你能试试新的系统。安全。加密。有SHA1ManagedSHA1,SHA1managed,SHA256,SHA256Managed。但是他们没有创建方法。我想在windows phone 8中实现。