使用RSA加密时出现DSA密钥不支持错误的解决咨询
解决RSA加密时出现DSA公钥的InvalidKeyException问题
哈哈,这个坑我之前也踩过!报错里提到DSA是因为你代码里拿到的bobPublicKey实际上是DSA类型的公钥,但你却想用它来做RSA加密,Java的安全提供者当然不支持这种跨算法操作啦。下面给你一步步捋清楚解决办法:
问题根源
你从aliceKeystore里获取的bobcert对应的证书,里面的公钥是用DSA算法生成的,而不是RSA。DSA是数字签名专用算法,本身不用于加密(Java的安全实现也明确禁止用DSA密钥执行RSA加密操作),所以才会抛出InvalidKeyException。
解决步骤
1. 确保Bob的密钥对是RSA类型
首先要回溯生成Bob密钥对和证书的过程:
- 生成Bob密钥对时,必须使用
KeyPairGenerator.getInstance("RSA"),而不是DSA。 - 如果你的
aliceKeystore.jks里的bobcert已经是DSA类型的,得重新生成RSA密钥对和证书,再导入到keystore中替换旧的条目。
2. 修正RSA Cipher的实例化(可选但强烈推荐)
直接写Cipher.getInstance("RSA")会依赖JDK默认的填充模式,不同版本的默认填充可能不一致,且安全性较低。建议明确指定安全的填充模式:
Cipher keyCipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
3. 修复对称密钥加密的代码逻辑
你原来的代码里,keyCipher.doFinal(encryptedkey)的返回值没有保存,等于白加密了!要把加密后的结果赋值给变量,不然你打印的还是原始的对称密钥:
// 正确加密对称密钥并保存结果 byte[] encryptedSymmetricKey = keyCipher.doFinal(symmetricKey.getEncoded()); System.out.println("Encrypted Symmetric Key: " + Arrays.toString(encryptedSymmetricKey));
(记得导入java.util.Arrays才能用Arrays.toString正常打印字节数组)
额外小提醒
你生成IV的代码也有漏洞:byte[] ivBytes = new byte[16];只是创建了空字节数组,没有填充随机值!CBC模式的IV必须是随机的,不然安全性会大打折扣,补上这行:
byte[] ivBytes = new byte[16]; secureRandom.nextBytes(ivBytes); // 生成随机IV IvParameterSpec iv = new IvParameterSpec(ivBytes);
内容的提问来源于stack exchange,提问作者Loly
相关产品推荐
相关产品推荐

