【问题标题】:Java RSA encryption with public key使用公钥的 Java RSA 加密
【发布时间】:2014-01-07 07:10:23
【问题描述】:

我正在尝试使用从证书中获得的公钥加密文件。

PublicKey publicKey = cert.getPublicKey();
cipher = Cipher.getInstance("RSA", "BC");        
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

抛出异常:java.lang.IllegalArgumentException: not an RSA key!

我试过了:

KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKey.getEncoded());
PublicKey rsaPublicKey = KeyFactory.getInstance("RSA").generatePublic(spec);

但是会抛出 java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: Invalid RSA public key

org.bouncycastle.asn1.pkcs.RSAPublicKey 的构造函数需要 2 个BigIntegers(可能是 模数公共指数)。

查看cert.getPublicKey() 会发现它是DSAPublicKeyImpl

如何将其转换为Cipher.getInstance("RSA", "BC") 可用的RSAPublicKey(或其他任何内容)?

【问题讨论】:

    标签: java encryption cryptography


    【解决方案1】:

    DSA 密钥不能用于 RSA 加密。 DSA 仅用于签名,它使用不同的数学运算,需要不同的密钥信息。

    改为生成一个 RSA 密钥,并将其与实现 CMS 或 PGP 等标准的库一起使用(BouncyCastle 两者都支持)。它们使用对称密码的随机密钥来加密文件,然后使用每个接收者的公钥加密该密钥。这是一种更好的方法有很多原因。

    【讨论】:

    • 是的,我实际上是在尝试加密对称密钥,我只是想简化问题。不过,我无法生成收件人的密钥,我有他的证书,如何为他加密密钥?
    • @user3116865 DSA 仅用于签名 仅。如果收件人想要接收加密消息,他需要进行 Diffie-Hellman 密钥交换,用他的 DSA 证书签署他对交易所的贡献,或者生成一个新的 RSA 密钥对,以便您可以加密密钥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2014-06-23
    • 1970-01-01
    • 2011-11-07
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多