java 等效于 c# 的密码
java cipher to c# equivalent
我非常感谢任何帮助。我正在尝试将 rsa cryptor java implementation 转换为 c#。我需要加密信用卡数据。我使用的平台为 javascript 和 android 提供了加密 SDK,但我需要一个 C# 实现。
try {
cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "SC");
} catch (SecurityException se) {
//workaround for tests
Log.i("Moip SDK", "No SC provider, running test profile");
cipher = Cipher.getInstance("RSA");
}
BufferedReader pemReader = null;
pemReader = new BufferedReader(new InputStreamReader(
new ByteArrayInputStream(publicKey.getBytes("UTF-8"))));
StringBuffer content = new StringBuffer();
String line = null;
while ((line = pemReader.readLine()) != null) {
if (line.indexOf("-----BEGIN PUBLIC KEY-----") != -1) {
while ((line = pemReader.readLine()) != null) {
if (line.indexOf("-----END PUBLIC KEY") != -1) {
break;
}
content.append(line.trim());
}
break;
}
}
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keyFactory.generatePublic(new X509EncodedKeySpec(Base64.decode(content.toString(), Base64.DEFAULT))));
byte[] cipherText = cipher.doFinal(toHash().getBytes());
return Base64.encodeToString(cipherText, Base64.DEFAULT);
我创建的代码查看 java 中的实现,它可以工作但无法在平台上解密,我一定是忘记了什么。我的实现:
private string Payload(string number, string expirationMonth, string expirationYear, string cvc) {
return String.Join(
"&",
new List<string> {
$"number={number}",
$"cvc={cvc}",
$"expirationMonth={expirationMonth}",
$"expirationYear={expirationYear}",
}
);
}
private string Encrypt(string key, string payload) {
var publicKey = $"<RSAKeyValue><Modulus>{key}</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
var rsa = new RSACryptoServiceProvider(2048);
rsa.FromXmlString(publicKey);
var encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(payload), RSAEncryptionPadding.Pkcs1);
rsa.Dispose();
return Convert.ToBase64String(encryptedData);
}
var payload = Payload(number, expirationMonth, expirationYear, cvc);
hash = Encrypt(ClientManager.Environment.publicKeyCreditCard, payload);
欢迎使用 Whosebug。我 运行 你的代码,我可以在两个平台(Java & C#)上成功加密和解密。
所以在我看来,在 C# 上进行加密时解密失败的唯一原因是您没有正确转换 public 密钥。
我建议使用(因为它是公钥)在线转换器,如 https://superdry.apphb.com/tools/online-rsa-key-converter。
只需复制下方输入文本区域“PEM to XML”中的public密钥,就像这样(这是一个不安全 512位RSA-key 所以它会比你的短):
-----BEGIN PUBLIC KEY-----" +
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJn4LYaoLyuT+pD9NKI8wOvPrRjMIxGn
HbqIxUrpGsyj162fEOV4836oCZg0N8HFnt4Vivdjt8/7ZgLjeOygNGUCAwEAAQ==
-----END PUBLIC KEY-----
并按“转换”- 在下方您会看到 xml-format 中的 public 键:
<RSAKeyValue><Modulus>mfgthqgvK5P6kP00ojzA68+tGMwjEacduojFSukazKPXrZ8Q5XjzfqgJmDQ3wcWe3hWK92O3z/tmAuN47KA0ZQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
您必须向 C# 方法提供的部分密钥在模数之后:
mfgthqgvK5P6kP00ojzA68+tGMwjEacduojFSukazKPXrZ8Q5XjzfqgJmDQ3wcWe3hWK92O3z/tmAuN47KA0ZQ==
您应该注意该值 - 大多数情况下它是“AQAB”,但如果您收到另一个值,则必须在 C# 中调整您的源代码。
我非常感谢任何帮助。我正在尝试将 rsa cryptor java implementation 转换为 c#。我需要加密信用卡数据。我使用的平台为 javascript 和 android 提供了加密 SDK,但我需要一个 C# 实现。
try {
cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "SC");
} catch (SecurityException se) {
//workaround for tests
Log.i("Moip SDK", "No SC provider, running test profile");
cipher = Cipher.getInstance("RSA");
}
BufferedReader pemReader = null;
pemReader = new BufferedReader(new InputStreamReader(
new ByteArrayInputStream(publicKey.getBytes("UTF-8"))));
StringBuffer content = new StringBuffer();
String line = null;
while ((line = pemReader.readLine()) != null) {
if (line.indexOf("-----BEGIN PUBLIC KEY-----") != -1) {
while ((line = pemReader.readLine()) != null) {
if (line.indexOf("-----END PUBLIC KEY") != -1) {
break;
}
content.append(line.trim());
}
break;
}
}
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keyFactory.generatePublic(new X509EncodedKeySpec(Base64.decode(content.toString(), Base64.DEFAULT))));
byte[] cipherText = cipher.doFinal(toHash().getBytes());
return Base64.encodeToString(cipherText, Base64.DEFAULT);
我创建的代码查看 java 中的实现,它可以工作但无法在平台上解密,我一定是忘记了什么。我的实现:
private string Payload(string number, string expirationMonth, string expirationYear, string cvc) {
return String.Join(
"&",
new List<string> {
$"number={number}",
$"cvc={cvc}",
$"expirationMonth={expirationMonth}",
$"expirationYear={expirationYear}",
}
);
}
private string Encrypt(string key, string payload) {
var publicKey = $"<RSAKeyValue><Modulus>{key}</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
var rsa = new RSACryptoServiceProvider(2048);
rsa.FromXmlString(publicKey);
var encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(payload), RSAEncryptionPadding.Pkcs1);
rsa.Dispose();
return Convert.ToBase64String(encryptedData);
}
var payload = Payload(number, expirationMonth, expirationYear, cvc);
hash = Encrypt(ClientManager.Environment.publicKeyCreditCard, payload);
欢迎使用 Whosebug。我 运行 你的代码,我可以在两个平台(Java & C#)上成功加密和解密。
所以在我看来,在 C# 上进行加密时解密失败的唯一原因是您没有正确转换 public 密钥。
我建议使用(因为它是公钥)在线转换器,如 https://superdry.apphb.com/tools/online-rsa-key-converter。
只需复制下方输入文本区域“PEM to XML”中的public密钥,就像这样(这是一个不安全 512位RSA-key 所以它会比你的短):
-----BEGIN PUBLIC KEY-----" +
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJn4LYaoLyuT+pD9NKI8wOvPrRjMIxGn
HbqIxUrpGsyj162fEOV4836oCZg0N8HFnt4Vivdjt8/7ZgLjeOygNGUCAwEAAQ==
-----END PUBLIC KEY-----
并按“转换”- 在下方您会看到 xml-format 中的 public 键:
<RSAKeyValue><Modulus>mfgthqgvK5P6kP00ojzA68+tGMwjEacduojFSukazKPXrZ8Q5XjzfqgJmDQ3wcWe3hWK92O3z/tmAuN47KA0ZQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
您必须向 C# 方法提供的部分密钥在模数之后:
mfgthqgvK5P6kP00ojzA68+tGMwjEacduojFSukazKPXrZ8Q5XjzfqgJmDQ3wcWe3hWK92O3z/tmAuN47KA0ZQ==
您应该注意该值 - 大多数情况下它是“AQAB”,但如果您收到另一个值,则必须在 C# 中调整您的源代码。