签名样本

【勇芳软件工作室】汉化HomePreviousNext

本节将介绍签名过程。此样本从上一个样本中使用的哈希值开始;也就是“1134-kelp”字符串的MD5散列。此哈希值如下所示:

0x00000000 73 40 e6 e2 74 b8 ea 39 s @ ..t..9

0x00000008 93 95 aa 29 d6 38 b5 2a ...)8.*

此示例假定应用程序将“Test Signature”指定为描述字符串。CSP做的第一件事是将这个字符串添加到正在签名的哈希对象中。当然,CSP以Unicode格式接收到描述字符串,如下所示:

0x00000000 54 00 65 00 73 00 74 00 T.e.s.t.

0x00000008 20 00 53 00 69 00 67 00 .S.i.g。

0x00000010 6E 00 61 00 74 00 75 00 n.a.t.u.

Once the description string has been hashed in, the hash value is extracted:

一旦描述字符串已经被散列,则提取哈希值:

0x00000000 a8 2b df c2 c9 f1 bb 62。+ .....b

0x00000008 38 78 d4 60 fa ce 5c 2a 8x.`..\\\\*

下一步是构建PKCS签名块。这与公钥的模数(64字节)的大小始终相同,并包含以下字段:

字节描述
16哈希的数据要签名。该字段的大小将根据所使用的哈希算法而有所不同。

从比较上述哈希值的十六进制转储和以下加密块的十六进制转储可以看出,哈希值中的字节在被放入加密块之前被颠倒。这是因为Windows NT以【小】端序格式格式化数据,加密块必须以【大】 endian格式内置。

18ASN.1编码散列算法说明符。该字段的大小将根据所使用的哈希算法而有所不同。请注意,此数据也相反。

ASN.1的描述超出了本文档的范围,但在下一节中提供了一个常见的ASN.1字符串表。有关ASN.1的更多信息,请参阅PKCS文档。

1零值。
27填充数据(0xff的)。必要时调整此字段的大小,以便签名块的总长度正确。
1PKCS块类型(0x01)。
1零值。

您可能会注意到,该表的顺序与PKCS文档中的图表相反。这是因为我们正在一个小端子计算机上以大字符串构建签名块。

签名块建成后,看起来像这样:

0x00000000 2a 5c ce fa 60 d4 78 38 *\\\\..`.x8

0x00000008 62 bb f1 c9 c2 df 2b a8 b .....+。

0x00000010 10 04 00 05 05 02 0D F7 ........

0x00000018 86 48 86 2a 08 06 0c 30 .H。* ...0

0x00000020 20 30 00 FF FF FF FF FF 0 ......

0x00000028 FF FF FF FF FF FF FF FF ........

0x00000030 FF FF FF FF FF FF FF FF ........

0x00000038 FF FF FF FF FF FF 01 00 ........

下一步是使用适当的私钥加密块。在这个例子中,使用的私有密钥是与上一节公钥Blob格式中使用的公钥对应的私钥。这导致完成的数字签名:

0x00000000 64 f6 46 3a 97 2e 83 38 d.F:...8

0x00000008九时57分41 59 0D 43毫秒作为.WC..AY。

0x00000010 03 35 36 E4 D6 1207米2C FC .5..6o。

0x00000018 63 43 95 c4 fd e2 c4 ed cC ......

0x00000020 06 DA 0A 9A 21 98 FC 6E ...!...N

0x00000028 3F 1C广告3A分贝7C 83 2F ..:|?./

0x00000030 D0 14 58 80 02 96 DF ..X直流.....

0x00000038 70 09 00 5B E3 2B BD 45 p ...[+ E