繁体   English   中英

如何在wp8中的C#中对数据进行签名

[英]HOW to Sign data in C# in wp8

我正在开发wp8应用程序。 我在第一个登录请求中将公钥发送到服务器。作为响应,服务器发送令牌(它需要约1200-1300个字符的简单base64字符串),需要用私钥签名并在下一个请求中发送回服务器。现在服务器验证该令牌与我在第一个请求中发送的相应公钥。 我有做上述事情的工作的Java代码。

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM