构建一个简单的键Blob

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

在构建SIMPLEBLOB数据结构之前需要两个数据项:要传输的会话密钥和要用于加密它的公钥。为了本例的目的,我们将使用40位RC4会话密钥和上一节中的公钥。会话密钥材料的实际值为:

0x00000000 74 4f 06 35 3f tO.5?

第一步是构建PKCS#1,类型2加密块。这与公钥的模数(64字节)的大小始终相同,并包含以下字段:

字节描述
5会话密钥材料。该字段的大小将根据会话密钥的大小而有所不同。

从上面的会话密钥的十六进制转储和下面的加密块的十六进制转储中可以看出,会话密钥数据中的字节在被放入加密块之前被反转。这是因为Windows NT以【小】端序格式格式化数据,加密块必须以【大】 endian格式内置。

1零值。
56随机填充数据。必要时调整此字段的大小,以便加密块的总长度正确。这些字节都不允许为零。
1PKCS块类型(0x02)。
1零值。

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

一旦加密块建成,它看起来像这样:

00000000 3F 4F 35 06 74 00 C9分贝?5.Ot ...

0x00000008 B1 B0 74 8E D4 C5 AA .T ......

0x00000010 8A 4D 99 4F 0F 19和24 ..$ ..M.O

0x00000018 B0 2E 93 FE E9 F4 93 D4 ........

0x00000020 dc ac 9e 9f 3a 62 be f1 ....:b ..

0x00000028 E4 1d的44 5C 33 E5 4F 2F ..D \\ 3./O

0x00000030 58 01 95 16 36 86 65 F7 X ...6..e

0x00000038 68 6C 28 2A 79 55 02 00 * HL(YU ..

下一步是使用相应的公钥加密块。一旦这样做,加密块看起来像乱七八糟:

00000000 E3 C1 78 62 51 C4 1F 4F ..xb..QO

0x00000008 E9 50 89 0D FD 58万桶9D .P ...X ..

0x00000010 74 c7 54 19 bd 97 3b a0 t.T...;.

0x00000018 f0 6c ee 86 05 74 16 62 .l ...t.b

0x00000020 27 A5 99 63 C4 95 6F编” ..c.o ..

0x00000028 3e 93 ba 9a ea 36 cc 96 > ....6 ..

0x00000030 E8 AA 92 15 50 2C 3C A1 ....,{989 796 003} P.

0x00000038 d3 1f 08 e2 82 cd 90 2b .......+

最后,将BLOBHEADER结构和算法标识符粘贴到加密块的前端,从而产生完整的SIMPLEBLOB数据结构:

0x00000000 01 02 00 00 01 68 00 00 .....h..

0x00000008 A4 00 00 00 78 62 C1 E3 ......XB

0x00000010 c4 1f 51 4f e9 50 89 fd ..QO.P ..

0x00000018 0d 58 bd 9d 74 c7 54 19 .X..t.T。

0x00000020 bd 97 3b a0 f0 6c ee 86 ..;..l..

0x00000028 05 74 16 62 27 A5 99 63 .t.b”。C

0x00000030 C4 6F 95和93 BA 3E 9a中的.o ..{989 796 004} ...

0x00000038 ea 36 cc 96 92 e8 aa 15 .6 ......

0x00000040 2c 50 a1 3c d3 1f 08 e2,P。< ....

0x00000048 82 cd 90 2b ...+

请注意,BLOBHEADER结构和算法标识符已分配以下值:

blobheader.bType = SIMPLEBLOB; // 0x01

blobheader.bVersion = CUR_BLOB_VERSION; // 0x02

blobheader.Reserved = 0; // 0x0000

blobheader.aiKeyAlg = CALG_RC4; // 0x00006801

algid = CALG_RSA_KEYX; // 0x0000a400

填写BLOBHEADER结构时,您的代码应在保留的字段中置零。