www.91084.com

GVKun编程网logo

如何从EC公钥字节中获取PublicKey对象?(chia获取公钥)

24

在本文中,我们将给您介绍关于如何从EC公钥字节中获取PublicKey对象?的详细内容,并且为您解答chia获取公钥的相关问题,此外,我们还将为您提供关于EC将字符串转换为PublicKey/Priv

在本文中,我们将给您介绍关于如何从EC公钥字节中获取PublicKey对象?的详细内容,并且为您解答chia获取公钥的相关问题,此外,我们还将为您提供关于EC将字符串转换为PublicKey / PrivateKey、golang x509.MarshalPKIXPublicKey vs x509.MarshalPKCS1PublicKey()、golang x509.MarshalPKIXPublicKey与x509.MarshalPKCS1PublicKey()、java – 如何从EC公钥字节中获取PublicKey对象?的知识。

本文目录一览:

如何从EC公钥字节中获取PublicKey对象?(chia获取公钥)

如何从EC公钥字节中获取PublicKey对象?(chia获取公钥)

我正在开发一个需要SHA256withECDSA借助secp256r1(NIST
P-256,P-256,prime256v1)公钥来验证签名的应用程序。

公钥是由其他应用程序在较早的时间点生成的,并以十六进制编码存储在我的数据库中。十六进制字符串的格式等效于OpenSSL在调用以前由生成openssl ec-in x.pem -noout-text的文件时将生成的十六进制字符串。消息和签名是从其他应用程序接收的。考虑以下测试数据:x.pem``openssl ecparam-genkey -name secp256r1 -out x.pem

// Stored in Databasebyte[] pubKey = DatatypeConverter.parseHexBinary("049a55ad1e210cd113457ccd3465b930c9e7ade5e760ef64b63142dad43a308ed08e2d85632e8ff0322d3c7fda14409eafdc4c5b8ee0882fe885c92e3789c36a7a");// Received from Other Applicationbyte[] message = DatatypeConverter.parseHexBinary("54686973206973206a75737420736f6d6520706f696e746c6573732064756d6d7920737472696e672e205468616e6b7320616e7977617920666f722074616b696e67207468652074696d6520746f206465636f6465206974203b2d29");byte[] signature = DatatypeConverter.parseHexBinary("304402205fef461a4714a18a5ca6dce6d5ab8604f09f3899313a28ab430eb9860f8be9d602203c8d36446be85383af3f2e8630f40c4172543322b5e8973e03fff2309755e654");

现在,这 应该 是有效的签名。

我的目标是使用Java和/或Bouncycastle加密API验证消息上的签名。我isValidSignature为此创建了一个方法:

private static boolean isValidSignature(byte[] pubKey, byte[] message,        byte[] signature) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException, SignatureException, InvalidKeySpecException {    Signature ecdsaVerify = Signature.getInstance("SHA256withECDSA", new BouncyCastleProvider());    ecdsaVerify.initVerify(getPublicKeyFromHex(pubKey));    ecdsaVerify.update(message);    return ecdsaVerify.verify(signature);}

我试图提取公钥:

KeyFactory.generatePublic:

private static PublicKey getPublicKeyFromHex(byte[] pubKey) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException {    KeyFactory fact = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());    return fact.generatePublic(new X509EncodedKeySpec(pubKey));}

但这会引发一个java.security.spec.InvalidKeySpecException(DER长度超过4个字节:26)。我该怎么做才能解析?

答案1

小编典典

椭圆曲线键对Generation和键工厂上的Bouncy
Castle示例代码使我非常接近。

一旦我成功创建了ECDSA密钥工厂和secp256r1/ NIST P-256/ P-256/
prime256v1曲线的曲线规范,便可以ECPointUtil.decodePoint用来获取曲线点。然后,我可以生成一个公共密钥规范,该规范使我能够生成这样的公共密钥:

