我正在尝试在Microchip pic控制器上实现证书签名验证(使用OpenSSL生成和签名证书)。 Microchip PIC控制器不支持OpenSSL库,但它具有加密/解密功能。我成功地在PIC控制器和Web服务器之间建立了SSL连接。我的下一步是在PIC控制器上设置签名验证。
阅读PKCS#1 V2.1 RSA密码学标准(http://www.rsa.com/rsalabs/node.asp?id=2125)后 我意识到加密与签名验证基本相同,解密与签名相同。更具体地说,加密和验证都使用公钥和以下公式:
m = s ^ e mod n
当s是签名或消息时,e是公共指数,n是模数,m是加密消息或解码签名。因此,我正在尝试使用提供的加密算法来执行签名验证。
为了验证证书,我生成了证书的SHA1哈希值;使用CA的公钥和加密算法解码签名。从解码签名中删除填充,结果散列应该等于证书的SHA1散列。
但是,我不能让两个哈希值相等。我尝试使用OpenSSL命令行验证我的假设和PIC控制器结果。
这是我从OpenSSL命令行和PIC控制器
获得的哈希值openssl rsautl -in signature.txt -verify -asn1parse -inkey pubkey.pem -pubin
db e8 c6 cb 78 19 3c 0f-fd 96 1c 4f ed bd b2 34 45 60 bf 65
这是我使用OpenSSL从Signature验证中获得的。删除“ff”填充后,我最终会得到证书哈希的asn1格式。
openssl rsautl -verify -in signature.txt -inkey pubkey.pem -pubin -raw -hexdump
00 01 ff ff ff ff ff ff ff ff ff ff ff 00 30 21 30
09 06 05 2b 0e 03 02 1a-05 00 04 14 db e8 c6 cb
78 19 3c 0f fd 96 1c 4f-ed bd b2 34 45 60 bf 65
然而,这是我从PIC控制器获得的,与上述
有很大不同8e fb 62 0e 09 c8 0b 49 40 1f 4d 2d a7 7d d6 8c
9b bc 95 e6 bc 98 4b 96 aa 74 e5 68 90 40 bf 43
b5 c5 02 6d ab e3 ad 7b e6 98 fd 10 22 af b9 fb
这是我的签名
7951 9b3d 244a 37f6 86d7 dc02 dc18 3bb4
0f66 db3a a3c1 a254 5be5 11d3 a691 63ef
0cf2 ec59 c48b 25ad 8881 9ed2 5230 bcd6
这是我的公钥(我正在使用一个非常小的密钥进行测试,一旦一切正常就会变大)
96 FE CB 59 37 AE 8C 9C 6C 7A 01 50 0F D6 4F B4
E2 EC 45 D1 88 4E 1F 2D B7 1E 4B AD 76 4D 1F F1
B0 CD 09 6F E5 B7 43 CA F8 14 FE 31 B2 06 F8 7B
指数为01 00 01
我想知道我的假设是错误的,我不能使用加密算法来解码签名?或者我做错了什么?
答案 0 :(得分:1)
事实证明我上面描述的方法是正确的。我能够通过散列证书并使用加密取消签名来获得匹配结果。
导致我之前尝试失败的问题是Microchip Pic控制器使用的字节顺序。他们使用小端而不是大端。我没有注意指数的字节顺序,因为 01 00 01 在两种格式中都是相同的。但是我错了,事实证明Microchip将4字节值视为指数(RSA标准??)。因此它在前面填充 00 ,结果为 00 01 00 01 。因此,字节顺序现在很重要,因为 00 01 00 01 与 01 00 01 00 不同。 01 00 01 00 是Microchip Pic使用的小端格式。