我需要加密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)", "");
;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。