java - 我在执行解密时遇到基数超出范围异常

标签 java exception encryption rsa biginteger

我正在生成一个 key 对并将其中一个 key 对转换为字符串,稍后使用以下代码将其插入数据库:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair generatedKeyPair = keyGen.genKeyPair();
PublicKey pubkey = generatedKeyPair.getPublic();
PrivateKey prvkey = generatedKeyPair.getPrivate();
System.out.println("My Public Key>>>>>>>>>>>"+pubkey);
System.out.println("My Private Key>>>>>>>>>>>"+prvkey);
String keyAsString = new BigInteger(prvkey.getEncoded()).toString(64);

然后,我从数据库中检索字符串,并使用以下代码将其转换回原始 key (其中 rst 是我的结果集):

String keyAsString = rst.getString("privateKey").toString();
byte[] bytes = new BigInteger(keyAsString, 64).toByteArray();
//byte k[] = "HignDlPs".getBytes(); 
PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(bytes); 
KeyFactory rsaKeyFac = KeyFactory.getInstance("RSA");  
PrivateKey privKey = rsaKeyFac.generatePrivate(encodedKeySpec);

在使用 privKey 进行 RSA 解密时,出现以下异常

java.lang.NumberFormatException: Radix out of range
at java.math.BigInteger.<init>(BigInteger.java:294)
at com.util.SimpleFTPClient.downloadFile(SimpleFTPClient.java:176)
at com.Action.FileDownload.processRequest(FileDownload.java:64)
at com.Action.FileDownload.doGet(FileDownload.java:94)

请指导。

最佳答案

您收到异常,因为您提供的基数大于 Character.MAX_RADIX (即 36)。换句话说,这是完全可以预测的。

不要使用BigInteger作为编码类。这不是它存在的目的。有很多不错的方法来执行 Base64 编码。我个人喜欢this public domain library .

String keyAsString = Base64.encode(prvkey.getEncoded());

然后:

byte[] bytes = Base64.decode(keyAsString);

关于java - 我在执行解密时遇到基数超出范围异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24003490/

相关文章:

javascript - 错误后继续执行 javascript,无需大量 try catch 语句

c# - 重新抛出 ex.InnerException 是个坏主意?

ssl - 通过ssl在客户端和服务器之间解密和加密

html - 离线安全 HTML 5 应用程序

java - Struts Web 应用程序 : Reusable Validation Client-Side & Server-Side

java - JAVA中根据方法参数动态创建对象列表

java - Exception.getMessage() 为空

android - Android 4.4 可以支持 SHA256 密码吗?

java - FragmentStatePagerAdapter 与 Glide 一起使用会导致 NullPointerException

java - 生成所有可能的二进制组合