【问题标题】:HOW to Sign data in C# in wp8如何在 wp8 中用 C# 对数据进行签名
【发布时间】:2014-02-13 13:26:37
【问题描述】:

我正在开发 wp8 应用程序。我在第一次登录请求中将公钥发送到服务器。作为响应,服务器发送令牌(其简单的 base64 字符串,大约 1200-1300 个字符),我需要用私钥签名并在下一个请求中发送回服务器。现在服务器验证该令牌使用我在第一个请求中发送的相应公钥。我有可以完成上述工作的 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# 中所做的是否正确?

【问题讨论】:

    标签: c# java windows-phone-8 rsa encryption-asymmetric


    【解决方案1】:

    我相信您需要的是如下所示。您可能需要检查 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 的抽象 SHA1 类中没有名为 Create() 的方法
    • 这是标准的 .NET Framework 代码。你可以试试new System.Security.Cryptography.SHA1Managed()
    • SHA1,SHA1managed,SHA256,SHA256Managed 在那里。但他们没有创建方法。我想在 windows phone 8 中实现。
    猜你喜欢
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多