Java 使用X.509公共证书进行加密和解密

Java 使用X.509公共证书进行加密和解密,java,shell,ssl,encryption,openssl,Java,Shell,Ssl,Encryption,Openssl,我想用X.509证书和继承的公钥加密我的post负载。到目前为止,我有这个java代码来执行加密 private String encrypt(String str) throws Exception { ClassPathResource classPathResource = new ClassPathResource("testcert1.crt"); CertificateFactory certificateFactory = CertificateFactory.ge

我想用X.509证书和继承的公钥加密我的post负载。到目前为止,我有这个java代码来执行加密

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
命令在控制台上验证我的加密字符串,但失败了

我可以使用以下命令读取证书:
opensslx509-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)

但是我无法找出使用该证书加密/解密文本文件的命令行,因为您使用的是非对称加密,如果使用证书的公钥进行加密,则只能使用相应的私钥进行解密。确保您拥有该密钥并将其用于解密。

由于您使用的是非对称加密,如果您使用证书的公钥进行加密,则只能使用相应的私钥进行解密。确保您拥有该密钥并将其用于解密。

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

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

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

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

md5withrsa加密
和4096位密钥是真正的不匹配。也许你应该考虑<代码> Sa256WiTrSASt加密。MD5的剩余安全性不足64位,而4096位模数的安全性超过128位。MD5已损坏,无法提供随时间推移的碰撞阻力。好的,我将考虑这一点。我不是那个制造钥匙的人,而是从第三方收到钥匙的消费者。为什么?为什么不像其他人一样使用HTTPS?还有什么加密字符串。如果证书无效,如何获得加密?异常的堆栈跟踪在哪里?
md5WithRSAEncryption
和4096位密钥是真正的不匹配。也许你应该考虑<代码> Sa256WiTrSASt加密。MD5的剩余安全性不足64位,而4096位模数的安全性超过128位。MD5已损坏,无法提供随时间推移的碰撞阻力。好的,我将考虑这一点。我不是那个制造钥匙的人,而是从第三方收到钥匙的消费者。为什么?为什么不像其他人一样使用HTTPS?还有什么加密字符串。如果证书无效,如何获得加密?异常的堆栈跟踪在哪里?好的,但是如何使用openssl命令在控制台上进行加密?好的,但是如何使用openssl命令在控制台上进行加密?如何使用等效命令解密上述命令的结果?我找到了方法。加密:
echo-n'string to Encrypt'| openssl rsautl-Encrypt-certin-inkey testcert1.crt-out enc.txt
Decrypt:
openssl rsautl-Decrypt-in enc.txt-inkey testcert1private.key
解密上述命令结果的等效命令是什么?我找到了方法。加密:
echo-n'要加密的字符串'| openssl rsautl-Encrypt-certin-inkey testcert1.crt-out enc.txt
Decrypt:
openssl rsautl-Decrypt-in enc.txt-inkey testcert1private.key