gpt4 book ai didi

bouncycaSTLe - 访问 PFX 文件 ECC 私钥以在 Java 中生成对称 key

转载 作者:行者123 更新时间:2023-12-03 09:27:15 25 4
gpt4 key购买 nike

我正在编写一个程序(在 Java 中使用 Bouncy CaSTLe API),该程序使用 AES-256/GCM 和由 ONE EC key 对生成的 key 加密文件。我的对称加密部分运行良好,但现在证明 key 生成很困难。当尝试在 javax.crypto.KeyAgreement.init() 方法中使用 ECPublicKey 对象时,它返回以下错误:

Exception in thread "main" java.security.InvalidKeyException: ECDH key agreement requires ECPrivateKey for initialisation
at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyAgreementSpi.initFromKey(Unknown Source)
at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyAgreementSpi.engineInit(Unknown Source)
at javax.crypto.KeyAgreement.init(KeyAgreement.java:461)
at javax.crypto.KeyAgreement.init(KeyAgreement.java:435)
at Encrpytion.generateKey(Encrpytion.java:188) ---aKA.init(key);---
at Encrpytion.main(Encrpytion.java:40) ---byte[] key = generateKey();---

该方法的源代码如下:
public static byte[] generateKey() {
KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis = new FileInputStream("file.pfx");
Scanner input = new Scanner(System.in);
char[] chars = {};
System.out.println("Enter the password for your .pfx: ");
chars = input.nextLine().toCharArray();
input.close();
Enumeration aliasEnum = null;
ks.load(fis, chars);
aliasEnum = ks.aliases();
Key key = null;
Certificate cert = null;
while (aliasEnum.hasMoreElements()){
String param = (String)aliasEnum.nextElement();
if (ks.isKeyEntry(param)) {
String keyName = param;
key = ks.getKey(keyName,chars);
}
cert = ks.getCertificateChain(param)[0];
}
KeyPair kp = new KeyPair(cert.getPublicKey(),(ECPrivateKey) key);
KeyAgreement aKA = null;
aKA = KeyAgreement.getInstance("ECDH", "BC");
aKA.init(key);
aKA.doPhase(kp.getPublic(), true);
return aKA.generateSecret();
}

如何访问证书的私钥?

**更新:**更新源代码

** 编辑 **
以下命令和说明可用于创建一些测试文件来演示问题。
#Make root key
openssl ecparam -name secp521r1 -genkey -out root.key
#password protect key
openssl ec -in root.key -out root.key -aes256
####change req x509_attributes to rootCA
#selfsign root
openssl req -new -x509 -key root.key -out root.crt -days 1825 -config openssl.cfg
###comment out req x509_attributes
#make new key for clientCA
openssl ecparam -name secp521r1 -genkey -out client.key
#make clientCA csr
openssl req -new -sha384 -key client.key -out client.csr -config openssl.cfg
#sign clientCA
openssl ca -out client.crt -name root -in client.csr -config openssl.cfg
#make client key
openssl ecparam -name secp521r1 -genkey -out client.key
#make server csr
openssl req -new -sha384 -key client.key -out client.csr -config openssl.cfg
#sign server cert
openssl ca -out client.crt -name client -in client.csr -config openssl.cfg
#MAKE CHAIN - copy base64 encoded root and intermidiate client ca into same "chain.cer" #export user cert
openssl pkcs12 -export -chain -CAfile chain.crt -in client.crt -inkey client.key -out client.pfx -aes256

最佳答案

对于任何给定的别名,只有 key 之一和 cert将是非空的。在这种情况下显然 cert非空且键为空。如果您的 keystore 中有 EC 私钥,您将需要更努力地找到它。您可以通过使用 isCertificateEntry 进行测试来确定别名中的条目类型。和 isKeyEntry .

编辑 1

不幸的是,错误消息令人困惑,因为它实际上来自 bouncycaSTLe 库。 ECDH key agreement requires ECPrivateKey中提到的类不是 java.security.interfaces.ECPrivateKey 而是 org.bouncycastle.jce.interfaces.ECPrivateKey

以下对 OP 示例代码的简短改编说明了克服此问题的一种方法。

import org.bouncycastle.jce.provider.JCEECPrivateKey;
import org.bouncycastle.jce.provider.JCEECPublicKey;
// ...
// . <original example code goes here>
// .
JCEECPrivateKey ecPrivKey = new JCEECPrivateKey((ECPrivateKey) key);
JCEECPublicKey ecPubKey = new JCEECPublicKey((ECPublicKey) cert.getPublicKey());
KeyPair kp = new KeyPair(ecPubKey, ecPrivKey);
KeyAgreement aKA = null;
aKA = KeyAgreement.getInstance("ECDH", "BC");
aKA.init(ecPrivKey);
aKA.doPhase(kp.getPublic(), true);
return aKA.generateSecret();
// ...

关于bouncycaSTLe - 访问 PFX 文件 ECC 私钥以在 Java 中生成对称 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13852997/

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