当 B 接收到decryptedMessageActionCommitKey由新密钥加密的 a 或消息时,由加密消息前面的key_fingerprint值识别(可能会decryptedMessageActionCommitKey丢失,稍后将重新请求),它假设 A 已经开始使用用于加密的新密钥,并执行相同的操作。纸飞机
但是,可以保留先前的密钥,直到在接收到的消息中没有间隙,直到切换到新密钥为止。一旦所有的空隙都被填满,旧钥匙必须被安全地丢弃。
此规则有一个例外 - 原始密钥的 SHA-1(在建立相关秘密聊天期间生成)始终被存储,以便在客户端上显示密钥可视化。
中止协议
任何一方都可以中止任何未完成的重新键入协议的实例,除非相关方已经发送decryptedMessageActionCommitKey或decryptedMessageActionAcceptKey已经发送。为了中止重新键入,发送telegrami.html' target='_blank' title='TG安卓版下载' >TG安卓版下载
decryptedMessageActionAbortKey exchange_id:long = DecryptedMessageAction;
例如,如果该方已经参与了密钥更新协议的不同实例,或者如果接收到的g_a、g_b和其他参数的值未通过安全检查,则可以这样做。在后一种情况下,建议完全中止秘密聊天。
丢弃以前的键
一旦 B 收到decryptedMessageActionCommitKey,它可以安全地丢弃之前的密钥,前提是没有间隙。但是,A 只能在收到用新密钥加密的消息后丢弃以前的密钥。如果没有安排发送普通消息,则B 应为此发送特殊的no-op 消息:
decryptedMessageActionNoop = DecryptedMessageAction;
并发重新键控
可能会发生双方在decryptedMessageActionRequestKey不知道对方已经这样做的情况下通过发送同时启动重新加密。如果每一方都因为已经参与了自己发起的协议的另一个实例而中止重新键入,则重新键入将永远不会发生。
由于这种可能性,我们建议仅中止具有较小exchange_id的实例,并可以选择将其(a,g_a)重新用于具有较大exchange_id的重新加密协议实例(与 a 相比,即已long签名little-endian 64 位整数)。
换句话说,如果decryptedMessageActionRequestKey在 A 发送了它之后收到了 a decryptedMessageActionRequestKey,但还没有收到decryptedMessageActionAcceptKey,则需要执行以下操作:TG安卓app下载
如果发送中的exchange_iddecryptedMessageActionRequestKey大于decryptionActionRequestKey刚刚接收的,则中止新建议的密钥更新协议实例,而不发送显式的decryptedMessageActionAbortKey(另一方将根据下一条规则执行相同操作)。
如果我们的exchange_iddecryptedMessageActionRequestKey较小,则以a响应新收到decryptedMessageActionRequestKey的decryptedMessageActionAcceptKey,并且只参与对方发起的re-keying协议实例。在这个阶段可以重新使用为原始生成的g_a(现在称为g_b)的值,现在被放弃,或者可以生成decryptedMessageActionRequestKey全新的(b,g_b) 。
在不太可能的 (2^{-64}) 情况下,两个exchange_id都相等,中止两个实例而不发送显式decryptedMessageActionAbortKey. 另一方也会这样做。
关键可视化
由于所有密钥更新实例都是通过创建秘密聊天时建立的安全通道进行的,因此用户有必要确认在初始交换期间没有发生 MITM 攻击。客户端上的密钥可视化使用首次建立秘密聊天时创建的原始密钥的前 128 位 SHA-1,然后是秘密聊天时使用的密钥的前 160 位 SHA-256已更新到第 46 层(如果聊天是使用第 46 层创建的,则与原始密钥一致)。
请注意,key_fingerprint参数是作为维护工具引入的(名称具有误导性),与客户端上的密钥可视化无关。