java - 使用 RSA 算法包装和解开包装时出现 InvalidKeyException

标签 java exception rsa encryption

我是 Java 新手,想使用 RSA 算法包装对称 key 。就我而言,我不会生成用于包装的公钥,而是从 Microsoft Keystore 检索公钥。

// Encrypt the generated Symmetric AES Key using RSA cipher     
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", 
       ks.getProvider().getName()); rsaCipher.init(Cipher.WRAP_MODE, RSAPubKey);
byte[] encryptedSymmKey = rsaCipher.wrap(aeskey);

我收到一个 InvalidKeyException,如下所示:

Exception in thread "main" java.security.InvalidKeyException: Unsupported key type: Sun RSA public key, 1024 bits
  modulus: 171871587533146191561538456391418351861663300588728159334223437391061141885590024223283480319626015611710315581642512941578588886825766256507714725820048129123720143461110410353346492039350478625370269565346566901446816729164309038944197418238814947654954590754593726047828813400082450341775203029183105860831
  public exponent: 65537
    at sun.security.mscapi.RSACipher.init(RSACipher.java:176)
    at sun.security.mscapi.RSACipher.engineInit(RSACipher.java:129)
    at javax.crypto.Cipher.init(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)
    at com.sap.srm.crpto.client.applet.CryptoClass.main(CryptoClass.java:102)

如果有人对如何正确使用 SunMSCAPI 有任何建议,请告诉我?

最佳答案

正如错误消息所示,您正在使用 Sun RSA 公钥。这意味着无论您如何检索公钥(未提供代码,所以我不知道),它都不与 MSCAPI key 存储关联。我的猜测是您从证书中获取公钥。因此,解决问题的一种方法是使用 Sun 提供者 Cipher 类来包装 AES key :

Cipher rsa = Cipher.getInstance("RSA/ECB/PKCS1Padding");
rsaCipher.init(Cipher.WRAP_MODE, RSAPubKey);
byte[] encryptedSymmKey = rsaCipher.wrap(aeskey);

因此,在这种情况下,无需使用 MSCAPI 来实现您的目标 - 您可以使用标准提供程序。

关于java - 使用 RSA 算法包装和解开包装时出现 InvalidKeyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6729324/

相关文章:

java - spring boot中@Table注解添加表名后出现 "Table <table_name>"不存在异常如何解决

java - 我的代码有什么问题吗?为什么压缩和解压速度比其他应用慢?

java - 在 Stream API 中使用 checked 装饰器函数是好的解决方案吗?

javascript - 强大的 Javascript 异常处理

.NET RSACryptoServiceProvider.SignData 的 Java 等价物

java - 在 Java 中写入/保存文件的问题

java - Android Studio说静态字段将泄漏上下文

java - 连接两个响应

c - OpenSSL API 以 DER 格式而不是 PEM 读取私钥

java - 为什么不推荐错误处理?