在本文中,我们将给您介绍关于如何从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 / PrivateKey
- golang x509.MarshalPKIXPublicKey vs x509.MarshalPKCS1PublicKey()
- golang x509.MarshalPKIXPublicKey与x509.MarshalPKCS1PublicKey()
- java – 如何从EC公钥字节中获取PublicKey对象?
如何从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?
我一直在尝试将下面粘贴的代码转换为公钥。我正在尝试创建一个共享机密。我有密钥的未压缩十六进制表示形式。我想从中创建一个公钥。同样,我也希望创建私钥并在之后加入它们。
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()
根据评论:
// 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()
谁能帮助我了解MarshalPKIXPublicKey()和MarshalPKCS1PublicKey()之间的区别?
根据注释:// MarshalPKIXPublicKey将公共密钥序列化为DER编码的PKIX格式。
// MarshalPKCS1PublicKey将RSA公钥转换为PKCS#1,ASN.1 DER格式。
什么是DER编码的PKIX格式?
谢谢
java – 如何从EC公钥字节中获取PublicKey对象?
公钥在某个较早的时间点由不同的应用程序生成,并以十六进制编码存储在我的数据库中.这里十六进制字符串的格式相当于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).
我该怎么做才能解析这个?
解决方法
一旦我设法创建了一个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对象?的相关信息,请在本站寻找。
本文标签: