这个问题在这里已经有了答案:
rsa encyrption-字节数组和字符串之间的转换[重复](1个答案)
上个月关门了。
我们正在尝试rsa加密和解密,而问题发生在解密时。这是我们的解密密码
Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding");
OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-1", "MGF1", new MGF1ParameterSpec("SHA-1"), PSpecified.DEFAULT);
oaepFromInit.init(Cipher.DECRYPT_MODE, rsaPrivateKey, oaepParams);
byte[] dec = oaepFromInit.doFinal(encrytpedData.getBytes());
这个 encrytpedData
是这样的
s11Pyj5rrVOfOiWtxpGq+K5D+pYi16CyyX/EwKfMErBkHJ4aVlTmnhrfeCS7LEeXgTs3gkFp96I/oTedG/rXxF2hTAmMH40k0joKJbRtzO858/0dcaaE1uNzr/rI0Jj3ebXPLGhefCMNNpyFH5V4ukVo6vtev5Z9U8oNkUQolbX/r5jJJomkKCCnzGoHMdQg5dafj9Sw/qakO13501YBrkxS0i9ca0GZ8Ll42NwkOZuInh+MAu+gYW4vAr284eJsqgLgTp0+MS1tmfwR6EXgspk1nYR/U84P3MBZAdpmD3nxsVV3iVOCUeoqVyd4kw7M2pvXev6hMbMN4P1nnomo8g==
引发了一个错误异常 javax.crypto.IllegalBlockSizeException: Data must not be longer than 256 bytes
我们查看了这个链接,得到了一个illegalblocksizeexception:在使用rsa时,数据不能超过256字节,但问题是我们向 encrytpedData
.
这是我们在网上得到的密码
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.generateKeyPair();
RSAPublicKey pubkey = (RSAPublicKey) kp.getPublic();
RSAPrivateKey privkey = (RSAPrivateKey) kp.getPrivate();
// --- encrypt given algorithm string
Cipher oaepFromAlgo = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
oaepFromAlgo.init(Cipher.ENCRYPT_MODE, pubkey);
byte[] ct = oaepFromAlgo.doFinal("chakka".getBytes(StandardCharsets.UTF_8));
// --- decrypt given OAEPParameterSpec
Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding");
OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-1", "MGF1", new MGF1ParameterSpec("SHA-1"), PSpecified.DEFAULT);
oaepFromInit.init(Cipher.DECRYPT_MODE, privkey, oaepParams);
byte[] pt = oaepFromInit.doFinal(ct);
System.out.println("Printing decoded string");
System.out.println(new String(pt, StandardCharsets.UTF_8));
在这里,他们直接提供加密数组,工作正常,但在我们的情况下,我们得到 encrytpedData
作为字符串。两个代码相同,但加密数据的提供不同。
byte[] dec = oaepFromInit.doFinal(encrytpedData.getBytes());
这就是我们得到异常的地方,所以我们尝试转换 encrytpedData
至 byte[]
通过这两个链接以不同的方式
rsa encyrption-字节数组和字符串之间的转换[duplicate]
尝试使用aes加密和解密字符串时发生illegalblocksizeexception
所以我们试着这样做 byte[] dec = oaepFromInit.doFinal(Base64.getDecoder().decode(encrytpedData));
导致了这一切 javax.crypto.BadPaddingException: Message is larger than modulus
. byte[] dec = oaepFromInit.doFinal(encrytpedData.getBytes(StandardCharsets.UTF_8));
也有同样的例外 javax.crypto.IllegalBlockSizeException: Data must not be longer than 256 bytes
.
任何帮助都将不胜感激
1条答案
按热度按时间5ssjco0h1#
下面的完整示例代码取自我的私有跨平台项目,应该可以使用。它使用带有2048密钥对的rsa加密对字符串进行加密,并使用带有sha-1的oaep填充作为散列。
加密数据采用base64编码。出于演示的目的,我使用pem格式的静态(硬编码)密钥-在生产中永远不要这样做。
您可以在此处联机运行代码:https://repl.it/@javacrypto/cpcjavarsaencryptionoaepsha1string
这是输出:
安全警告:代码没有任何异常处理,使用静态(硬编码)密钥,仅用于教育目的。
代码: