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

从公钥验证签名,BouncyCastle中自动检测算法

凌和颂
2023-03-14

我的问题是:如何将签名验证函数写成公钥算法的不可知论性?

我正在使用.NET的BouncyCastle库(V1.8.4)。我试图在事先不知道算法的情况下验证签名(但它的标识将嵌入到公钥中)。

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7t7Uo4NB7kjqPGMzdXbBI66gy8rz
oYvRatFPTGsdS9lCru6imfdMclcr/hCkxHgfgz0ewmKqEjWK8EjZczUCEA==
-----END PUBLIC KEY-----
$ openssl asn1parse -i -in pubkey.pem
    0:d=0  hl=2 l=  89 cons: SEQUENCE
    2:d=1  hl=2 l=  19 cons:  SEQUENCE
    4:d=2  hl=2 l=   7 prim:   OBJECT            :id-ecPublicKey
   13:d=2  hl=2 l=   8 prim:   OBJECT            :prime256v1
   23:d=1  hl=2 l=  66 prim:  BIT STRING
Private Function SignatureChecks(data() as Byte, pubkey as String, signature as String) As Boolean

    Dim keypars As Org.BouncyCastle.Crypto.AsymmetricKeyParameter 'impements ICipherParameters

    'Read and parse the PEM file into the proper object
    Dim pubkeybytes = Encoding.ASCII.GetBytes(pubkey)
    Using pubkeystream = New MemoryStream(pubkeybytes)
        Using reader = New StreamReader(pubkeystream)
            Dim pemrd = New PemReader(reader)
            'Now this is the decoded PEM for the public key
            keypars = pemrd.ReadObject()
        End Using
    End Using

    Dim signer As ISigner

    '*************************************************************
    'Currently this is hardwired: how can I make this intelligent?
    '*************************************************************
    signer = SignerUtilities.GetSigner("SHA-256withECDSA")

    'Init the signer with the public key
    signer.Init(False, keypars)
    'Appends the data to be verified in the SHA block buffer
    signer.BlockUpdate(data, 0, data.Length)

    'Get the bytes from the signature
    Dim sigbytes = Convert.FromBase64String(signature)

    Return signer.VerifySignature(sigbytes)

End Function

只要使用secp256k1算法进行签名,这段代码就可以正常工作,但情况可能并非如此。我试着从AsymmetricKeyParameter对象(实际上是一个ECPublicKeyParameters)中提取信息,但它的公共成员很少。但是,使用调试器的对象内部确实显示了相关信息:像publicKeyParamset=1.2.840.10045.3.1.7、algorithm=“ec”等值。

提前致谢

共有1个答案

公羊英达
2023-03-14

公钥中通知的prime256v1算法只是加密算法(应该如此),而公钥或签名中都没有指定哈希算法。为了验证签名,必须在使用其他方法的参与者之间商定一个散列函数(在本例中为SHA-256)。一个例子是CMS编码(以前的PKCS#7),它是一个容器方法,可以嵌入检查签名有效性所需的所有信息。从公钥获取加密算法不足以执行任务。

 类似资料:
  • 问题内容: 我有一个外部服务,在定义的事件发生后会给我回电,并用其私钥签署他的请求。 我已经存储了如下公钥: 因此,我的工作是通过验证签名来检查请求的内容是否未更改。 这是我的算法: 但是目前,我的算法已停止在此消息的“ PublicKey publicKey = keyFactory.generatePublic(publicKeySpec)”步骤处: 那么,如何以java api接受的方式加载

  • 我的理解是公钥加密,私钥解密...有谁能帮我弄明白吗?

  • 另外,这里还有一个函数演示,它从mod和指数生成PEM(摘自http://stackoverflow.com/questions/18835132/xml-to-pem-in-node-js) 前面提到的jsonwebtoken库可以使用任何一种方法来验证JWT--但是为什么呢?如果这两种验证方法都可以验证一个JWT签名,为什么它们都存在呢?他们之间有什么权衡?一个比另一个更安全吗?我应该使用哪一

  • 我应该如何更改A方法?任何想法都是好的。提前谢谢。

  • 验证应用程序: 据我所知.pfx文件包含公钥和私钥信息,因此我不应该让任何人都可以使用它。据我所知,验证步骤只需要公钥。我如何使用rsa.verifydata或其他函数来验证签名而不暴露我的pfx文件?

  • 我需要用DSA公钥验证X509证书签名。我的证书文件x509.crt,我的DSA公钥在一个名为dsa_pub.key的文件中 我正试图为此使用openssl。我已经阅读了openssl验证文档,但在其中找不到任何有关DSA的参考。 当我运行以下命令时,我可以在证书中看到我的DSA公钥: 但是,在使用文件DSA_pub.key中的DSA公钥验证cert.crt时,我遇到了麻烦 如果您有任何建议,我将