java - 在java中用公钥加密,在C#中用私钥RSA解密

标签 java c# android encryption rsa

我有一个在后端用 C# 生成的公钥。

我想在Android/Java中加密消息,但是当我加密消息时,加密的消息与C#中的消息不同。

我尝试使用 RSA 算法的此规范进行加密:

‫‪KeyExchangeAlgorithm‬‬ ==> ‫‪RSA-PKCS1-KeyEx‬‬
‫‪KeySize‬‬ ==>2048 
‫‪RSAEncryptionPadding‬‬ ==> ‫‪false‬‬

这是后端期望我的规范;下面是我在Android上的实现算法。

String encoded = "";

byte[] encrypted = null;
try {

    byte[] publicBytes = Base64.decode(PUBLIC_KEY,Base64.DEFAULT);
    byte[] exponent = Base64.decode("AQAB",Base64.DEFAULT);
    BigInteger key = new BigInteger(1,publicBytes);
    BigInteger expo = new BigInteger(1,exponent);
    RSAPublicKeySpec keySpec = new RSAPublicKeySpec(key,expo);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PublicKey pubKey = keyFactory.generatePublic(keySpec);

    Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");

    //Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    encrypted = cipher.doFinal(txt.getBytes());
    encoded = Base64.encodeToString(encrypted, Base64.DEFAULT);
}
catch (Exception e) {
    e.printStackTrace();
    Log.e("3771",""+e.getMessage());
}
return encoded;

最佳答案

RSA 使用随机填充,因此签名每次都应该不同。使用 PKCS#1 v1.5 填充(出于历史原因“PKCS1Padding”),并且测试是在验证中,而不是再次加密同一消息。

关于java - 在java中用公钥加密,在C#中用私钥RSA解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59633418/

相关文章:

c# - 在 LinQ 表达式树中声明变量

java - 将图像存储在 Android SDCard 上并将路径 URL 存储在 SharedPreferences 中

java - Android textField 填充父级的剩余高度

java - 重构 Java Map of Map of Map

c# - asp :Repeater not working with validator的OnItemCommand

java - ImageView 上的 setBackgroundResource 返回 null

c# - Google Analytics 维度和指标验证

android - Listview 未填充且 getView 函数也未被调用

java - 从 HttpUrlConnection 的输入流读取速度缓慢

java - 服务器不解码数据包