Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用bouncycastle/spongycastle读取加密私钥_Java_Rsa_Bouncycastle_Pem_Pkcs#8 - Fatal编程技术网

Java 使用bouncycastle/spongycastle读取加密私钥

Java 使用bouncycastle/spongycastle读取加密私钥,java,rsa,bouncycastle,pem,pkcs#8,Java,Rsa,Bouncycastle,Pem,Pkcs#8,我有一个受密码保护的加密RSA私钥,它是用PyCrypto(2.6.1)创建的,根据他们的文档,它有以下格式:PrivateKeyInfo,PKCS#8(DER序列),PEM(RFC1423),请参阅 [ 如何使用Bouncycastle/Spongycastle解密此RSA密钥 我在Google上搜索了很长时间,只得到了一些结果,要么是1.50版无法使用(因为PEMReader已被弃用并被删除),要么是PEMParser的示例似乎无法读取此格式。顺便问一下:有没有我错过的关于Bouncycas

我有一个受密码保护的加密RSA私钥,它是用PyCrypto(2.6.1)创建的,根据他们的文档,它有以下格式:
PrivateKeyInfo,PKCS#8(DER序列),PEM(RFC1423)
,请参阅 [

如何使用Bouncycastle/Spongycastle解密此RSA密钥

我在Google上搜索了很长时间,只得到了一些结果,要么是1.50版无法使用(因为PEMReader已被弃用并被删除),要么是PEMParser的示例似乎无法读取此格式。顺便问一下:有没有我错过的关于Bouncycastle的文档

这是我的加密私钥的标头:

-----BEGIN PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,68949227DD8A502D
xyz...
如果有人能帮助我,我将非常感激!

使用答案,你应该做以下事情

File privateKeyFile = new File(privateKeyFileName); // private key file in PEM format
PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile));
Object object = pemParser.readObject();
PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(password.toCharArray());
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
KeyPair kp;
if (object instanceof PEMEncryptedKeyPair) {
    kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv));
}
那么你可以说

PrivateKey key = kp.getPrivateKey();

总结一下我在这个话题上的发现,并:

如果您想获得模数,以下是最终代码,例如:

privateKey.getModulus();
导入java.io.FileReader;
导入java.security.security;
导入java.security.KeyFactory
导入org.bouncycastle.jce.provider.BouncyCastleProvider;
//请注意,您需要添加“pkix”包,例如“org.bouncycastle:bcpkix-jdk15on”
导入org.bouncycastle.openssl.PEMEncryptedKeyPair;
导入org.bouncycastle.openssl.PEMParser;
导入org.bouncycastle.openssl.pemdeccryptorProvider;
导入org.bouncycastle.openssl.PEMKeyPair;
导入org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
导入org.bouncycastle.openssl.jcajce.jcepedecryptorProviderBuilder;
//对于JcaPEMKeyConverter().setProvider(“BC”)
addProvider(新org.bouncycastle.jce.provider.BouncyCastleProvider());
//使用bcpkix-jdk14-1.48
PEMParser PEMParser=newpemparser(newfilereader(file));
Object Object=pemParser.readObject();
JcaPEMKeyConverter=新的JcaPEMKeyConverter().setProvider(“BC”);
密钥对kp;
if(PEMEncryptedKeyPair的对象实例)
{
//加密密钥-我们将使用提供的密码
PEMEncryptedKeyPair ckp=(PEMEncryptedKeyPair)对象;
PEMDecryptorProvider decProv=new JcePEMDecryptorProviderBuilder().build(password.tocharray());
kp=converter.getKeyPair(ckp.decryptKeyPair(decProv));
}
其他的
{
//未加密密钥-无需密码
PEMKeyPair ukp=(PEMKeyPair)对象;
kp=转换器.getKeyPair(ukp);
}
//RSA
KeyFactory keyFac=KeyFactory.getInstance(“RSA”);
RSAPrivateCrtKeySpec privateKey=keyFac.getKeySpec(kp.getPrivate(),RSAPrivateCrtKeySpec.class);
返回私钥;
然后你可以打电话,例如:

privateKey.getModulus();

以下静态方法将处理加密私钥的所有以下PEM编码样式:

-----BEGIN ENCRYPTED PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
-----BEGIN EC PRIVATE KEY-----
首先确保您已将BC注册为安全提供商,然后可以使用此方法:

  static public PrivateKey stringToPrivateKey(String s, String password)
      throws IOException, PKCSException {

    PrivateKeyInfo pki;

    try (PEMParser pemParser = new PEMParser(new StringReader(s))) {

      Object o = pemParser.readObject();

      if (o instanceof PKCS8EncryptedPrivateKeyInfo) {

        PKCS8EncryptedPrivateKeyInfo epki = (PKCS8EncryptedPrivateKeyInfo) o;

        JcePKCSPBEInputDecryptorProviderBuilder builder =
            new JcePKCSPBEInputDecryptorProviderBuilder().setProvider(bc);

        InputDecryptorProvider idp = builder.build(password.toCharArray());

        pki = epki.decryptPrivateKeyInfo(idp);
      } else if (o instanceof PEMEncryptedKeyPair) {

        PEMEncryptedKeyPair epki = (PEMEncryptedKeyPair) o;
        PEMKeyPair pkp = epki.decryptKeyPair(new BcPEMDecryptorProvider(password.toCharArray()));

        pki = pkp.getPrivateKeyInfo();
      } else {
        throw new PKCSException("Invalid encrypted private key class: " + o.getClass().getName());
      }

      JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(bc);
      return converter.getPrivateKey(pki);
    }
  }

这是加密密钥(CBC模式和输入向量为68949227DD8A502D的三元组)。因此,在PEMReader能够读取它之前,必须先对其进行解密。请注意,该密钥是使用旧的(且不安全)密钥加密的算法。目前的做法是使用PKCS#8保护私钥。Bouncy Castle在JceOpenSSLPKCS8DecryptorProviderBuilder类中支持PKCS#8解密。解析的PEM对象也可以是PrivateKeyInfo,私钥通过
converter.getPrivateKey((PrivateKeyInfo)对象);