- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以我知道如何将 BouncyCaSTLe C# 库中的公钥编码/解码为字节数组:
编码:
PublicKey = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(p1.Public).GetDerEncoded();
解码:
ECPublicKeyParameters pubKey = (ECPublicKeyParameters)PublicKeyFactory.CreateKey(OtherPublicKey);
我似乎无法弄清楚如何在 BouncyCaSTLe 库的 Java 版本中执行此操作,因为在该库的 Java 版本中似乎没有 SubjectPublicKeyInfoFactory 对象。但是,Java 中似乎有一个 PublicKeyFactory 类,所以看起来我可以使用相同的代码,但我不知道如何在 Java 库中对公钥进行 DER 编码。谁能帮忙??谢谢!
-----编辑---------------------------------------- ------------------
好的,这是我目前在 C# 中的内容:
创建ECDH实例:
public static ECDHBasicAgreement CreateECDHInstance(out byte[] PublicKey)
{
IAsymmetricCipherKeyPairGenerator g = GeneratorUtilities.GetKeyPairGenerator("ECDH");
FpCurve curve = new FpCurve(
new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), // q
new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), // a
new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16)); // b
ECDomainParameters ecSpec = new ECDomainParameters(
curve,
curve.DecodePoint(Hex.Decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")), // G
new BigInteger("883423532389192164791648750360308884807550341691627752275345424702807307"), // n
BigInteger.One); // h
g.Init(new ECKeyGenerationParameters(ecSpec, new SecureRandom()));
AsymmetricCipherKeyPair aKeyPair = g.GenerateKeyPair();
ECDHBasicAgreement aKeyAgreeBasic = new ECDHBasicAgreement();
aKeyAgreeBasic.Init(aKeyPair.Private);
PublicKey = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(aKeyPair.Public).GetDerEncoded();
return aKeyAgreeBasic;
}
这完美地创建并返回了一个 ECDHBasicAgreement 对象,并以 der 编码的字节数组形式输出了一个公钥。这是我在 java 中的内容:
public void testECDH() throws Exception
{
AsymmetricCipherKeyPairGenerator g = new ECKeyPairGenerator();
Fp curve = new Fp(
new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), // q
new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), // a
new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16)); // b
ECDomainParameters ecSpec = new ECDomainParameters(
curve,
curve.decodePoint(Hex.decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")), // G
new BigInteger("883423532389192164791648750360308884807550341691627752275345424702807307"), // n
BigInteger.ONE); // h
g.init(new ECKeyGenerationParameters(ecSpec, new SecureRandom()));
AsymmetricCipherKeyPair aKeyPair = g.generateKeyPair();
ECDHBasicAgreement aKeyAgreeBasic = new ECDHBasicAgreement();
aKeyAgreeBasic.init(aKeyPair.getPrivate());
// The part that doesn't work
//byte[] publickey = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(aKeyPair.getPublic()).GetDerEncoded();
}
在 java 中,似乎没有 SubjectPublicKeyInfoFactory 类或可以采用 aKeyPair.getPublic() 并能够生成 DER 编码字节数组的等效类。任何人都可以帮忙!??!?我快无计可施了!谢谢!!!!!!
------------编辑 2 ---------------------------------- --------------------------------------
好的,这就是我现在的位置:
public void test2() throws Exception
{
ECKeyPairGenerator g = new ECKeyPairGenerator();
Fp curve = new Fp(
new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), // q
new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), // a
new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16)); // b
ECDomainParameters ecP = new ECDomainParameters(
curve,
curve.decodePoint(Hex.decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")), // G
new BigInteger("883423532389192164791648750360308884807550341691627752275345424702807307"), // n
BigInteger.ONE); // h
g.init(new ECKeyGenerationParameters(ecP, new SecureRandom()));
// Generate key pair
AsymmetricCipherKeyPair aKeys = g.generateKeyPair();
JCEECPublicKey jpub = new JCEECPublicKey("EC", (ECPublicKeyParameters)aKeys.getPublic());
JCEECPrivateKey jpriv = new JCEECPrivateKey("EC", (ECPrivateKeyParameters)aKeys.getPrivate());
KeyPair aKeyPair = new KeyPair(jpub, jpriv);
ECDHBasicAgreement aKeyAgree = new ECDHBasicAgreement();
aKeyAgree.init(aKeys.getPrivate());
byte[] encoded = aKeyPair.getPublic().getEncoded();
// The part that breaks now (Exception DERNull)
ECPublicKeyParameters decoded = decodeECPublicKeyParameters(encoded);
}
public static ECPublicKeyParameters decodeECPublicKeyParameters(byte[] pkByte) throws IOException {
return (ECPublicKeyParameters) PublicKeyFactory.createKey(pkByte);
}
所以我已经能够将公钥/私钥获取到 JCEEC Key 对象中,并且能够对它们进行编码。当我尝试解码它们时,我得到一个 DERNull 异常。我运行了一些其他测试并使用常规 native java KeyPairGenerator 生成了 key ,并且能够对 key 进行编码/解码,因此我知道此方法确实有效。当我将 AsymmetricCipherKeys 转换为 JCEEC key 时,我认为缺少了一些东西。我确实注意到 JCEECPublicKey 构造中还有另一个参数,即 ECKeySpec 的第三个参数。唯一的麻烦是,我不确定如何从我目前拥有的代码中获取 ECKeySpec(或者如果这就是开始的问题)。还有其他建议吗?谢谢!!!
最佳答案
您是否尝试过使用 BouncycaSTLe SubjectPublicKeyInfo 类?像这样的东西:
byte [] derEncoded;
//...
SubjectPublicKeyInfo pkInfo = new SubjectPublicKeyInfo((ASN1Sequence)ASN1Object.fromByteArray(derEncoded))
编辑:
有一种简单但有些不尽如人意的方法。您可以使用 JCEPublicKey 类,它有一个生成(我认为)正确答案的 getEncoded() 方法。
编辑 2:
边学边学 :) 事实证明,您必须在算法参数中识别椭圆曲线,这是有道理的。这是执行此操作的一个小改动。
g.init(new ECKeyGenerationParameters(ecP, new SecureRandom()));
// Generate key pair
AsymmetricCipherKeyPair aKeys = g.generateKeyPair();
ECParameterSpec ecSpec = new ECParameterSpec(ecP.getCurve(), ecP.getG(), ecP.getN());
JCEECPublicKey jpub = new JCEECPublicKey("EC",
(ECPublicKeyParameters) aKeys.getPublic(), ecSpec);
JCEECPrivateKey jpriv = new JCEECPrivateKey("EC",
(ECPrivateKeyParameters) aKeys.getPrivate(), jpub, ecSpec);
关于java - 如何在 BouncyCaSTLe Java 中对 ECDH 公钥进行 DER 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8014281/
起初,这是我的第一篇文章——如果这篇文章没有得到很好的描述和设计,我很抱歉。 我的问题是我需要使用 Spring Boot 通过 SSL 连接连接到 GCP 中的数据库。在 GCP 内部生成三个所需的
是否可以创建相同大小的 openssl 证书(server.key.der 或 server.crt.der).. 1024 或 2048 或任何固定大小?我喜欢这一点,每次我创建证书时它都会更改大小
我有一个 DER 格式的证书文件和一个 DER 格式的 key 文件, key 是加密的。 我想创建一个包含 PEM 格式的证书和加密 key 的 cer 文件,例如: -----BEGIN CERT
我正在尝试将 certifictae 和 key 写入 stm32 的闪存 EEPROM,我知道我们可以写入字符串,但是否有可能在闪存中写入整个证书(.der)。我正在使用 stm32f7 微 Con
我正在尝试将 X509 证书写入内存中的 DER 格式。将其写入文件非常有效。 我需要 PEM 格式的证书,不带“-----BEGIN PRIVATE KEY-----”页眉、页脚或换行符。我无法弄清
为什么模数用前导零填充?我正在阅读 PKCS#1 和 PKCS#8,但没有找到任何相关信息。 在 c# 中必须删除前导零,有人知道为什么吗? 在 http://etherhack.co.uk/asym
我有一个 X.509 证书,其中包含一组带有以下隐式 [0] 标记的数据: A0 81 C6 (value)... 我有一个标准文档的摘录: The IMPLICIT [0] tag is not u
如何从代表 DER 格式证书的十六进制字符串中提取通用名称?我需要显示证书的名称,以便客户端可以选择他们希望在 Web 应用程序中使用的证书。 限制: 我需要在网络浏览器中执行此提取客户端操作。 Op
使用 BounceCaSTLe 我可以使用以下代码。它生成一个 key 对并返回 ASN.1 DER 编码格式。 //Generate new key var generator = new RsaK
我最初有一个受密码保护的 PEM 文件,其中包含使用 BouncyCaSTLe 读入 Java 应用程序的私钥。 PEM 文件开头为 -----开始 RSA 私钥----- 这让我相信它是 PKCS#
在十六进制编辑器中是否存在某种 DER 数字签名? 我得到了一个二进制内容大约为 1.3 KB 的 .cer 文件。有人告诉我它是 DER 格式,我的阅读表明具有此扩展名的证书几乎都是 DER 或带有
我有一个应用程序需要安装证书,它使用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:CERTIFICATE_URL]]
我正在尝试验证文件的签名。我按照这些说明生成证书: // generate a private key with size of 2048 bits openssl genrsa -out priva
我想创建一个能够对大整数(即 ECDSA signature r and s)进行 DER 编码和解码的 Google Go 应用程序。据我了解,我应该使用 asn1 package , 但我应该调用
我正在尝试为 Elasticsearch Searchguard 创建证书.一项要求是证书必须在 SAN 中包含 oid:1.2.3.4.5.5。我正在使用 GO 生成该证书。经过一些尝试和错误后,我
我需要从我的示例 ASN1 编译并生成一个 .DER 文件 BCAS DEFINITIONS ::= BEGIN BBCard ::= SEQUENCE { name IA5String (SIZ
我有一个 X509Certificate,我将它写入/打印到一个文件中,如下所示。 (我不是在写编码字节,因为我想阅读证书的内容) X509Certificate cer = generateCert
我正在尝试对安全网站进行 POST 调用: 步骤: 1) 转到https://www.mywebsite.com (供引用) 2) 将上述网站的 keystore 导出到C:\Program File
这是我的结构: SET OF SEQUENCE: INTEGER: XX INTEGER: YY 我的编码是这样的: 11 08 10 06 02 01 XX 02 01 Y
我见过很多问题,但没有一个真正提供好的答案,或者即使他们尝试了,他们也会假设提出问题的人并没有问他实际上在问什么。郑重声明,我不是在询问签名、加密或 PEM 文件! 就我而言,我将收到一个加密数据的小
我是一名优秀的程序员,十分优秀!