【发布时间】:2019-02-08 09:30:54
【问题描述】:
我在 Java (Android) 中使用带有 PKCS1 填充的 RSA 加密文本,之后我必须将其作为 Web 服务正文的一部分发送。我的 Java 代码的输出不起作用,但如果我在 C# 中执行,技术上相同的算法,那么它可以正常工作。
这是运行良好的 C# 代码:
static void Main(string[] args)
{
var plainData = "plain_text";
RSA publicKeyEncryptor = getRSAPublic(@"<public_key>");
var plainBytes = Encoding.ASCII.GetBytes(plainData);
string encryptedPayload = System.Convert.ToBase64String(publicKeyEncryptor.Encrypt(plainBytes, RSAEncryptionPadding.Pkcs1));
Console.WriteLine(encryptedPayload);
}
public static RSA getRSAPublic(string publicKey)
{
string publicKeyPem = $"-----BEGIN PUBLIC KEY-----\r\n{ publicKey }\r\n-----END PUBLIC KEY-----\r\n";
var pemReader = new PemReader(new StringReader(publicKeyPem));
AsymmetricKeyParameter keyPairRaw = (AsymmetricKeyParameter)pemReader.ReadObject();
RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaKeyParameters)keyPairRaw);
RSA rsaObj = System.Security.Cryptography.RSA.Create();
rsaObj.ImportParameters(rsaParams);
return rsaObj;
}
当我尝试将其转换为 Java (Android) 时,这是我想出的代码,但它不会生成有效的输出:
public static void main(String args[]) {
String stringToEncrypt = "plain_text";
String publicKey = "<public_key>";
System.out.println(encrypt(stringToEncrypt, publicKey))
}
public String encrypt(String plain, String publicKey) {
try {
byte[] keyBytes = Base64.decode(publicKey, Base64.DEFAULT);
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
PublicKey rsaPublicKey = KeyFactory.getInstance("RSA").generatePublic(spec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, rsaPublicKey);
byte[] plainTextBytes = plain.getBytes(Charset.forName("US-ASCII"));
byte[] encryptedBytes = cipher.doFinal(plainTextBytes);
return Base64.encodeToString(encryptedBytes, Base64.NO_WRAP));
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
有什么不同?
谢谢!
【问题讨论】:
-
可能是“RSA/
CBC/PKCS1Padding” -
该算法不存在,我得到:
java.security.NoSuchAlgorithmException: No provider found for RSA/CBC/PKCS1Padding我也尝试了RSA/ECB/PKCS1Padding或RSA/NONE/PKCS1Padding,但它也不起作用。 -
您在使用 BouncyCastle 吗?这是安卓吗?
-
是的,这是安卓。我尝试通过使用
Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");请求密码来使用 BouncyCastle 提供程序,但结果相同。 -
@zaitsman 我用Java 1.8做了一个测试,结果是一样的,所以它似乎与Android无关
标签: java c# android encryption rsa