我正在生成一个 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/