Openssl pem文件和调试进程之间未对齐ECDSA参数

Openssl pem文件和调试进程之间未对齐ECDSA参数,openssl,ecdsa,Openssl,Ecdsa,我通过下面的命令创建一个ECDSA密钥对 openssl ecparam-名称secp256k1-out secp256k1.pem openssl ecparam-in secp256k1.pem-genkey-noout-out secp256k1-key.pem openssl ec-in secp256k1-key.pem-pubout-out secp256k1-key-pub.pem 然后我用这个密钥对一个测试二进制文件进行签名 openssl dgst-sha256-二进制-输出s

我通过下面的命令创建一个ECDSA密钥对

  • openssl ecparam-名称secp256k1-out secp256k1.pem
  • openssl ecparam-in secp256k1.pem-genkey-noout-out secp256k1-key.pem
  • openssl ec-in secp256k1-key.pem-pubout-out secp256k1-key-pub.pem
  • 然后我用这个密钥对一个测试二进制文件进行签名

  • openssl dgst-sha256-二进制-输出sha256_out.bin pmu_msg.bin
  • openssl pkeyutl-登录sha256_out.bin-inkey secp256k1-key.pem-out sig_ecdsa.bin-pkeyopt摘要:sha256
  • openssl pkeyutl-verify-in-sha256_out.bin-sigfile-sig_ecdsa.bin-pkeyopt摘要:sha256-pubin-inkey secp256k1-key-pub.pem
  • 在这一步之前一切都很顺利。 然后我使用widbg调试步骤6命令,以了解整个验证流程。 我首先从pem文件中转储EC参数。 当我检查windbg中的一些变量时;我感到困惑,因为价值不符合我的期望。 E:\project\ecdsa\secp256k1>openssl ecparam-in secp256k1.pem-text-param_enc explicit-noout

    字段类型:素数字段

    质数:

    00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff: ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:fe:ff: ff:fc:2f

    A:0

    B:7(0x7)

    生成器(未压缩):

    04:79:be:66:7e:f9:dc:bb:ac:55:a0:62:95:ce:87: 0b:07:02:9b:fc:db:2d:ce:28:d9:59:f2:81:5b:16: f8:17:98:48:3a:da:77:26:a3:c4:65:5d:a4:fb:fc: 0e:11:08:a8:fd:17:b4:48:a6:85:54:19:9c:47:d0: 8f:fb:10:d4:b8

    订单: 00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff: ff:fe:ba:ae:dc:e6:af:48:a0:3b:bf:d2:5e:8c:d0: 36:41:41

    辅因子:1(0x1)

    E:\project\ecdsa\secp256k1>openssl ec-in secp256k1-key.pem-text-noout

    私钥:(256位)

    私人:

    8e:73:0d:3f:1b:91:84:46:08:37:e1:57:76:6f:3a: 0d:45:13:b0:47:e1:8a:4a:10:c0:e5:5e:00:2f:3b: 财务总监:98

    酒吧:

    04:90:66:38:2f:91:f9:08:32:36:fd:dd:21:8f:91: ce:84:a8:94:54:a1:bd:10:48:05:20:40:7b:6d:77: 53:25:6f:39:b7:3c:30:0f:e4:9b:a0:40:ee:48:bf: 09:22:18:70:f4:cd:9b:b0:9d:7d:9c:d8:99:65:b6: 87:71:ef:ec:6c

    ASN1 OID:secp256k1

    根据以上输出,我假设

    发电机点X为

    79:be:66:7e:f9:dc:bb:ac:55:a0:62:95:ce:87:0b:07: 02:9b:fc:db:2d:ce:28:d9:59:f2:81:5b:16:f8:17:98:

    发电机点Y为

    48:3a:da:77:26:a3:c4:65:5d:a4:fb:fc:0e:11:08:a8: fd:17:b4:48:a6:85:54:19:9c:47:d0:8f:fb:10:d4:b8

    对于公钥,假设Qa=(da X生成器点) 质量保证点X是

    90:66:38:2f:91:f9:08:32:36:fd:dd:21:8f:91:ce:84: a8:94:54:a1:bd:10:48:05:20:40:7b:6d:77:53:25:6f:

    质量保证点Y是

    39:b7:3c:30:0f:e4:9b:a0:40:ee:48:bf:09:22:18:70: f4:cd:9b:b0:9d:7d:9c:d8:99:65:b6:87:71:ef:ec:6c

    然后在openssl!ossl_ecdsa_verify_sig+0x40a[E:\project\openssl\openssl_v\openssl\crypto\ec\ecdsa_ossl.c@435]

    我从eckey结构中转储公钥X/Y

    0:000:x86>??eckey->pub_key->X->d

    无符号整数*0x006b17e0

    0:000:x86>db 0x006b17e0

    006b17e0 d5 7e 76 7a b0 6e d0 1d fe 56 63 ab 47 45 27 1b.~vz.n…Vc.GE

    006b17f0 e9 7c 09 94 99 bb 6a 6e-c5 24 66 4e应为75 15 a8.|…jn.$fN.u

    006b1800 fd fd fd ab ab ab ab ee ee fe

    0:000:x86>??eckey->pub_key->Y->d

    无符号整数*0x006b1840

    0:000:x86>db 0x006b1840

    006b1840 f8 42 f5 18 3e c5 d4 18-29 4d c9 a5 e1 c9 2c e2.B>.M

    006b1850 c6 e2 ec cf 82 b9 85 d6-56 37 64 e8 0c 4f 31 54……V7d..O1T

    006b1860 fd fd fd ab ab ab ab ee ee fe

    来自Windbg, 公钥,第X点=

    d5 7e 76 7a b0 6e d0 1d fe 56 63 ab 47 45 27 1b e9 7c 09 94 99 bb 6a 6e-c5 24 66 4e be 75 15 a8

    但在pem文件中,x点是

    90:66:38:2f:91:f9:08:32:36:fd:dd:21:8f:91:ce:84: a8:94:54:a1:bd:10:48:05:20:40:7b:6d:77:53:25:6f:

    公钥Y点=

    f8 42 f5 18 3e c5 d4 18-29 4d c9 a5 e1 c9 2c e2 c6 e2 ec cf 82 b9 85 d6-56 37 64 e8 0c 4f 31 54

    但在pem文件中,Y点是

    39:b7:3c:30:0f:e4:9b:a0:40:ee:48:bf:09:22:18:70: f4:cd:9b:b0:9d:7d:9c:d8:99:65:b6:87:71:ef:ec:6c

    这些值与我在公共pem文件中看到的不同

    然后我在windbg中转储生成器点,并有同样的疑问

    0:000:x86>??eckey->group->generator->X->d unsigned int*0x006b13c0

    0:000:x86>db 0x006b13c0

    006b13c0 97 20 7e 48 5a 2e 36 d7 db 66 bc 29 53 29 1e 23~HZ.6..f.)S)#

    006b13d0 9c 12 fd 33 c0 48 9f 97-48 9f 08 e9 43 e6 81 99…3.H…H…C

    006b13e0 fd fd fd ab ab ab ab ee ee fe

    0:000:x86>??eckey->group->generator->Y->d无符号整数*0x006b1420

    0:000:x86>db 0x006b1420

    006b1420 e2 ab db d3 d2 a6 5e b1-4d c6 1d 1f 5d 5d fc 8d……^.M.]

    006B143036 c1 19 ac 9a b5 b6 70-d6 82 a5 d4 1f 85 3f cf 6……p

    006b1440 fd fd fd ab ab ab ab ee ee fe

    谁能给我一些意见吗


    感谢

    OpenSSL在内部维护了椭圆曲线点的坐标,以允许更高效的计算——并且还使用了投影坐标而不是仿射坐标,尽管这一点并不重要,因为还没有进行真正的计算,Z只是编码(1)。请参阅并注意
    group->meth->field\u encode
    步骤,这些步骤使用扩展为调用的宏
    BN\u to\u montgomery
    进行解析


    编写OpenSSL代码是为了提高效率,而不是为了便于阅读。而C会增加更多的混乱。加上大部分仍然遵循传统,由许多简洁的名字和几乎没有评论。如果你想从调试中学习——尽管坦率地说,我怀疑你能从规范中获得更多,可能更少,因为ECC的有趣部分在于数学,而不是代码——我建议使用Java或带有BouncyCastle的C

    OpenSSL维护椭圆曲线点之间的坐标