又有客户需要高级算法了,提出需要ECDH_SECP256R1 + HKDF-SHA256,一顿研究,总算搞定。
关于ECDH_SECP256R1,之前文章(ECDH产生共享密钥 http://t.csdn.cn/T4OYc
)已经介绍过,是一种密钥协商算法,主要利用彼此公私钥产生共享密钥。
这里重点介绍下HKDF-SHA256,这个主要是一种密钥分散方法。HKDF的原意是HMAC-based Extract-and-Expand Key Derivation Function,分散步骤如下:
1、首先用salt作为密钥对上面计算出来的共享密钥IKM进行计算,计算算法为HMAC-SHA256,得出PRK。
2、然后用PRK作为密钥,通过HMAC-SHA256算法,对T(n-1)+info+counter进行计算,得出T(n),不断计算,直到能得到L长度的密钥为止。
数据实例:
A.2. Test Case 2
Test with SHA-256 and longer inputs/outputs
Hash = SHA-256
IKM = 0x000102030405060708090a0b0c0d0e0f
101112131415161718191a1b1c1d1e1f
202122232425262728292a2b2c2d2e2f
303132333435363738393a3b3c3d3e3f
404142434445464748494a4b4c4d4e4f (80 octets)
salt = 0x606162636465666768696a6b6c6d6e6f
707172737475767778797a7b7c7d7e7f
808182838485868788898a8b8c8d8e8f
909192939495969798999a9b9c9d9e9f
a0a1a2a3a4a5a6a7a8a9aaabacadaeaf (80 octets)
info = 0xb0b1b2b3b4b5b6b7b8b9babbbcbdbebf
c0c1c2c3c4c5c6c7c8c9cacbcccdcecf
d0d1d2d3d4d5d6d7d8d9dadbdcdddedf
e0e1e2e3e4e5e6e7e8e9eaebecedeeef
f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff (80 octets)
L = 82
PRK = 0x06a6b88c5853361a06104c9ceb35b45c
ef760014904671014a193f40c15fc244 (32 octets)
OKM = 0xb11e398dc80327a1c8e7f78c596a4934
4f012eda2d4efad8a050cc4c19afa97c
59045a99cac7827271cb41c65e590e09
da3275600c2f09b8367793a9aca3db71
cc30c58179ec3e87c14c01d5c1f3434f
1d87 (82 octets)
3、整个ECDH_SECP256R1 + HKDF-SHA256演示
ECDH:
ecc_pub_B = 03EBDCEFDAF5C837BA32F79996C266FA70E82B62E9EA789BC6B33E6DDAB536E4CC
ecc_pri_A = C3E0A65F855C24726B157ED7E69E49D5F27FB402AEF7A4B7B38531A4EE93C911
GenerateSharedSecretKey: 70A522F6DB9652573E8871E17887F43DA0F29439B8CAC686BCD5FDD28F993473
DerivateSecretKey Calculate (HKDF-SHA256)
IKM = 70A522F6DB9652573E8871E17887F43DA0F29439B8CAC686BCD5FDD28F993473
Salt = 040010112233445566778899AABBCCDDEEFFADDB
Info = 040010112233445566778899AABBCCDDEEFFADDB
Olen = 0x30
HKDF DerivateSecretKey: 1F4F081A3F08562F438747063051BEB6215303489C910E4F6E003AEA7705A93DACC24BD1B877F128097F538D37D35E2B
DerivateSecretKey OK!
有问题请留言,或者联系我,tianshanjinyou