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

ECDSA 参数在 pem 文件和调试过程之间未对齐

汪永春
2023-03-14

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

  1. openssl ecparam-名称secp256k1-out secp256k1.pem
  2. openssl ecparam-in secp256k1.pem-genkey-noout-out secp256k1密钥。pem
  3. openssl ec-在secp256k1密钥中。pem-pubout-out secp256k1-key-pub.pem

然后,我使用此密钥对测试二进制文件进行签名

直到这一步一切都很顺利。然后我使用widbg调试step.6命令来了解整个验证流程。我先从pem文件中转储EC参数。当我在windbg中检查一些变量时;我感到困惑,因为该值并不像我期望的那样。E:\project\ecdsa\secp256k1

字段类型:素数字段

主要:

00:ff:ff:FFFF:ff:ff:ff:ff:ff:ff

答:0

乙: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:fe:ba:ae:dc:e6:af:48:a0:3b:bf:d2:5e:8c:d0: 36:41:41

余因子:1 (0x1)

E:\project\ecdsa\secp256k1

私钥:(256位)

priv:

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: fd: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:b6:87:71: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生成器点)Qa点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:

Qa点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

无符号整型 * 0x006b17e0

0:000:x86

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

006 b17f 0 e9 7c 09 94 99 bb 6a 6e-C5 24 66 4e be 75 15 A8。|....约$fN.u..

006 b 1800 FD FD FD FD ab ab ab ab ab ab ab ab ab ab ee Fe ee Fe................

0:000:x86

无符号整型 * 0x006b1840

0:000:x86

006 b 1840 F8 42 F5 18 3e C5 D4 18-29 4d C9 a5 E1 C9 2c E2。B..

006 b 1850 C6 E2 EC cf 82 B9 85 D6-56 37 64 E8 0c 4f 31 54........V7d..O1T

006b1860 fd fd fd fd ab ab ab-ab ab ab ab ee fe ee fe ................

来自 windbbg,公钥,点 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

0:000:x86

006 b13c 0 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。。。

006 B13 E0 FD FD FD FD ab ab ab ab-ab ab ab ab ee Fe ee Fe................

0:000:x86

0:000:x86

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

006b1430 36 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 ab ab ee fe ee fe..................

有人能给我一些意见吗?

谢谢

共有1个答案

皇甫通
2023-03-14

OpenSSL以Montgomery的形式在内部维护椭圆曲线点的坐标,以允许更有效的计算,并且还使用投影坐标而不是仿射坐标,尽管这在这一点上并不重要,因为还没有进行真正的计算,Z只是被编码(1)。请参阅< code>ecp_smpl.c中的< code > EC _ GFp _ simple _ html" target="_blank">set _ Jprojective _ coordinates _ GFp ,并注意< code >组-

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

 类似资料:
  • 本文向大家介绍测试和调试之间的区别,包括了测试和调试之间的区别的使用技巧和注意事项,需要的朋友参考一下 在以任何编程语言开发的任何软件或应用程序的开发过程中以及开发之后,测试和调试都是最重要的步骤或实践。现在,根据功能和实践方法,我们可以区分测试和调试。 以下是测试和调试之间的重要区别。 序号 键 测验 调试 1 定义 从技术上来说,测试是检查应用程序是否与预期功能相同的过程,而不是应有的功能。

  • 本文向大家介绍过程和面向对象编程之间的差异。,包括了过程和面向对象编程之间的差异。的使用技巧和注意事项,需要的朋友参考一下 面向过程的编程(POP)和面向对象的编程(OOP)都是编程领域中的高级语言,并广泛用于应用程序开发中。根据开发代码的性质,两种语言具有不同的方法,在这两种方法之间彼此有所区别。 以下是面向过程的编程(POP)与面向对象的编程(OOP)之间的重要区别 序号 键 面向对象编程(O

  • 问题内容: 我正在构建一个使用BouncyCastle作为加密提供程序的网络应用程序。假设您具有生成密钥对的方法: 我对为什么要获得 ECDSA KeyPairGenerator 实例感到困惑。为什么不只说 EC ?我知道BouncyCastle附带有一种ECDH Key类型,但是我认为两者在曲线上的点代表相同的东西-还是我完全不理解其背后的理论? 我问的原因是,现在我的应用程序使用ECDH fi

  • 我最近从开发角色改为QA角色。在设置QA项目时,我的说明给出了WebStorm的配置要求。然而,我更喜欢使用VSCode。 我正在尝试将WebStorm调试配置选项转换为VSCode。我根据给我的值列出了我认为launch.json的等价选项。 网络Storm= < li >节点解释器= 通常在运行Node.js程序时,我只有一组参数可以通过< code>process.argv数组访问。 这两种

  • 保存修改时间、创建时间、上次访问时间 在压缩文件里启用保存修改时间、创建时间、上次访问时间。仅支持 RAR 压缩文件。仅 RAR 5.0 压缩文件格式允许禁用保存文件修改时间。如果这些文件时间之一未保存在压缩文件里,它会在解压时被指定为当前的系统时间。 您需要启用“设置创建时间”和“设置上次访问时间”选项 在解压对话框的 高级 部分,以便在解压文件时恢复这些时间。默认启用“设置创建时间”。 高精度

  • 添加的文件 要压缩的文件和文件夹名。此区域会自动填入已选定的文件,但如果需要的话,您也可以编辑它们,或单击“附加”按钮选择更多文件添加列表。在此它允许使用通配符过滤掩码,此例子下 WinRAR 将会在当前文件夹和全部的子文件夹搜索符合过滤掩码的文件。如果您要指定多个掩码,使用空格分割它们。如果掩码包含空格,使用引号括住它。 例如,您可以输入: *.txt *.doc "set 1.*" 则会压缩全