【发布时间】:2017-07-05 07:39:48
【问题描述】:
我有一个非对称加密公钥,采用 DER(可分辨编码规则)编码的二进制数据形式,这是 ASN.1(抽象语法符号一)编码的受限形式。
MIIB / DCCAWmgAwIBAgIQpbarEXfe8rVDlWlg2T + ixzAJBgUrDgMCHQUAMBgxFjAUBgNVBAMTDUJBTktESE9GQVIwMDEwIBcNMTMwNzEwMDkxMjU5WhgPMjA5OTEyMjkyMDAwMDBaMBgxFjAUBgNVBAMTDUJBTktESE9GQVIwMDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALZTB / 2vKxWwCGhUdywVvikj8klvlzpZTJbVd0bRIN82bTTzp53SDXczc7mkto4vsqelGqnyjZcigyhj5y60SWYggc83d89I + i2Vo77am6aW8tfx1p / x9Op6bDLIN8V0uyoBK8IhRbuiugHmbP69Fyq4vXQ4 + D2EzmmOuPRQfg4BAgMBAAGjTTBLMEkGA1UdAQRCMECAEAMkZd7uwQQG7803GjCmF7yhGjAYMRYwFAYDVQQDEw1CQU5LREhPRkFSMDAxghCltqsRd97ytUOVaWDZP6LHMAkGBSsOAwIdBQADgYEAhau3OD9QPoJm + H8v70WQmGUwJaS2IZORo / f8sMgUnVA6qoiD7BRkv8VVT0No4H + 77YnYR2mtlCkU1BenKM3bC4WQXsXawMDSOoJcqBVLBFpYzl / 8xpNrRyA8yyLUX37kXmH6mdioGLiNSKhQvX / XBYkTeOnsS2umt + zjS2JDS + G = P>
如何加密此密钥以生成文本 1234 的密码。
我尝试了以下来自互联网的示例代码:
public class ATMPINClient{
public static void main(String[] args) throws Exception {
String pkey = "MIIB/DCCAWmgAwIBAgIQpbarEXfe8rVDlWlg2T+ixzAJBgUrDgMCHQUAMBgxFjAUBgNVBAMTDUJBTktESE9GQVIwMDEwIBcNMTMwNzEwMDkxMjU5WhgPMjA5OTEyMjkyMDAwMDBaMBgxFjAUBgNVBAMTDUJBTktESE9GQVIwMDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALZTB/2vKxWwCGhUdywVvikj8klvlzpZTJbVd0bRIN82bTTzp53SDXczc7mkto4vsqelGqnyjZcigyhj5y60SWYggc83d89I+i2Vo77am6aW8tfx1p/x9Op6bDLIN8V0uyoBK8IhRbuiugHmbP69Fyq4vXQ4+D2EzmmOuPRQfg4BAgMBAAGjTTBLMEkGA1UdAQRCMECAEAMkZd7uwQQG7803GjCmF7yhGjAYMRYwFAYDVQQDEw1CQU5LREhPRkFSMDAxghCltqsRd97ytUOVaWDZP6LHMAkGBSsOAwIdBQADgYEAhau3OD9QPoJm+H8v70WQmGUwJaS2IZORo/f8sMgUnVA6qoiD7BRkv8VVT0No4H+77YnYR2mtlCkU1BenKM3bC4WQXsXawMDSOoJcqBVLBFpYzl/8xpNrRyA8yyLUX37kXmH6mdioGLiNSKhQvX/XBYkTeOnsS2umt+zjS2JDS+g=";
String atmPin = "1234";
byte[] key = pkey.getBytes();
encrypt(atmPin, key);
}
public static byte[] encrypt(String atmPin, byte[] keyCode)
throws Exception {
X509Certificate cert = X509Certificate.getInstance(keyCode);
RSAPublicKey rk = (RSAPublicKey) cert.getPublicKey();
System.out.println("Algorithm: " + rk.getAlgorithm());
System.out.println("Modules : " + rk.getModulus());
System.out.println("Hex - Modules : " + rk.getModulus().toString(16).toUpperCase());
System.out.println("Exponent : " + rk.getPublicExponent());
System.out.println("Name : " + cert.getSubjectDN().getName());
System.out.println("Issuer Name : " + cert.getIssuerDN().getName());
System.out.println("Not After : " + cert.getNotAfter());
System.out.println("Not Before : " + cert.getNotBefore());
System.out.println("Format : " + cert.getPublicKey().getFormat());
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, rk);
System.out.println("Actual PIN : " + atmPin);
byte[] PIN = cipher.doFinal(atmPin.getBytes("UTF-8"));
String encPIN = new sun.misc.BASE64Encoder().encode(PIN);
System.out.println("Encrypted Pin : " + encPIN);
return PIN;
}
}
出现以下错误:
Exception in thread "main" javax.security.cert.CertificateException: InvocationTargetException: javax.security.cert.CertificateException: invalid DER-encoded certificate data
at javax.security.cert.X509Certificate.getInst(X509Certificate.java:226)
at javax.security.cert.X509Certificate.getInstance(X509Certificate.java:186)
at atmpinclient.ATMPINClient.encrypt(ATMPINClient.java:33)
at atmpinclient.ATMPINClient.main(ATMPINClient.java:26)
Java Result: 1
请告知如何实现这种加密。
【问题讨论】:
-
我认为您在名为 RSAEncrypter 的类中调用 AESUtils.
encrypt的事实可能与此有关。此外,“无效的 AES 密钥长度”这行可能会提示您考虑为什么您的 RSA 加密方法会涉及 AES 错误...请阅读您的错误并查看您的代码,投入一些研究工作? -
我已经更新了我的加密方法,现在我得到了不同的异常,请指教
-
传入完整的 X509Certificate,而不仅仅是 base64 数据。
-
你能指导我怎么做吗?
-
查看 PEM X509 证书的内容,并将其与您传入的内容进行比较。
标签: java encryption asn.1 der