2014-02-14 72 views
2

我想用X.509证书和继承的公钥加密我的后期有效载荷。到目前为止,我有这个Java代码来执行加密使用X.509公共证书加密和解密

private String encrypt(String str) throws Exception { 
    ClassPathResource classPathResource = new ClassPathResource("testcert1.crt"); 
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); 
    X509Certificate certificate = (X509Certificate)certificateFactory.generateCertificate(classPathResource.getInputStream()); 
    PublicKey pk = certificate.getPublicKey(); 
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING"); 
    cipher.init(Cipher.ENCRYPT_MODE, pk); 
    return Base64.encodeBase64String(cipher.doFinal(str.getBytes())); 
} 

它返回base64编码的字符串。从端点我总是得到结果,证书是无效的。

所以我想验证我的加密字符串在控制台上使用openssl命令,但没有这样做。

我可以读出与证书:openssl x509 -in testcert1.crt -text -noout

Certificate: 
    Data: 
     Version: 3 (0x2) 
     Serial Number: 0 (0x0) 
     Signature Algorithm: md5WithRSAEncryption 
     Issuer: C=xxx, ST=xxx, L=xxx, O=xxx, OU=xxx, CN=xxx 
     Validity 
      Not Before: Jul 24 11:40:39 2013 GMT 
      Not After : Jul 24 11:40:39 2015 GMT 
     Subject: C=xxx, ST=xxx, L=xxx, O=xxx, OU=xxx, CN=xxx 
     Subject Public Key Info: 
      Public Key Algorithm: rsaEncryption 
      RSA Public Key: (4096 bit) 
       Modulus (4096 bit): 
       .... 
      Exponent: 65537 (0x10001) 

但我想不通的命令行,如果加密/使用该证书

+0

'md5WithRSAEncryption'和4096位的密钥是一个真正的* *不匹配。也许你应该考虑'sha256WithRSAEncryption'。 MD5的安全性还不到64位,而4096位的模数超过了128位的安全性。 MD5被破坏,并且不能提供随时间的碰撞阻力。 – jww

+0

好的,我会考虑这一点。我不是那个创造那个钥匙的人,而是那个从第三方那里得到钥匙的消费者。 – MatthiasLaug

+0

为什么?为什么不像其他人一样使用HTTPS? – EJP

回答

-1

当你正在使用非对称加密解密的文本文件,您使用您的证书的公钥进行加密,您只能使用相应的私钥进行解密。确保你有这个密钥并将其用于解密。

+2

好的,但如何使用openssl命令在控制台上执行加密? – MatthiasLaug

1

可以使用OpenSSL的使用下面的命令验证您的加密字符串:

echo -n 'string to encrypt' | openssl rsautl -encrypt -certin -inkey testcert1.crt | base64