使用RSA算法进行包装和解包时出现InvalidKeyException

时间:2011-07-18 06:33:08

标签: java exception rsa encryption

我是Java的新手,想要使用RSA算法包装对称密钥。在我的例子中,我没有生成包装的公钥,而是从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,请告诉我。

1 个答案:

答案 0 :(得分:2)

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

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

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