4

您好我正在尝试解密使用 RSA 公钥加密的文件。我有一个对应于 pubkey 的 3072 位 RSA 私钥。该文件包含密钥的 PKCS8 编码的原始字节。我在一个字节数组 rsa_priv 中有。

public void decrypt()
{
try
{
    SecretKeySpec sk=new SecretKeySpec(rsa_priv,"RSA/EBC/PKCS8");
    Cipher dec = Cipher.getInstance("RSA");
    dec.init(Cipher.DECRYPT_MODE, sk,new IvParameterSpec(iv));
     //OAEPWithSHA-512AndMGF1Padding        
     byte temp[];
     temp=dec.doFinal(sess);
     String t=temp.toString();
     System.out.println("Session key is:"+ t);
     //session=dec(sess,rsa_priv);OAEPWithSHA-256AndMGF1Padding
}
catch (Exception e)
{
    System.out.println("Exception occured:"+ e);
}
}

当我运行此代码时,我得到以下信息

Exception occured:java.security.InvalidKeyException: No installed provider 
supports this key: javax.crypto.spec.SecretKeySpec

我已经进口了这些

import java.io.*;
import javax.crypto.*; 
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.KeyGenerator;
import java.security.*;
import javax.crypto.SecretKey;
import javax.crypto.spec.OAEPParameterSpec;

有人请帮帮我

4

3 回答 3

6

假设您只有内部编码(例如由 提供RSAPrivateKey.getEncoded())而不是实际的 PKCS#8 加密的 RSA 私钥:

PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(rsa_priv);
KeyFactory rsaFact = KeyFactory.getInstance("RSA");
RSAPrivateKey key = (RSAPrivateKey) rsaFact.generatePrivate(spec);
于 2012-09-12T18:11:05.373 回答
1

有几个问题。

首先,它是ECB模式,而不是EBC; 这是您遇到的第一个错误。

其次,RSA 密钥不是 SecretKeySpec。

如何用java读取密码加密密钥?显示了一种检索 RSA 密钥的方法,一旦你有了它,http://www.flexiprovider.de/examples/ExampleRSA.html就会显示如何使用它。

于 2012-09-11T12:08:57.980 回答
0

在将其发布到此处之前,您实际上应该将错误复制并粘贴到 Google 中。

可能会解决您的问题。

基本上,您需要一种init()方法来设置提供程序,如链接中所述。

/**
 * Init java security to add BouncyCastle as an RSA provider
 */
public static void init() {
   Security.addProvider(new BouncyCastleProvider());
}

为此,您需要导入BouncyCastle 库

于 2012-09-11T08:21:25.487 回答