gpt4 book ai didi

java - 解密Android RSA : Invalid Ciphertext Exception

转载 作者:行者123 更新时间:2023-12-01 10:58:17 26 4
gpt4 key购买 nike

我正在创建一个跨平台 Android/Windows 应用程序。

我使用此代码在 Android 中生成公钥,我可以使用 Windows 应用程序生成的测试公钥:

         String AppKeyPub = "MIGHAoGBAONcDWYnbGGOIG1wfHy8v54/2Ch2ZCewcM6TGGtnvHOa/53ekPlCYHXG5UDeaCUxPwPK" +
"Fx9qikj04nxF+tKl9GnV4RS+3kDQPkunlJ4pk52PiKVGaVpOWOli1Y31zJJZ9ufqLySEycJVuqiI" +
"Z9kektzkHdAIxNKlPDn4GQa2mjz/AgER";

try {
// PREP PUBLIC KEY
byte[] decoded = Base64.decode(AppKeyPub,0);
org.bouncycastle.asn1.pkcs.RSAPublicKey pkcs1PublicKey = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(decoded);
BigInteger modulus = pkcs1PublicKey.getModulus();
BigInteger publicExponent = pkcs1PublicKey.getPublicExponent();
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey publicKey = kf.generatePublic(keySpec);

然后我使用此代码来加密测试消息:

byte[] input = "Hello from Android!".getBytes("UTF-8");
Cipher cipher = Cipher.getInstance("RSA", "BC");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
ctLength += cipher.doFinal(cipherText, ctLength);
String encodedData = Base64.encodeToString(cipherText, messageCount);
System.out.println(new String(encodedData));
System.out.println(ctLength);

这是Android生成的加密测试消息:

fy1l1g/Tpxer4mR3bO6WQdfmi93I/YjpZZDGvIiZ6UU/VZWhnmgmuU1zM6EqwppqQTMkfsKPk5kAWhSYH8+tbyvgh/Cd48rTKJ39MCfnwCNZvSvNKETZbhgy5fVGL/Uisn16AOae0DI4gV4kubrGswhEFUpyp8seAPclKgHbGuQ=

问题是当我尝试解密 Windows 应用程序中的消息时,它失败并显示错误消息:

RSA/OAEP-MGF1(SHA-1):invalid ciphertext

我尝试了 Android BC 算法的不同组合,它们都给出了相同的结果。我也尝试过 no_wrap no_padding 等。谁能告诉我我做错了什么?感谢您提供任何建议。

最佳答案

您在 Windows 应用程序中有 OAEP 填充。至少在以后的版本中,OAEP 填充是默认的。我将向您展示如何按原样执行 OAEP 填充 - 可能是在鲜为人知的 KEM 方案之后 - 可能是 RSA 最安全的方案:

Cipher cipher = Cipher.getInstance("RSA/NONE/OAEPPADDING", "BC");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
ctLength += cipher.doFinal(cipherText, ctLength);

关于java - 解密Android RSA : Invalid Ciphertext Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33488365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com