Java相当于.NET RSACryptoServiceProvider.SignData

时间:2016-01-11 18:39:18

标签: java c# encryption rsa digital-signature

我目前正在通过公钥加密数据然后使用RSACryptoServiceProvider.SignData方法对其进行签名来创建一个符号哈希

String data = "some string here";
// **Step 1: encrypt data with public key**
Byte[] encryptedData = publicKeyRsa.Encrypt(System.Text.Encoding.UTF8.GetBytes(data), false);

// **Step 2: sign the encrypted data with private key**
Byte[] sign = privateKeyRsa.SignData(encryptedData, new SHA1CryptoServiceProvider());

// **Step 3: get hash for sign**
String signHash = System.Web.HttpServerUtility.UrlTokenEncode(sign);

我无法在Java中成功实现相同的算法。 这就是我目前所拥有的

    Base64 base64Encoder = new Base64();

    // initialize cipher to encrypt
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);

    // **Step 1: encrypt data with public key**
    byte[] encBytes = cipher.doFinal(VALUE.getBytes("UTF-8"));
    byte[] encryptedData  = base64Encoder.encode(encBytes);
    String encryptedDataString = bytes2String(encryptedData);
    System.out.println("data encrypted: " + encryptedData);

    // **Step 2: sign the encrypted data with private key**
    Signature sig = Signature.getInstance("SHA1WithRSA");
    sig.initSign(privKey);
    sig.update(encryptedData);
    byte[] signData = sig.sign();

    // **Step 3: get hash for sign**
    byte[] signDataEncrypted = base64Encoder.encode(signData);
    String signDataString = bytes2String(signDataEncrypted);
    System.out.println("hash: "+signDataString);

我的bytes2String实现来自这里

Using SHA1 and RSA with java.security.Signature vs. MessageDigest and Cipher

private static String bytes2String(byte[] bytes) {
    StringBuilder string = new StringBuilder();
    for (byte b : bytes) {
        String hexString = Integer.toHexString(0x00FF & b);
        string.append(hexString.length() == 1 ? "0" + hexString : hexString);
    }
    return string.toString();
}

C#代码工作正常,但java代码不提供“正确的值”(根据服务器)。 Java代码看起来是否正确?与C#代码相比,我有什么问题吗?

由于

1 个答案:

答案 0 :(得分:1)

我终于能够成功解决问题了。 :)谢谢大家的帮助!

以下是修正

问题1:密码算法错误

我将密码算法从"RSA"更改为"RSA/ECB/PKCS1Padding"

问题2:bytes2String()方法

我用这个

替换了我的bytes2String()逻辑
public String bytes2String(byte[] bytes) {
  return Base64.encodeBase64URLSafeString(bytes);
}

问题3:C#UrlTokenEncode方法

我假设转换为字符串的Java和C#方法是相同的。 实际上,C#添加了额外的填充字符,如此处所述(http://infospace.com/partners/sdk/csr/signingSample.html)。

希望这有助于某人!