Java 相当于 .NET RSACryptoServiceProvider.SignData
Java equivalent of .NET RSACryptoServiceProvider.SignData
我目前正在通过使用 public 密钥加密数据然后使用 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 代码不提供 "right values"(根据服务器)。 Java 代码看起来正确吗?与 C# 代码相比,我做错了什么吗?
谢谢
我终于成功解决了这个问题。 :) 谢谢大家的帮助!
以下是修复
问题 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)。
希望这对某人有所帮助!
我目前正在通过使用 public 密钥加密数据然后使用 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 代码不提供 "right values"(根据服务器)。 Java 代码看起来正确吗?与 C# 代码相比,我做错了什么吗?
谢谢
我终于成功解决了这个问题。 :) 谢谢大家的帮助!
以下是修复
问题 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)。
希望这对某人有所帮助!