繁体   English   中英

使用公钥在java中加密并使用私钥RSA在C#中解密

[英]Encrypt in java with public key and decrypt in C# with private key 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"由于历史原因)并且测试"PKCS1Padding"验证,而不是再次加密相同的消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM