我正试图使用弹跳城堡来生成ECDSA密钥。从Java的角度来看,代码似乎工作得很好;但是,当我转储文件并试图验证数据时,OpenSSL不喜欢数据的格式。
经过一些研究,我认为bouncy castle正在将私钥编码为公钥。
public class Test {
public static void main(String[] args) {
Security.addProvider(new BouncyCastleProvider());
System.out.println("Starting...");
String name = "prime256v1";
try {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECDSA", BouncyCastleProvider.PROVIDER_NAME);
kpg.initialize(new ECGenParameterSpec(name));
KeyPair keyPair = kpg.generateKeyPair();
FileOutputStream writer = new FileOutputStream("private.key");
writer.write(keyPair.getPrivate().getEncoded());
writer.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
$ openssl asn1parse -inform DER -in /my/path/private.key
0:d=0 hl=3 l= 147 cons: SEQUENCE
3:d=1 hl=2 l= 1 prim: INTEGER :00
6:d=1 hl=2 l= 19 cons: SEQUENCE
8:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey
17:d=2 hl=2 l= 8 prim: OBJECT :prime256v1
27:d=1 hl=2 l= 121 prim: OCTET STRING [HEX DUMP]: <hex data>
$ openssl ecparam -name prime256v1 -genkey -noout -outform DER -out private.key
$ openssl asn1parse -inform DER -in private.key
0:d=0 hl=2 l= 119 cons: SEQUENCE
2:d=1 hl=2 l= 1 prim: INTEGER :01
5:d=1 hl=2 l= 32 prim: OCTET STRING [HEX DUMP]: <hex data>
39:d=1 hl=2 l= 10 cons: cont [ 0 ]
41:d=2 hl=2 l= 8 prim: OBJECT :prime256v1
51:d=1 hl=2 l= 68 cons: cont [ 1 ]
53:d=2 hl=2 l= 66 prim: BIT STRING
Java以编码格式输出密钥。您应该尝试:
private String getPrivateKeyAsHex(PrivateKey privateKey) {
ECPrivateKey ecPrivateKey = (ECPrivateKey) privateKey;
byte[] privateKeyBytes = new byte[PRIVATE_KEY_LENGTH];
writeToStream(privateKeyBytes, 0, ecPrivateKey.getS(), PRIVATE_KEY_LENGTH);
String hex = Hex.toHexString(privateKeyBytes);
logger.debug("Private key bytes: " + Arrays.toString(privateKeyBytes));
logger.debug("Private key hex: " + hex);
return hex;
}
private String getPublicKeyAsHex(PublicKey publicKey) {
ECPublicKey ecPublicKey = (ECPublicKey) publicKey;
ECPoint ecPoint = ecPublicKey.getW();
byte[] publicKeyBytes = new byte[PUBLIC_KEY_LENGTH];
writeToStream(publicKeyBytes, 0, ecPoint.getAffineX(), PRIVATE_KEY_LENGTH);
writeToStream(publicKeyBytes, PRIVATE_KEY_LENGTH, ecPoint.getAffineY(), PRIVATE_KEY_LENGTH);
String hex = Hex.toHexString(publicKeyBytes);
logger.debug("Public key bytes: " + Arrays.toString(publicKeyBytes));
logger.debug("Public key hex: " + hex);
return hex;
}
private void writeToStream(byte[] stream, int start, BigInteger value, int size) {
byte[] data = value.toByteArray();
int length = Math.min(size, data.length);
int writeStart = start + size - length;
int readStart = data.length - length;
System.arraycopy(data, readStart, stream, writeStart, length);
}
以下网站经常被引用,而且我认为是准确的: https://gobittest.appspot.com/Address 我试图在Golang中重现这些步骤,但第一步就失败了:-( 有人能给我提供一个Golang片段,给定ECDSA私钥,返回公钥吗?我想我可能具体指的是上述站点示例中的私钥指数和公钥指数。 i、 例如,给定随机生成的(十六进制编码的)私钥(指数?)<代码>E83385AF76B2B19
问题内容: 我试图从私钥生成公共ECDSA密钥,但是在Internet上如何进行此操作方面,我还没有找到太多帮助。几乎所有内容都是根据公共密钥规范生成公共密钥的,我不知道该如何获得。到目前为止,这是我汇总的内容: 但是,在运行时,出现以下错误: 我究竟做错了什么?有没有更好/更简便的方法可以做到这一点? 编辑:我设法获得一些代码进行编译,但不能正常工作: 当我运行它时,它会生成一个publicKe
我试图从私钥中生成一个公共ECDSA密钥,但我还没有在互联网上找到多少关于如何实现这一点的帮助。几乎所有的事情都是为了从公钥规范生成公钥,我不知道如何得到它。到目前为止,我总结了以下内容: 但是,在运行时,我会出现以下错误: 我做错了什么?有更好/更简单的方法吗? 编辑:我已经设法编译了一些代码,但它不能正常工作: 当我运行它时,它会生成一个公钥,但它不是私钥对应的公钥。
是否可以使用KeypairGenerator在java中生成ecdsa 32字节私钥?我的意思是keys.getpublic.getEncoded.length将返回32我尝试生成私钥,但大小是144字节
我知道可以使用此链接为OpenSSL中的自签名证书生成一个公钥和一个私钥。但是对于给定的公钥,我有没有可能算出对应的私钥呢?我一直在使用1024位的RSA公钥。
我正在尝试用c#签署比特币交易。我有两段代码要完成。我可以使用Bouncy castle创建一组私钥和公钥。我可以将其转换为钱包导入格式ok。 我还可以从ECDSA公钥生成比特币地址。 然而,我想签署一项交易,我所拥有的只是我的私钥。我不想把东西放进钱包里签名。那么,在只提供私钥的情况下,如何生成公钥呢? 我发现了一个javascript方法可以做到这一点: 我在充气城堡看到的唯一方法是生成随机一