gpt4 book ai didi

java - 从 Java BouncyCaSTLe 输出加密的 PK8 私钥

转载 作者:行者123 更新时间:2023-11-30 07:33:18 26 4
gpt4 key购买 nike

我正在尝试在 Matlab 中使用 Java 生成加密的私钥和 CSR。 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();

如果我加密 key 并将其输出为 PEM:

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();

我得到了一把非常好的 key 。问题是我想将 key 与 jdbc 一起使用,因此我需要 DER 格式的 pk8 key 。我不知道如何将其从 BouncyCaSTLe 中取出。成功的拼凑解决方法:

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);

现在,显然这会暴露未加密的私钥和密码。我已经尝试了各种方法来将 privKeyObj 强制为 DER,但它们通常留给我的是:

$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 地址(和盐)进行加密,以便该程序只能在授权计算机上运行,并且只有授权的计算机才能访问我的 PostgreSql 数据库。

建议?

最佳答案

我明白了。在我的原始代码中,我使用了 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 私钥。读取 key :

    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);

请注意,在 MATLAB 中,您不需要声明返回对象的类型,也不需要在构造函数前面添加“new”。

关于java - 从 Java BouncyCaSTLe 输出加密的 PK8 私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35757001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com