【发布时间】:2016-06-15 21:11:53
【问题描述】:
我正在尝试在 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();
如果我加密密钥并将其输出为 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();
我得到了一把非常好的钥匙。问题是我想将密钥与 jdbc 一起使用,所以我需要一个 DER 格式的 pk8 密钥。我不知道如何从 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 数据库。
建议?
【问题讨论】:
-
请注意,我完全错过了这篇文章,因为它缺少 Java 和密码学标签。始终使用顶级访问量大的标签并指明您的语言。这比使用更具体的问题更重要:它们基本上是为了让您的问题被其他人注意到。
标签: java cryptography bouncycastle private-key pkcs#8