当前位置: 首页 > 知识库问答 >
问题:

从Java BouncyCastle输出加密的PK8私钥

支才
2023-03-14
java.security.Security.addProvider(org.bouncycastle.jce.provider.BouncyCastleProvider());
keyGen = java.security.KeyPairGenerator.getInstance('RSA', 'BC');
keyGen.initialize(2048,  java.security.SecureRandom());
keypair = keyGen.generateKeyPair();
privateKey = keypair.getPrivate();
m=org.bouncycastle.openssl.PKCS8Generator.PBE_SHA1_3DES;
encryptorBuilder = org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8EncryptorBuilder(m);
encryptorBuilder.setRandom(java.security.SecureRandom());
encryptorBuilder.setPasssword(password);
oe = encryptorBuilder.build();
gen = org.bouncycastle.openssl.jcajce.JcaPKCS8Generator(privateKey,oe);
privKeyObj = gen.generate();
fos = java.io.FileWriter('private.pem');
pem = org.bouncycastle.openssl.jcajce.JcaPEMWriter(fos);
pem.writeObject(privKeyObj);
pem.flush();
fos.close();
textWriter = java.io.StringWriter();
pem = org.bouncycastle.openssl.jcajce.JcaPEMWriter(textWriter);
pem.writeObject(privateKey);
pem.flush();
thekey = char(textWriter.toString());
cmd = ['echo "' thekey '"|openssl pkcs8 -topk8 -out private.pk8 -inform PEM -outform DER -passout pass:' password];
system(cmd);
$openssl pkcs8 -inform DER -outform PEM -in private.pk8 -out private.pem
Error decrypting key
140735211835472:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1201:
140735211835472:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:tasn_dec.c:765:
140735211835472:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:697:Field=version, Type=PKCS8_PRIV_KEY_INFO

这段代码的目的是在最终用户的机器上生成一个CSR,然后我对它进行签名,并用机器的MAC地址(和salt)对它进行加密,这样程序就只能在授权的机器上运行,而且只有授权的机器才能访问我的PostgreSql数据库。

建议?

共有1个答案

赵河
2023-03-14

我想出来了。在我的原始代码中,我使用了BCPKCS12PbeOutputenCryptorBuilder。错了!正确的调用是jcepkcspbeoutputenCryptorBuilder。正确的代码(在MATLAB中,但转换成Java很简单)是:

    java.security.Security.addProvider(org.bouncycastle.jce.provider.BouncyCastleProvider());
    keyGen = java.security.KeyPairGenerator.getInstance('RSA', 'BC');
    keyGen.initialize(2048,  java.security.SecureRandom());
    keypair = keyGen.generateKeyPair();
    privateKey = keypair.getPrivate();
    builder=org.bouncycastle.pkcs.jcajce.JcaPKCS8EncryptedPrivateKeyInfoBuilder(privateKey);

    m=org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers.pbeWithSHAAnd3_KeyTripleDES_CBC;
    encryptorBuilder = org.bouncycastle.pkcs.jcajce.JcePKCSPBEOutputEncryptorBuilder(m);
    password = 'test';
    outputBuilder = encryptorBuilder.build(password);
    privKeyObj = builder.build(outputBuilder);
    fos = java.io.FileOutputStream('testkey.pk8');
    fos.write(privKeyObj.getEncoded());
    fos.flush();
    fos.close();

这将生成一个DER格式化的PCS#8文件。

    openssl pkcs8 -inform DER -outform PEM -in testkey.pk8 -out testkey.pem

现在返回PEM私钥。读取密钥:

    myPath = java.nio.file.Paths.get(pwd,'testkey.pk8');
    encodedKey = java.nio.file.Files.readAllBytes(myPath);
    privKeyObj =org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo(encodedKey);
    cp=org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter();
    cp.setProvider('BC');

    decryptorBuilder = org.bouncycastle.pkcs.jcajce.JcePKCSPBEInputDecryptorProviderBuilder();
    inputBuilder = decryptorBuilder.build(password);
    info = privKeyObj.decryptPrivateKeyInfo(inputBuilder);
    decodedKey=cp.getPrivateKey(info);
 类似资料:
  • 我在使用Java Bouncycastle的客户机和使用Python RSA库的密钥服务器之间交换私钥时遇到了困难。PEM格式用于通过REST传输密钥。keyserver无法解密我提供的密钥(加密密码更改时需要),它需要PKCS#1或PKCS#8密钥和PEM,如下所示: 但是BouncyCastle的输出(使用JCEpeEncryptorBuilder和JcaMiscPEMGenerator)的起

  • 我正在编写一个java程序,该程序应该生成私有rsa dsa ec密钥对并导出它们,程序还可以从pem文件中导入密钥。 导入密钥工作得很好,因为我已经使用bouncycastle从文件中读取对象,该文件将是并且以某种方式使用我可以读取加密的密钥。 现在的问题是,我正在尝试将私钥写到文件中,并且它应该被加密,我的问题是: 有没有方法使用类中内置的java或者使用bouncycastle或者我必须加密

  • 密钥: 要加密的消息: 加密消息(UTF-8): 解密函数代码:

  • 我试图通过RSA加密字符串。我也有java样本,但我不能正确地将其转换为c#。 RSA示例: 这是我在c#中生成的代码,但我的c#代码结果与javaCode结果不同。我的代码怎么了?

  • 我希望加载/使用Java应用程序中提供给我的加密私钥。请找到密钥(加密的私有密钥、解密的私有密钥和公钥如下所示)。 加密的私钥密码:“AWCTJPET9FL7UBTP97HX99GDOFEWKUF5TUXSUJEST2SEKYVKYINRFRJ6EISUTERF” 密钥是在NodeJS中使用加密生成的,使用: 我正在使用:运行时版本:11.0.7+10-B765.64amd64,OpenJDK 6

  • 问题内容: 我正在尝试使用RSA私钥加密某些内容。 我遵循以下示例:http : //www.junkheap.net/content/public_key_encryption_java, 但将其转换为使用私钥而不是公共密钥。遵循该示例,我认为我需要做的是: 读取DER格式的私钥 生成PCKS8EncodedKeySpec 从KeyFactory调用generatePrivate()获得一个私钥