摘要:
对《GM/T 0021-2012 动态口令密码应用技术规范》实现过程中的要点进行记录和说明
关键词:
SM3 OTP 动态口令 动态密码
1.《规范》中动态口令生成方式注意点:
T = T_0 / T_c
// T : 时间因子 (8字节,整型)
// T_0 : 输入的时间 (8字节,整型)
// T_c : 口令变化周期 《规范》中 明确最大值为60
ID= {T|C|Q}
// ID : 杂凑及分组算法的输入信息(即使用SM3或SM4计算的入参信息,最小要求128位,不足的时补零)
// C : 事件因子 (4字节, 整型)
// Q : 挑战因子 (最小为4字节,使用ASCII码表示)
// {T|C|Q} : 表示将T,C,Q直接拼接成至少128位的
S = F(K|ID)
// S : 杂凑及分组算法的输入结果(即使用SM3或SM4计算的计算结果, SM3时输出是256位数据, SM4时输出是128位数据)
// F() : SM3或SM4算法
// K : 种子密钥 (不少于128位,即>=16字节)
OD = Truncate(S)
// Truncate() 截断函数, 使用SM3和SM4时有所不同,详见《规范》,特别注意算法中的<< 是循环左移
// OD是截断函数的输出结果,输出结果是32位数据
P = OD % (10^N)
// P : 动态口令最终值
// N : 动态口令长度(要求大于6)
2.《规范》中其他注意点:
- << 表示的是循环左移, 注意其他OTP算法中的逻辑左移区别,但是从算法实现上看,使用到位移的输入参数是一个byte,最大的循环位数是24,没有大于32,并且示例代码对位移的参数也做了
i%32
,可见使用逻辑左移也可以; - 示例数据中的KEY值是Hex后的值,在使用KEY值转为byte[]时要decode
- 示例代码中的内容提示了,注意数据的存储方式是大端模式,使用java进行实现可不用考虑;
- 有博客说《规范》中的示例数据与示例算法不匹配,但我个人实现后是可以匹配上的;
- 使用java实现是特别注意32位int整型数据时有符号的,但是算法却要求使用一个32位的无符号整型进行计算,因此需要注意最高位符号位为1的情况.
3.基于《规范》附件中的用例,将关于SM3算法各用例的中间计算结果补充如下:
KEY(Hex) | T_0(Hex) | T(Hex) | C(Hex) | Q(Hex) | ID(Hex) | S(Hex) | OD | Password |
---|---|---|---|---|---|---|---|---|
1234567890abcdef1234567890abcdef | 4e520883 | 4e520883 | 4d2 | 35363738 | 1234567890abcdef1234567890abcdef000000004e520883000004d235363738 | 9a51d5a4495c03d4a155ae2e74052b527a3d460d8d97255ed345ccb73a6563b5 | 243814095 | 814095 |
1234567890abcdefabcdef1234567890 | 4e520893 | 4e520893 | 15f5 | 33363938 | 1234567890abcdefabcdef1234567890000000004e520893000015f533363938 | 497ebf9a0619d9f8f41cdaa3a3d5f4299fc3fdbbba97f290b549cb941abf238e | 300959691 | 959691 |
1234567890abcdef0987654321abcdef | 4e5208a6 | 4e5208a6 | 15f5 | 33363938 | 1234567890abcdef0987654321abcdef000000004e5208a6000015f533363938 | 10c9a190c3aedf3157f87e9d7770b1d5512b67447d49c9fb1d040677f9803b3d | 2296063014 | 063014 |
1234567890abcdefabcdef0987654321 | 4e5208c7 | 4e5208c7 | 805 | 36393834 | 1234567890abcdefabcdef0987654321000000004e5208c70000080536393834 | bda419e9d87d13f14d682d57dab42d32f6ab9d822451f46b955b961c92621195 | 16302593 | 302593 |
87524138025adcfe2584376195abfedc | 4e5208db | 4e5208db | 80a | 33303234 | 87524138025adcfe2584376195abfedc000000004e5208db0000080a33303234 | 9c35489cc1ae60c2e43c4384073de166028a45924e8a97835ae1a9db79748701 | 1858657337 | 657337 |
87524138025adcfeabfedc2584376195 | 4e5208fa | 4e5208fa | 808 | 32303138 | 87524138025adcfeabfedc2584376195000000004e5208fa0000080832303138 | cf4776886290c51e977eb5a304cef1a92fbfe0afdf5f8149573e807768441efc | 2630345821 | 345821 |
adcfe87524138025abfedc2584376195 | 4e52091b | 4e52091b | 936 | 31303336 | adcfe87524138025abfedc2584376195000000004e52091b0000093631303336 | e0f110de6923376baddf31ad0a7cdfaf0472b9a96e31eb9574ee8c6b05eeb08e | 4025629660 | 629660 |
58ade3698fe280cb6925010dd236caef | 4e520933 | 4e520933 | 9f3 | 32303538 | 58ade3698fe280cb6925010dd236caef000000004e520933000009f332303538 | b57905000bbf8426ecf4f163808bbe1d4e7a0b56544c93faace2986db43055ea | 848479821 | 479821 |
58ade365201d80cbdd236caef6925010 | 4e520946 | 4e520946 | 178f | 32303538 | 58ade365201d80cbdd236caef6925010000000004e5209460000178f32303538 | 5365af2a8045412c9a6fcc50154e647a15b7f3f4d79377af446d0006426694b9 | 4152893826 | 893826 |
65201d80cb58ade3dd236caef6925010 | 4e520955 | 4e520955 | 19b4 | 31303437 | 65201d80cb58ade3dd236caef6925010000000004e520955000019b431303437 | f3e69c05f28c66b85453bc809fff156445e5816a98854d93310ee1b7b71408a9 | 2706607614 | 607614 |