You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:38:03