当前位置: 首页 > 知识库问答 >
问题:

在Java/Scala中生成ecdsa 32字节私钥

戚奇略
2023-03-14

是否可以使用KeypairGenerator在java中生成ecdsa 32字节私钥?我的意思是keys.getpublic.getEncoded.length将返回32我尝试生成私钥,但大小是144字节

//keys.getPrivate.getEncoded.length - 144 bytes
val ecSpec: ECNamedCurveParameterSpec = ECNamedCurveTable.getParameterSpec("secp256k1")
val keyPairGenerator: KeyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "BC")
val secRandom = new SecureRandom()
keyPairGenerator.initialize(ecSpec, secRandom)
val keys = keyPairGenerator.generateKeyPair

//keys.getPrivate.getEncoded.length - 67 bytes
val keyPairGenerator: KeyPairGenerator = KeyPairGenerator.getInstance("EC")
keyPairGenerator.initialize(256)
val keys = keyPairGenerator.generateKeyPair

共有1个答案

佟阳飙
2023-03-14

从Javaprivatekey.getEncoded()返回的值是一个编码的privatekey。具体来说,正如超类Key中所述,它是PKCS#8=公钥加密标准#8、私钥信息语法的ASN.1(DER)编码。PKCS#8为各种不同的公钥算法处理privatekeys,除了实际的密钥之外,还包含元数据,即标识算法和算法的任何参数的“Algorithmidentifier”;对于ECC算法(ECDSA、ECDH、ECMQV和更多共享一个密钥格式),这些参数指定了所使用的椭圆曲线组,尽管该规范有几个选项,但实际上,包括这里的Java在内的所有人都使用“命名曲线”选项,该选项通过ASN.1 OID即对象标识符定义曲线组。

然后,PKCS#8结构包含实际的privatekey数据,以八位字节字符串“包装”,格式根据算法而异。对于ECC,此格式由SECG/Certicom在SEC1中定义(AFAICT)并包含实际的privatekey值(一个数字,表示为八位数字符串)加上可选的曲线规范和公钥。

您的第一个代码使用BouncyCastle,Bouncy使用包装的值生成编码,包括可选的曲线规格和公钥,从而使其更长。

第二段代码默认使用Oracle/Sun提供程序(SunEC),它生成的编码不包含这些选项,但仍然包含所需的AlgorithmIdentifier,使其比实际的privatekey值更长。它还使用了不同的曲线:用整数256初始化SunEC生成器选择secp256r1(又名P-256、prime256v1)而不是Secp256K1。如果将其更改为使用new ECGenParameterSpec(“secp256k1”)作为参数,那么SunEC也将生成secp256k1,但不包含这些选项,并提供64字节编码。

在这两种情况下,如果只需要privatekey号,就转换为java.security.interfaces.ecprivateKey并使用gets()。如果像传统的那样希望结果是字节/八位组数组,请注意bigInteger.tobyteArray()返回一个可变长度的结果,您通常需要保留零修剪或填充它。

如果您确实想要公开密钥,它有一个类似的方案,使用'X.509'编码,该编码包含一个算法中间符和一个包装实际公开密钥值的位字符串,因此比原始公开密钥值长。但是,在本例中interfaces.ecpublickeyspec.ecpoint不会为您构造编码;使用仅有弹性的类型可以更方便。

 类似资料:
  • 问题内容: 我正在尝试学习一些加密编码,并生成了当前保存在字节数组中的32字节私有密钥( byte [] privatekey )。我知道公钥是使用 secp256k1 命名为椭圆曲线参数和一个公式生成的,其中,其中G是椭圆曲线上的某个点(ECPoint?),但是我无法将该命名参数的规范和公式转换为的实际编码公钥。我知道自Java 7起,and包中包含一些类,以简短的代码即可完成此操作,但是我找不

  • 我已经使用openssl生成了一个私钥,并在Terminal/command中执行以下命令: null 所有这些都无法解密我的密钥。下面是我根据这篇文章编写的类[https://stackoverflow.com/questions/35276820/decrypting-an-openssl-pem-encoded-rsa-privest-key-with-java]: 我对安全问题一无所知,所

  • 问题内容: 我们正在编写从 Pascal* 到 JVM Bytecode的 某种 编译器 。而且我们已经实现了表达式树的生成,因此下一步应该是创建文件。您能否提出有关至少如何从某些静态数据生成任何文件的任何指南/教程?因为我已经搜索了2个小时并且已经阅读了JVM规范,但是我确实需要一些甚至最简单的示例来开始开发整个程序。 *** 问题答案: 实际上,您下载的ASM文件夹中有一个示例文件。它称为 H

  • 我试图从PEM字符串生成Golang中的私钥和公钥对象 这是我的PEM线 该pem。解码函数每次返回零我做错了什么?

  • 我用PHP OpenSSL生成了一个SSH密钥: 这导致$pem如下所示: 但是我无法使用此密钥进行身份验证。在使用它之前,我必须使用以下命令转换它: 转换的结果如下: 两者都是PEM格式,但第二个是RSA私钥。使用第二个,PHP可以登录。所以我需要一个以开头的密钥,而不仅仅是。如何使用PHP和OpenSSL PHP实现创建它?

  • 我知道可以使用此链接为OpenSSL中的自签名证书生成一个公钥和一个私钥。但是对于给定的公钥,我有没有可能算出对应的私钥呢?我一直在使用1024位的RSA公钥。