关于xlog加密处理分析
xlog 使用微型加密算法(TEA,Tiny Encryption Algorithm)对日志数据进行加密,使用 ECDH 密钥交换算法进行对称密钥的协商,对称密钥以数组形式存储在栈区,声明为 LogCrypt
类的私有字段。
会话密钥长度与椭圆曲线参数相关,xlog 中使用 16 Bytes 密钥。
相关接口
- uECC_make_key ( client_pubkey, client_pri )
- 生成客户端公私钥对
- uECC_shared_secret ( svr_pubkey, client_pri, secret )
- 根据服务端公钥与客户端私钥,运算出对称密钥 secret
- __TeaEncrypt ( log, secret )
- 使用对称密钥加密日志
协商流程:
client
调用uECC_make_key
生成 pubKeyA 与 priKeyA;server
调用uECC_make_key
生成 pubKeyB 与 priKeyB;client
获取server
公钥pubKeyB
,调用uECC_shared_secret
生成对称密钥secret
;(此处采用 ECDH 密钥交换算法)server
获取client
公钥pubKeyA
,调用uECC_shared_secret
生成对称密钥secret
;
ECDH 密钥交换算法原理概述
ECDH 基于 ECC 算法,ECC 是建立在基于椭圆曲线的离散对数问题上的密码体制,给定椭圆曲线上的一个点 P,一个整数 k,求解 Q = kP 很容易,但给定一个点 P、一个点Q,求解 k 很难。ECDH 便建立在该数学难题上。
假设密钥协商的双方 Alice 和 Bob 共享公共参数 p、g 以及 ECDH 算法,以下场景可模拟交换流程(mod 表示取余运算):
- Alice 生成私钥 a,通过公式
g^a mod p = A
生成公钥 A,并将 p、g、A 发送给 Bob; - Bob 获得 p、g、A 后,生成自己的私钥 b,通过
g^b mod p = B
生成公钥B,通过公式A^B mod p = K
生成会话密钥(对称密钥)K,然后将公钥 B 发送给 Alice; - Alice 获得 Bob 的公钥 B,通过
B^a mod p = K
生成会话密钥 K,至此,Alice 和 Bob 在未传递私钥 a、b 的情况下,完成了会话密钥协商。
ECDH 不传输对称密钥,而是传输 ECC 椭圆曲线算法生成的公钥,然后通过收到的公钥结合自己的私钥,各自计算出共享的对称密钥,椭圆曲线保证了双方计算出的密钥一定是相同的,且第三方在不知道通信双方私钥的情况下,无法通过从信道中截获的信息反推出对称密钥。
代入数据:
- 假定 p = 23,g = 5;
- Alice 生成私钥 a = 6,计算 A = g^a mod p = 5^6 mod 23 = 8;
- Bob 生成私钥 b = 15,计算 B = g^b mod p = 5^15 mod 23 = 19,计算 K = A^B mod p = 8^18 mod 23 = 2;
- Alice 计算 K’ = B^a mod p = 19^6 mod 23 = 2,K’ = K。