private PublicKey getPublicKeyFromBytes(byte[] pubKey) throws NoSuchAlgorithmException, InvalidKeySpecException {    ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");    KeyFactory kf = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());    ECNamedCurveSpec params = new ECNamedCurveSpec("prime256v1", spec.getCurve(), spec.getG(), spec.getN());    ECPoint point =  ECPointUtil.decodePoint(params.getCurve(), pubKey);    ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(point, params);    ECPublicKey pk = (ECPublicKey) kf.generatePublic(pubKeySpec);    return pk;}

EC将字符串转换为PublicKey / PrivateKey

EC将字符串转换为PublicKey / PrivateKey

如何解决EC将字符串转换为PublicKey / PrivateKey?

我一直在尝试将下面粘贴的代码转换为公钥。我正在尝试创建一个共享机密。我有密钥的未压缩十六进制表示形式。我想从中创建一个公钥。同样,我也希望创建私钥并在之后加入它们。

String plainPublicKey = "042E3E5CCF6B9AB04BE7A22F3FACCFDE73C87E87155394A34815408A896CA18A374DAC669AF3BF6220FC863767F4AF47507C5BC221FC4A19874DAF39B4074E3EB8";
        EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(Hex.decodeHex(plainPublicKey.tochararray()));
        KeyFactory kf = KeyFactory.getInstance("EC");
        PublicKey pub = kf.generatePublic(publicKeySpec);
        return pub;
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
    at jdk.crypto.ec/sun.security.ec.ECKeyFactory.engineGeneratePublic(ECKeyFactory.java:157)
    at java.base/java.security.KeyFactory.generatePublic(KeyFactory.java:352)
    at AESExample.getPublicKey(AESExample.java:66)
    at AESExample.main(AESExample.java:74)
Caused by: java.security.InvalidKeyException: invalid key format
    at java.base/sun.security.x509.X509Key.decode(X509Key.java:386)
    at java.base/sun.security.x509.X509Key.decode(X509Key.java:401)
    at jdk.crypto.ec/sun.security.ec.EcpublicKeyImpl.<init>(EcpublicKeyImpl.java:71)
    at jdk.crypto.ec/sun.security.ec.ECKeyFactory.implGeneratePublic(ECKeyFactory.java:219)
    at jdk.crypto.ec/sun.security.ec.ECKeyFactory.engineGeneratePublic(ECKeyFactory.java:153)
    ... 3 more

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

golang x509.MarshalPKIXPublicKey vs x509.MarshalPKCS1PublicKey()

golang x509.MarshalPKIXPublicKey vs x509.MarshalPKCS1PublicKey()

谁能帮助我理解MarshalPKIXPublicKey()和MarshalPKCS1PublicKey()之间的区别?

根据评论:
// MarshalPKIXPublicKey将公钥序列化为DER编码的PKIX格式.

// MarshalPKCS1PublicKey将RSA公钥转换为PKCS#1,ASN.1 DER表单.

什么是DER编码的PKIX格式?

谢谢

解决方法

你没有说明你没有(或确实)理解了多少.从基础开始:

ASN.1(抽象语法表示法一)是用于定义要在系统或程序之间传递或互换的数据结构的一般方案.

DER(可分辨编码规则)是定义为将ASN.1数据编码为可以传送和/或存储的字节序列的方案,并且将这些字节序列无损地解码回ASN.1数据.

PKCS1 aka RFC 2313,2437,3447,8017(公钥加密标准#1)是定义使用RSA算法的一系列事项的标准,其中Appendix A定义了名为RSAPublicKey的ASN.1结构来表示RSA公钥.,与任何ASN.1结构一样,可以进行DER编码.

MarshalPKCS1PublicKey converts an RSA public key to PKCS#1,ASN.1 DER form.

清楚地表示PKCS1中RSA公钥的ASN.1结构的DER编码.

PKIX(公钥基础设施X.509)是X.509标准的互联网变体(正式地,简介),最初由当时的CCITT-ITU-T定义,目前在rfc5280.X.509和PKIX,主要定义公钥证书的格式,它将公钥与身份以及其他元数据绑定在一起.要做到这一点,它必须包含一个可以处理多个公钥算法的公钥的表示,使用SubjectPublicKeyInfo structure完成,相当简单,由an AlgorithmIdentifier that identifies the algorithm,plus a BIT STRING that contains the actual public-key value in an algorithm-dependent manner组成.RSA的算法相关部分在rfc3279 sec 2.3.1中指定,如你所见,它是来自PKCS1的RSAPublicKey结构,DER编码.

因此,RSA公钥的“DER编码的PKIX格式”表示PKIX / X.509 SubjectPublicKeyInfo结构的DER编码,其包含RSA的algorithmIdentifier(OID 1.2.840.113549.1.1.1和参数NULL)和包含该RSI的BIT STRING. DER编码PKCS1 RSAPublicKey.

相关或类似(尽管大多数包括私人非公开和/或PEM而不是DER):
How to store/retrieve RSA public/private key
How do we convert a String from PEM to DER format
Problem transmiting a RSA public key,javaME,bouncy castle
Generating RSA keys in PKCS#1 format in Java
How to generate PKCS#1 RSA keys in PEM Format?
Converting RSA keys into SubjectPublicKeyInfo Form from BigIntegers
Convert a X509 Public key to RSA public key
Load public key to create rsa object for public encryption
和交叉堆栈:
https://crypto.stackexchange.com/questions/19149/what-is-the-technical-name-for-a-public-key-container-in-der-format
https://crypto.stackexchange.com/questions/54121/rsa-key-differences-openssl-cli-vs-openssl-ssl-h-c-function

golang x509.MarshalPKIXPublicKey与x509.MarshalPKCS1PublicKey()

golang x509.MarshalPKIXPublicKey与x509.MarshalPKCS1PublicKey()

谁能帮助我了解MarshalPKIXPublicKey()和MarshalPKCS1PublicKey()之间的区别?

根据注释:// MarshalPKIXPublicKey将公共密钥序列化为DER编码的PKIX格式。

// MarshalPKCS1PublicKey将RSA公钥转换为PKCS#1,ASN.1 DER格式。

什么是DER编码的PKIX格式?

谢谢

java – 如何从EC公钥字节中获取PublicKey对象?

java – 如何从EC公钥字节中获取PublicKey对象?

我正在开发一个应用程序,需要在secp256r1(NIST P-256,P-256,prime256v1)公钥的帮助下验证SHA256withECDSAsignatures.

公钥在某个较早的时间点由不同的应用程序生成,并以十六进制编码存储在我的数据库中.这里十六进制字符串的格式相当于OpenSSL在以前由openssl ecparam -genkey -name secp256r1 -out生成的文件x.pem上调用openssl ec -in x.pem -noout -text时生成的十六进制字符串x.pem.
消息和签名是从不同的应用程序接收的.
请考虑以下测试数据:

// Stored in Database
byte[] pubKey = DatatypeConverter.parseHexBinary("049a55ad1e210cd113457ccd3465b930c9e7ade5e760ef64b63142dad43a308ed08e2d85632e8ff0322d3c7fda14409eafdc4c5b8ee0882fe885c92e3789c36a7a");

// Received from Other Application
byte[] message = DatatypeConverter.parseHexBinary("54686973206973206a75737420736f6d6520706f696e746c6573732064756d6d7920737472696e672e205468616e6b7320616e7977617920666f722074616b696e67207468652074696d6520746f206465636f6465206974203b2d29");
byte[] signature = DatatypeConverter.parseHexBinary("304402205fef461a4714a18a5ca6dce6d5ab8604f09f3899313a28ab430eb9860f8be9d602203c8d36446be85383af3f2e8630f40c4172543322b5e8973e03fff2309755e654");

现在这应该是一个有效的签名.

我的目标是使用Java和/或Bouncycastle加密API验证消息上的签名.我创建了一个方法isValidSignaturefor:

private static boolean isValidSignature(byte[] pubKey,byte[] message,byte[] signature) throws NoSuchAlgorithmException,NoSuchProviderException,InvalidKeyException,SignatureException,InvalidKeySpecException {
    Signature ecdsaVerify = Signature.getInstance("SHA256withECDSA",new BouncyCastleProvider());
    ecdsaVerify.initVerify(getPublicKeyFromHex(pubKey));
    ecdsaVerify.update(message);
    return ecdsaVerify.verify(signature);
}

我试图提取公钥:

KeyFactory.generatePublic:

private static PublicKey getPublicKeyFromHex(byte[] pubKey) throws NoSuchAlgorithmException,InvalidKeySpecException {
    KeyFactory fact = KeyFactory.getInstance("ECDSA",new BouncyCastleProvider());
    return fact.generatePublic(new X509EncodedKeySpec(pubKey));
}

但这会抛出java.security.spec.InvalidKeySpecException(DER长度超过4个字节:26).
我该怎么做才能解析这个?

解决方法

Bouncy Castle example code on elliptic curve key pair Generation and key factories让我非常接近.

一旦我设法创建了一个ECDSA密钥工厂和secp256r1 / NIST P-256 / P-256 / prime256v1曲线的曲线规范,我就能够使用ECPointUtil.decodePoint来获得一个曲线点.然后,我可以生成一个公钥规范,使我能够生成如下公钥:

private PublicKey getPublicKeyFromBytes(byte[] pubKey) throws NoSuchAlgorithmException,InvalidKeySpecException {
    ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");
    KeyFactory kf = KeyFactory.getInstance("ECDSA",new BouncyCastleProvider());
    ECNamedCurveSpec params = new ECNamedCurveSpec("prime256v1",spec.getCurve(),spec.getG(),spec.getN());
    ECPoint point =  ECPointUtil.decodePoint(params.getCurve(),pubKey);
    EcpublicKeySpec pubKeySpec = new EcpublicKeySpec(point,params);
    EcpublicKey pk = (EcpublicKey) kf.generatePublic(pubKeySpec);
    return pk;
}

关于如何从EC公钥字节中获取PublicKey对象?chia获取公钥的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于EC将字符串转换为PublicKey / PrivateKey、golang x509.MarshalPKIXPublicKey vs x509.MarshalPKCS1PublicKey()、golang x509.MarshalPKIXPublicKey与x509.MarshalPKCS1PublicKey()、java – 如何从EC公钥字节中获取PublicKey对象?的相关信息,请在本站寻找。

本文标签: