消息 B 是在 XX Noise 握手模式中的第 二 条消息。是由响应者发给发起者的。 在此详细分析中,我们试图给您一些关于此消息背后协议逻辑的见解。这里给出的见解并不能完全扩展到完全说明形式化模型所进行的确切的状态转换,但至少进行了非正式的描述,以帮助说明消息 B 如何影响协议。
在应用Π计算的过程中,发起者过程使用以下函数准备消息:B。
letfun writeMessage_b(me:principal, them:principal, hs:handshakestate, payload:bitstring, sid:sessionid) = let (ss:symmetricstate, s:keypair, e:keypair, rs:key, re:key, psk:key, initiator:bool) = handshakestateunpack(hs) in let (ne:bitstring, ns:bitstring, ciphertext:bitstring) = (empty, empty, empty) in let e = generate_keypair(key_e(me, them, sid)) in let ne = key2bit(getpublickey(e)) in let ss = mixHash(ss, ne) in (* No PSK, so skipping mixKey *) let ss = mixKey(ss, dh(e, re)) in let s = generate_keypair(key_s(me)) in let (ss:symmetricstate, ns:bitstring) = encryptAndHash(ss, key2bit(getpublickey(s))) in let ss = mixKey(ss, dh(s, re)) in let (ss:symmetricstate, ciphertext:bitstring) = encryptAndHash(ss, payload) in let hs = handshakestatepack(ss, s, e, rs, re, psk, initiator) in let message_buffer = concat3(ne, ns, ciphertext) in (hs, message_buffer).
消息B的载荷被建模为函数msg_a(发起者身份, 响应者身份, 会话ID)的输出,被加密为ciphertext2。这将调用以下操作:
在应用Π计算的过程中,发起者过程使用以下函数准备消息:B。
letfun readMessage_b(me:principal, them:principal, hs:handshakestate, message:bitstring, sid:sessionid) = let (ss:symmetricstate, s:keypair, e:keypair, rs:key, re:key, psk:key, initiator:bool) = handshakestateunpack(hs) in let (ne:bitstring, ns:bitstring, ciphertext:bitstring) = deconcat3(message) in let valid1 = true in let re = bit2key(ne) in let ss = mixHash(ss, key2bit(re)) in (* No PSK, so skipping mixKey *) let ss = mixKey(ss, dh(e, re)) in let (ss:symmetricstate, ne:bitstring, valid1:bool) = decryptAndHash(ss, ns) in let rs = bit2key(ne) in let ss = mixKey(ss, dh(e, rs)) in let (ss:symmetricstate, plaintext:bitstring, valid2:bool) = decryptAndHash(ss, ciphertext) in if ((valid1 && valid2) && (rs = getpublickey(generate_keypair(key_s(them))))) then ( let hs = handshakestatepack(ss, s, e, rs, re, psk, initiator) in (hs, plaintext, true) ).
消息B的载荷被建模为函数msg_a(发起者身份, 响应者身份, 会话ID)的输出,被加密为ciphertext2。这将调用以下操作:
RESULT event(RecvMsg(alice,bob,stagepack_b(sid_a),m)) ==> event(SendMsg(bob,c_1330,stagepack_b(sid_b),m)) || event(LeakS(phase0,bob)) || event(LeakS(phase0,alice)) is true.
在这个查询中,我们测试发送者身份认证和消息完整性。如果Alice收到Bob的有效消息,那么Bob一定是将该消息发送给了某人,或者Bob在会话开始之前,他们的静态密钥就已经泄露了,或者Alice在会话开始之前,他们的静态密钥就已经泄露了
RESULT event(RecvMsg(alice,bob,stagepack_b(sid_a),m)) ==> event(SendMsg(bob,c_1330,stagepack_b(sid_b),m)) || event(LeakS(phase0,bob)) is true.
在这个查询中,我们测试发送者身份认证与其是否抵抗假冒密钥。如果Alice收到Bob的有效消息,那么Bob一定是将该消息发送给了某人,或者Bob在会话开始之前,他们的静态密钥已经被泄露了。
RESULT event(RecvMsg(alice,bob,stagepack_b(sid_a),m)) ==> event(SendMsg(bob,alice,stagepack_b(sid_b),m)) || event(LeakS(phase0,bob)) || event(LeakS(phase0,alice)) cannot be proved.
在这个查询中,我们测试发送者和接收者的身份验证以及消息的完整性。如果Alice收到Bob发来的有效消息,那么Bob一定是向Alice,或者Bob在会话开始之前,他们的静态密钥就已经被泄露了,或者Alice在会话开始之前,他们的静态密钥就已经被泄露了。
RESULT event(RecvMsg(alice,bob,stagepack_b(sid_a),m)) ==> event(SendMsg(bob,alice,stagepack_b(sid_b),m)) || event(LeakS(phase0,bob)) cannot be proved.
在这个查询中,我们测试发送者和接收者的身份验证以及是否抵抗假冒密钥。如果Alice收到Bob的有效消息,那么Bob一定是将该消息发送给Alice专门发送了该消息,或者Bob在会话开始之前,他们的静态密钥已经被泄露了
RESULT attacker_p1(msg_b(bob,alice,sid_b)) ==> event(LeakS(px,alice)) is true.
在这个查询中,我们通过检查被动攻击者是否只能通过在协议会话之前或之后破坏Alice的静态密钥,来测试消息保密性。
RESULT attacker_p1(msg_b(bob,alice,sid_b)) ==> event(LeakS(px,alice)) cannot be proved.
在这个查询中,我们测试消息保密性,检查主动攻击者是否只能通过在协议会话之前或之后破坏Alice的静态密钥来检索有效载荷的明文。
RESULT attacker_p1(msg_b(bob,alice,sid_b)) ==> event(LeakS(phase0,alice)) || (event(LeakS(px,alice)) && event(LeakS(pz,bob))) is true.
在这个查询中,我们通过检查被动攻击者是否只能通过破坏Alice的lice来检索有效载荷明文来测试前向保密性。在协议会话之前后的任何时候与Bob的静态密钥一起进行检索。
RESULT attacker_p1(msg_b(bob,alice,sid_b)) ==> event(LeakS(phase0,alice)) || (event(LeakS(px,alice)) && event(LeakS(pz,bob))) cannot be proved.
在这个查询中,我们通过检查主动攻击者是否只能通过破坏Alice的lice来检索有效载荷明文来测试弱前向保密性。在协议会话之前后的任何时候与Bob的静态密钥一起,都能检索到明文。
RESULT attacker_p1(msg_b(bob,alice,sid_b)) ==> event(LeakS(phase0,alice)) cannot be proved.
在这个查询中,我们通过检查主动攻击者是否能够在协议会话之前只有通过破坏Alice的静态密钥来检索有效载荷明文来测试强前向保密性。