内容简介:双棘轮算法用于通信双方基于共享密钥交换加密消息。通常,通信双方将先使用某种密钥协商协议(例如 X3DH1)以协商共享密钥。此后,通信双方即可使用双棘轮算法发送接收加密消息了。通信双方将为每一个双棘轮消息派生出新的密钥,使得旧的密钥不能从新的密钥计算得到。通信双方还将在消息中附上迪菲-赫尔曼公钥值。迪菲-赫尔曼计算的结果将被混入派生出的密钥中,使得新的密钥不能从旧的密钥计算得到。这些特性将在某一方的密钥泄漏后保护此前或此后的加密消息。
什么是双棘轮算法
双棘轮算法用于通信双方基于共享密钥交换加密消息。通常,通信双方将先使用某种密钥协商协议(例如 X3DH1)以协商共享密钥。此后,通信双方即可使用双棘轮算法发送接收加密消息了。
通信双方将为每一个双棘轮消息派生出新的密钥,使得旧的密钥不能从新的密钥计算得到。通信双方还将在消息中附上迪菲-赫尔曼公钥值。迪菲-赫尔曼计算的结果将被混入派生出的密钥中,使得新的密钥不能从旧的密钥计算得到。这些特性将在某一方的密钥泄漏后保护此前或此后的加密消息。
代码实现
var a PseronA a.IdentityPri, a.IdentityPub = GetCurve25519KeypPair() a.SignedPri, a.SignedPub = GetCurve25519KeypPair() a.OneTimePri, a.OneTimePub = GetCurve25519KeypPair() a.EphemeralPri, a.EphemeralPub = GetCurve25519KeypPair() var b PseronB b.IdentityPri, b.IdentityPub = GetCurve25519KeypPair() b.SignedPri, b.SignedPub = GetCurve25519KeypPair() b.OneTimePri, b.OneTimePub = GetCurve25519KeypPair() b.EphemeralPri, b.EphemeralPub = GetCurve25519KeypPair() //DH1 = DH(IPK-A私钥, SPK-B公钥) //DH2 = DH(EPK-A私钥, IPK-B公钥) //DH3= DH(EPK-A私钥, SPK-B公钥) //DH4 = DH(IPK-A私钥, OPK--B公钥) a.DH1 = GetCurve25519Key(a.IdentityPri, b.SignedPub) a.DH2 = GetCurve25519Key(a.EphemeralPri, b.IdentityPub) a.DH3 = GetCurve25519Key(a.EphemeralPri, b.SignedPub) a.DH4 = GetCurve25519Key(a.EphemeralPri, b.OneTimePub) b.DH1 = GetCurve25519Key(b.SignedPri, a.IdentityPub) b.DH2 = GetCurve25519Key(b.IdentityPri, a.EphemeralPub) b.DH3 = GetCurve25519Key(b.SignedPri, a.EphemeralPub) b.DH4 = GetCurve25519Key(b.OneTimePri, a.EphemeralPub) var aKey = bytes.Join([][]byte{a.DH1[:], a.DH2[:], a.DH3[:], a.DH4[:]}, []byte{}) var bKey = bytes.Join([][]byte{b.DH1[:], b.DH2[:], b.DH3[:], b.DH4[:]}, []byte{}) fmt.Println("ADH1", base64.StdEncoding.EncodeToString(a.DH1[:])) fmt.Println("ADH2", base64.StdEncoding.EncodeToString(a.DH2[:])) fmt.Println("ADH3", base64.StdEncoding.EncodeToString(a.DH3[:])) fmt.Println("ADH4", base64.StdEncoding.EncodeToString(a.DH4[:])) fmt.Println("BDH1", base64.StdEncoding.EncodeToString(b.DH1[:])) fmt.Println("BDH2", base64.StdEncoding.EncodeToString(b.DH2[:])) fmt.Println("BDH3", base64.StdEncoding.EncodeToString(b.DH3[:])) fmt.Println("BDH4", base64.StdEncoding.EncodeToString(b.DH4[:])) fmt.Println("aKey", base64.StdEncoding.EncodeToString(aKey)) fmt.Println("aKey", base64.StdEncoding.EncodeToString(kdf(aKey))) fmt.Println("bKey", base64.StdEncoding.EncodeToString(bKey)) fmt.Println("bKey", base64.StdEncoding.EncodeToString(kdf(bKey))) fmt.Println("x3DH结束") fmt.Println("开始计算Signal protocol(双棘轮)") for i := 1; i <= 3; i++ { aSalt := GetCurve25519Key(a.EphemeralPri, b.EphemeralPub) fmt.Println("计算A的salt", base64.StdEncoding.EncodeToString(aSalt[:])) fmt.Println("计算A的KEY", base64.StdEncoding.EncodeToString(Signalkdf(aKey, aSalt, "A"))) bSalt := GetCurve25519Key(b.EphemeralPri, a.EphemeralPub) fmt.Println("计算B的salt", base64.StdEncoding.EncodeToString(bSalt[:])) fmt.Println("计算B的KEY", base64.StdEncoding.EncodeToString(Signalkdf(bKey, bSalt, "B"))) }
输出值
ADH1 /+X9wl2KPWdV+nUlglwqCOwfhXMddZIQz6b22b9TVVM= ADH2 0BCGm+Fn0ue8xyvZAQlT6Nt7XGiI5tVFm8RJT8mxlz0= ADH3 +QtJECdZdn3wipebo/7MTJEzNsqzU4z9VyIAIZ2oPgw= ADH4 B5NQhL/2UwTs2HYjlog06QuwR7GLnNOCUbFCNKJSLhE= BDH1 /+X9wl2KPWdV+nUlglwqCOwfhXMddZIQz6b22b9TVVM= BDH2 0BCGm+Fn0ue8xyvZAQlT6Nt7XGiI5tVFm8RJT8mxlz0= BDH3 +QtJECdZdn3wipebo/7MTJEzNsqzU4z9VyIAIZ2oPgw= BDH4 B5NQhL/2UwTs2HYjlog06QuwR7GLnNOCUbFCNKJSLhE= aKey /+X9wl2KPWdV+nUlglwqCOwfhXMddZIQz6b22b9TVVPQEIab4WfS57zHK9kBCVPo23tcaIjm1UWbxElPybGXPfkLSRAnWXZ98IqXm6P+zEyRMzbKs1OM/VciACGdqD4MB5NQhL/2UwTs2HYjlog06QuwR7GLnNOCUbFCNKJSLhE= aKey jByyQR2sNtJLdC9lD3OIHQe4X/iPzCiZMoiq+TzCGCM= bKey /+X9wl2KPWdV+nUlglwqCOwfhXMddZIQz6b22b9TVVPQEIab4WfS57zHK9kBCVPo23tcaIjm1UWbxElPybGXPfkLSRAnWXZ98IqXm6P+zEyRMzbKs1OM/VciACGdqD4MB5NQhL/2UwTs2HYjlog06QuwR7GLnNOCUbFCNKJSLhE= bKey jByyQR2sNtJLdC9lD3OIHQe4X/iPzCiZMoiq+TzCGCM= x3DH结束 开始计算Signal protocol(双棘轮) 计算A的salt第 1 次 tTh8Pt9qZYXGLo5xX0SCLRHXgytK7KLN4Kp0l8IFVEQ= 计算A的KEY第 1 次 XX/5C4toO4AtidozmQU6zUVImoI3EqTUNWFM6bVu9Nk= 计算B的salt第 1 次 tTh8Pt9qZYXGLo5xX0SCLRHXgytK7KLN4Kp0l8IFVEQ= 计算B的KEY第 1 次 XX/5C4toO4AtidozmQU6zUVImoI3EqTUNWFM6bVu9Nk= 计算A的salt第 2 次 tTh8Pt9qZYXGLo5xX0SCLRHXgytK7KLN4Kp0l8IFVEQ= 计算A的KEY第 2 次 /EjtTIfRbB6z0+GxRW8Y8ifVOITMKbqsUKdHHqs36Sw= 计算B的salt第 2 次 tTh8Pt9qZYXGLo5xX0SCLRHXgytK7KLN4Kp0l8IFVEQ= 计算B的KEY第 2 次 /EjtTIfRbB6z0+GxRW8Y8ifVOITMKbqsUKdHHqs36Sw= 计算A的salt第 3 次 tTh8Pt9qZYXGLo5xX0SCLRHXgytK7KLN4Kp0l8IFVEQ= 计算A的KEY第 3 次 FweRXcj+QyaZC56PVGCd8vSVV0CvBZIrFYbDMIPdlsQ= 计算B的salt第 3 次 tTh8Pt9qZYXGLo5xX0SCLRHXgytK7KLN4Kp0l8IFVEQ= 计算B的KEY第 3 次 FweRXcj+QyaZC56PVGCd8vSVV0CvBZIrFYbDMIPdlsQ=
完整演示代码 点击这里
联系 QQ: 3355168235
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 通俗易懂--决策树算法、随机森林算法讲解(算法+案例)
- 限流算法之漏桶算法、令牌桶算法
- 什么是Paxos算法?Paxos算法是区块链核心算法之一
- 一文读懂对称加密算法、非对称加密算法和Hash算法
- 算法(六):图解贪婪算法
- 算法篇03:排序算法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
移动应用的设计与开发
[美] 弗林 (Brian Fling) / 马晶慧 / 电子工业出版社 / 2010-5 / 59.80元
本书全面介绍了如何在移动设备上设计和开发应用程序。书中从介绍移动产业的生态环境和移动媒体开始,阐述产品策划的方法、产品架构、视觉设计和产品类型的选择,并详细描述了产品实现过程中所用到的一些技术、工具和概念,最后还简单介绍了如何获得利润和降低成本,肯定了iPhone在移动设备发展史上起到的巨大推动作用。本书不仅能让读者了解到移动设计和开发的知识,更重要的是,它揭示了移动开发的代价高昂、标准混乱的根本......一起来看看 《移动应用的设计与开发》 这本书的介绍吧!