ECDH_SECP256R1 + X9.63 KDF-SHA256
又是客户需要的算法,有需要就研究,毕竟知识有用到才能体现其价值。
关于ECDH_SECP256R1,之前文章( http://t..cn/T4OYc )已经介绍过,是一种密钥协商算法,主要利用彼此公私钥产生共享密钥。
这里重点介绍下
X9.63 KDF-SHA256
这个主要是一种密钥分散方法。X9.63是指美国佬出的标准规范“ANSI X9.63”,KDF是 Key Derivation Function,SHA256就是采用哈希256计算哈希值,具体算法过程介绍如下: 简单说就是用SHA256算法,对Z+counter+info进行计算,得出Hash(i),不断计算,直到能得到所需KeydataLen长度的密钥为止。
数据实例:
[SHA-256] [shared secret length = 192] [SharedInfo length = 128] [key data length = 1024] COUNT = 0 Z = 22518b10e70f2a3f243810ae3254139efbee04aa57c7af7d SharedInfo = 75eef81aa3041e33b80971203d2c0c52 Counter = 00000001 Hash input 1 = 22518b10e70f2a3f243810ae3254139efbee04aa57c7af7d0000000175eef81aa3041e33b80971203d2c0c52 K1 = c498af77161cc59f2962b9a713e2b215152d139766ce34a776df11866a69bf2e Counter = 00000002 Hash input 2 = 22518b10e70f2a3f243810ae3254139efbee04aa57c7af7d0000000275eef81aa3041e33b80971203d2c0c52 K2 = 52a13d9c7c6fc878c50c5ea0bc7b00e0da2447cfd874f6cf92f30d0097111485 Counter = 00000003 Hash input 3 = 22518b10e70f2a3f243810ae3254139efbee04aa57c7af7d0000000375eef81aa3041e33b80971203d2c0c52 K3 = 500c90c3af8b487872d04685d14c8d1dc8d7fa08beb0ce0ababc11f0bd496269 Counter = 00000004 Hash input 4 = 22518b10e70f2a3f243810ae3254139efbee04aa57c7af7d0000000475eef81aa3041e33b80971203d2c0c52 K4 = 142d43525a78e5bc79a17f59676a5706dc54d54d4d1f0bd7e386128ec26afc21 key_data = c498af77161cc59f2962b9a713e2b215152d139766ce34a776df11866a69bf2e52a13d9c7c6fc878c50c5ea0bc7b00e0da2447cfd874f6cf92f30d0097111485500c90c3af8b487872d04685d14c8d1dc8d7fa08beb0ce0ababc11f0bd496269142d43525a78e5bc79a17f59676a5706dc54d54d4d1f0bd7e386128ec26afc21
整个ECDH_SECP256R1 + X9.63 KDF-SHA256演示
ECDH: ecc_pub_B = 03EBDCEFDAF5C837BA32F79996C266FA70E82B62E9EA789BC6B33E6DDAB536E4CC ecc_pri_A = C3E0A65F855C24726B157ED7E69E49D5F27FB402AEF7A4B7B38531A4EE93C911 GenerateSharedSecretKey: 70A522F6DB9652573E8871E17887F43DA0F29439B8CAC686BCD5FDD28F993473 DerivateSecretKey Calculate (X963KDF-SHA256) IKM = 70A522F6DB9652573E8871E17887F43DA0F29439B8CAC686BCD5FDD28F993473 Info = 040010112233445566778899AABBCCDDEEFFADDB Olen = 0x30 IKM + Counter + Info= 70A522F6DB9652573E8871E17887F43DA0F29439B8CAC686BCD5FDD28F993473 00000001 040010112233445566778899AABBCCDDEEFFADDB HashResult 0 = 2A2D81A60881CAA42F0D58B8725A07B8EF9FD3A3AFD06359954CE727E3A03A97 IKM + Counter + Info= 70A522F6DB9652573E8871E17887F43DA0F29439B8CAC686BCD5FDD28F993473 00000002 040010112233445566778899AABBCCDDEEFFADDB HashResult 1 = 28D3FBF1E12A95DA85398AF4FCA2526A9858C4FC87FE3E448EB2D4F1A1DC0FA9 X963KDF DerivateSecretKey: 2A2D81A60881CAA42F0D58B8725A07B8EF9FD3A3AFD06359954CE727E3A03A9728D3FBF1E12A95DA85398AF4FCA2526A DerivateSecretKey OK!