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

如何生成33字节压缩的NIST P-256公钥?

姚棋
2023-03-14

我需要生成这样的公钥,并对字节进行额外的签名(这将包括之前生成的密钥)

我需要构造以下字节:ASN.1 前缀签名(33 字节压缩 NIST P-256 公钥)

签名应从其他定义的私钥传递

ECDSA规范:

● 曲线:

NIST P-256也称为secp256r1和prime256v1(openssl)

●签名格式ASN.1。ECDSA签名的r和s值必须是正整数,并且DER编码为正整数。

Android中是否有API来执行此过程?那我怎么用呢?

我尝试过:

 try {
        val generator = KeyPairGenerator.getInstance("ECDSA")
        val ecSpec = ECNamedCurveTable
                .getParameterSpec("prime256v1")
        generator.initialize(ecSpec)
        val keyPair = generator.generateKeyPair()

        val privKey = keyPair.private
        val encodedPrivKey = privKey.encoded
        System.out.println(toHex(encodedPrivKey))

        val pubKey = keyPair.public
        val encodedPubKey = pubKey.encoded
        System.out.println(toHex(encodedPubKey))

        val keyFactory = KeyFactory.getInstance("ECDSA")
        val pubKey2 = keyFactory.generatePublic(X509EncodedKeySpec(encodedPubKey))
        if (Arrays.equals(pubKey2.getEncoded(), encodedPubKey)) {
            println("That worked for the public key")
        }

        val privKey2 = keyFactory.generatePrivate(PKCS8EncodedKeySpec(encodedPrivKey))
        if (Arrays.equals(privKey2.getEncoded(), encodedPrivKey)) {
            println("That worked for the private key")
        }

    } catch (e: GeneralSecurityException) {
        throw IllegalStateException(e)
    }

这里-编码的公钥长度为90字节,我想我希望它是33字节

共有1个答案

程胡非
2023-03-14

要以压缩格式编码Bouncy Castle椭圆曲线公钥:

Security.addProvider(BouncyCastleProvider())  

generator = KeyPairGenerator.getInstance("ECDSA")
val ecSpec = ECNamedCurveTable.getParameterSpec("prime256v1")        
generator.initialize(ecSpec)
val keyPair = generator.generateKeyPair()

val publicKey = keyPair.public as org.bouncycastle.jce.interfaces.ECPublicKey
val compressedPublicKey = publicKey.q.getEncoded(true)

您没有包括关于如何对密钥进行签名和对签名进行编码的所有必要细节,但是我的最佳猜测是使用标准编码对公钥进行标准ECDSA签名:

val signer = Signature.getInstance("SHA256withECDSA")
signer.initSign(otherPrivateKey)
signer.update(compressedPublicKey)
val signature = signer.sign()

这使用SHA256散列公钥,使用ECDSA对其进行签名,并将其格式化并序列化为ASN.1结构ECDSASignature的DER编码。

ECDSASignature ::= SEQUENCE {
    r   INTEGER,
    s   INTEGER
}

rs将是正整数并用DER编码。还有其他方法可以做到这一点,但这是迄今为止最常见的方法(唯一其他常见的ECDSA签名格式只是将r和s填充为零并将它们连接起来)。

 类似资料:
  • 假设33字节编码的公钥可以这样创建: 我如何在另一端重新构建它(当我只有从这里发送的33个字节时)? 我正在尝试下面的代码: 但我想这是完全错误的,因为我得到了: java.security.spec.InvalidKeySpecException:java.lang.RuntimeException: error: 0c000079: ASN.1编码例程:OPENSSL_internal:HEA

  • 问题内容: 情况如下: 我从Amazon S3获取gzip压缩的xml文档 我以文件形式阅读它们 题 如何直接解压缩流并读取内容? 我不想创建临时文件,它们看起来不太好。 问题答案: 是的,您可以使用该模块解压缩字节流: 到标头的32个偏移量表示gzip标头是预期的但已跳过。 S3键对象是一个迭代器,因此您可以执行以下操作:

  • 我使用generation作为API文档生成的Maven插件。我希望生成的文档被压缩,到目前为止还没有找到这样做的方法。文档是在一个目录中生成的,而不是在一个zip文件中。以下是摘自我的pom: 依赖关系: 我用的是发音版本1.26.2。

  • 问题内容: 我已经从http://mirrors.ibiblio.org/pub/mirrors/maven2/dot-index/nexus-maven- repository-index.gz 下载了为Maven Central生成的索引。 我想列出这些索引文件(例如groupId,artifactId,版本)中的工件信息。我读过有一个高级API。看来我必须使用以下Maven依赖项。但是,我不

  • 问题内容: 我有一些字符串,每个字符串大约1万个字符。它们中有很多重复。它们是序列化的JSON对象。我想轻松地将它们压缩为字节数组,然后从字节数组解压缩它们。 我怎样才能最轻松地做到这一点?我正在寻找方法,因此可以执行以下操作: 问题答案: 你可以试试

  • 本文向大家介绍你是如何压缩字体的?相关面试题,主要包含被问及你是如何压缩字体的?时的应答技巧和注意事项,需要的朋友参考一下 压缩字体文件么,有研究过,平时用 font-spider。 webpack 集成没怎么实践过,还只知道 url-loader。 有三种不同的压缩处理策略的, 自己决定压缩打包哪些文字,如 FontZip,iconFont 自动检测要压缩打包哪些文字,如 font-spider