gpt4 book ai didi

java - 在 Java 中使用 RSA 公钥加密数据并在 Crypto++ 中解密

转载 作者:行者123 更新时间:2023-11-30 05:37:55 26 4
gpt4 key购买 nike

我正在尝试使用 Java 中的 RSA 公钥加密数据并使用 Crypto++ 对其进行解密。它会导致错误:

"RSA/EME-PKCS1-v1_5: ciphertext length of 24 doesn't match the required length of 128 for this key"

我做错了什么?

Java:

String cipher = Encryption.encryptStrRSA(txt, pubKeyk);

public static String encryptStrRSA(String str, PublicKey pubKey)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException, NoSuchProviderException {

Cipher cipher = Cipher.getInstance("RSA/NONE/PKCS1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);

byte[] encryptedAesKey = cipher.doFinal(str.getBytes());
String cipherStr = new String(encryptedAesKey);

System.out.println(cipherStr);
return cipherStr;
}

public static PublicKey strToPublicKey(String key64) throws GeneralSecurityException {
byte[] data = Base64.getDecoder().decode(key64);
X509EncodedKeySpec spec = new X509EncodedKeySpec(data);
KeyFactory fact = KeyFactory.getInstance("RSA");
return fact.generatePublic(spec);
}

public static String publicKeyToStr(PublicKey publ) throws GeneralSecurityException {
KeyFactory fact = KeyFactory.getInstance("RSA");
X509EncodedKeySpec spec = fact.getKeySpec(publ, X509EncodedKeySpec.class);
return Base64.getEncoder().encode(spec.getEncoded()).toString();
}

加密++:

using namespace CryptoPP;

RSAES_PKCS1v15_Decryptor priv(privString);
StringSource( cipher, cipherSize, true, new
Base64Decoder( new PK_DecryptorFilter(randPool, priv, new StringSink(sdata))));

最佳答案

使用 String 实例来保存二进制数据是危险的——您应该改用 byte[]。

此外,在 java 代码中没有对生成的密文进行 Base64 包装,但在 C++ 代码中它是从 Base64 中解包的。

修改您的代码以返回 byte[] 并使用 Base64 对结果进行编码:

public static byte[] encryptRSA(String str, PublicKey pubKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
return cipher.doFinal(str.getBytes());
}

String cipher = Base64.getEncoder().encodeToString(Encryption.encryptRSA("0123456789ABCDEF", pubKeyk));

然后您可以像以前一样在 Crypto++ 中解密。

祝你好运!

关于java - 在 Java 中使用 RSA 公钥加密数据并在 Crypto++ 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33051972/

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