作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要加密 JSON 数据,以便使用 RSA 公钥在 http 正文中发送它,我加载 RSA 公钥文件 (.der) 并且工作正常。
客户端向我发送了 RSA 公钥文件 (.bin)。所以当我运行我的程序时,我收到此错误
Caused by: java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=109, too big.
at sun.security.x509.X509Key.decode(X509Key.java:380) ~[na:1.6.0_45]
at sun.security.x509.X509Key.decode(X509Key.java:386) ~[na:1.6.0_45]
at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:66) ~[na:1.6.0_45
我的 PublicKeyReader 类:
public class PublicKeyReader {
public static PublicKey getpublicKey(String filename)
throws Exception {
File file = new File(filename);
FileInputStream fis = new FileInputStream(filename);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int) file.length()];
dis.readFully(keyBytes);
dis.close();
X509EncodedKeySpec spec =
new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
}
}
我的主类中的加密部分是:
// Encrypt Data with AES
byte[] keyData = random.generateSeed(16);
SecretKey skeySpec = new SecretKeySpec(keyData, "AES");
Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] ivParams = new byte[aes.getBlockSize()];
IvParameterSpec iv = new IvParameterSpec(ivParams);
aes.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
// Lecture du certificat (cle publique RSA)
PublicKey clePublique = PublicKeyReader.getpublicKey("./src/main/resources/publique.bin");
//String clePublique1 = Base64.encodeBase64String(clePublique.getEncoded()).replaceAll(
// "(\\r|\\n)", "");
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.WRAP_MODE, clePublique);
byte[] wrappedKey = cipher.wrap(skeySpec);
// encodedToken : Mot de passe symétrique crypté avec le certificat
// public (RSA) mis à la disposition de la banque par BAM
String encodedToken = Base64.encodeBase64String(wrappedKey).replaceAll(
"(\\r|\\n)", "");
;
最佳答案
经过多次研究,我找到了答案以及我弄乱的代码部分。
在我的 PublicReaderKey 类中,我更改了读取 RSA 公钥的方式
这部分代码:
public static PublicKey getpublicKey(String filename)
throws Exception {
InputStream in = new FileInputStream(filename);
ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(
in));
try {
BigInteger m = (BigInteger) oin.readObject();
BigInteger e = (BigInteger) oin.readObject();
KeyFactory fact = KeyFactory.getInstance("RSA");
return fact.generatePublic(new RSAPublicKeySpec(m, e));
} catch (Exception e) {
throw new RuntimeException("Erreur de sérialisation parasite", e);
} finally {
oin.close();
System.out.println("Fermeture de lecture fichier .");
}
}
}
关于java - 加载RSA公钥错误DerInputStream.getLength() : lengthTag=109,太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59171252/
我是一名优秀的程序员,十分优秀!