近来在Crypto 2023上看到一篇有趣的文章[1],其旨在一个存在拥有所有密钥并知道所有消息的“独裁者”的信道中,通过安排与常规密文无法区分的隐蔽的“变形”消息来进行机密通信的方法——变形署名,但由于本人技术水平有限无法完整实现整个系统。而当阅读到其中的一个技术分支——Chaffing and Winnowing时惊喜地发现其实现方法之巧妙,又恰好在图灵班的密码学课程中学到了相关的Diffie-Hellman密钥交换协议和消息验证码MAC等知识,于是选取这篇上世纪的论文[2]来进行评论和仿真实验。
(是的你没看错,这是我在学校写的某低水平评论论文,觉得方法比较新颖巧妙,于是分享出来)
择要: 本文先容了 Rivest 提出的 Chaffing and Winnowing 技术,该技术通过在消息中混入无关信息 (chaff) 并添加认证码 (MAC) 来实现机密性,即使在拥有所有加密密钥的“独裁者”信道中进行通信也能保证消息安全。文章具体阐述了该技术的原理、应用场景、潜在威胁以及将来研究方向,并通过实验仿真实现了整个技术流程。
一、简介
Rivest为我们先容了一种新技术Chaffing and Winnowing——原意是指从谷粒中分离谷壳的过程,它不进行传统意义上的加密,而是将消息(wheat)分块并作认证,混入无关信息(chaff)之后再进行通信。
该项技术可以说是变形署名[1]的奠基之作,二者同样考虑一个问题:若独裁者拥有一个“后门”可以或许恢复密钥来对消息进行解密,那么怎样在这样的信道上为消息提供机密性。Rivest说“像往常一样,关于规范技术的政策辩论最终会被技术创新所淘汰。试图通过规范加密来规范保密性,关闭了一扇门,却留下了另外两扇门(隐写术和Chaffing and Winnowing).”后者与前者不同,隐写术[3]注重于在较大的、看似普通的信息(如图片)中隐蔽机密,使得在算法不公开的前提下,一个PPT对手无法有用区分机密内容和普通内容。显然这样的机密性是由算法保密性提供,并不符合卡尔霍夫原则[4],即“一个密码系统的安全性不应依赖于算法的秘密性,而应依赖于密钥的秘密性”。
而在Chaffing and Winnowing中,消息机密性的保证被归因到MAC算法的认证性上,即在适应性选择明文攻击下具有存在不可伪造性[5]。对手无法怀疑两种数据包的存在,不具有机密认证则亦无法区分它们,即使原消息不受任何加密。
二、技术概要
原文中,作者循规蹈矩地先容了这种技术的原理。
总体而言,发送方与接收方共享一个密钥,发送消息有两个部门:认证(添加消息认证码MAC)和添加chaff;接收方会通过验证MAC去除chaff(这个过程称为“winnowing”)以获得原始消息。整个过程中,没有对任何东西进行加密,因此大概不受出口管制(MAC不是加密)。
这是一个十分原始的想法,而后作者在考虑了实际运用的问题并做出诸多改进措施。
- 消息包的拆分与组装中,界说一个消息包为包含序列号、消息和MAC的三元组,以便接收方除重、组装和辨认丢失。并在这里提出一种优化:发送方按序次发送包,接收方一旦验证乐成该序列号,则丢弃后续所有相同序列号的包。
- 一个良好的混淆过程会为消息使用的每一个序列号至少添加一个chaff。
- 对手大概通过每个包裹的内容来区分chaff和wheat,无限拆分wheat只会让传输更加低效。
为了解决以上问题,作者引用了自己的一项技术——全或无加密和包变换[11]。简朴来说,通过这种变换之后,只有接收者收到全部消息才可逆转变换得到原文,否则只能得到垃圾消息。(让我们把算法具体实现放在仿真实验的部门。)使用此变换后,再对消息进行分包署名和发送,可以或许减少对手直接通过辨识消息来查找wheat组合的机会。
三、研究分类、现状、难点分析与将来方向
我们现在已经了解到Chaffing and Winnowing技术的原理,可以发现数据包被分为了两种——为己用和混淆视听。前者的用法好像已经固定,后者则隐蔽着更大的利用潜能与危机。
1. 可否认加密[6]
假如对于每个wheat消息包,都生成一个使用特定密钥MAC认证的chaff,该chaff实际包含无害的消息,当使用该特定密钥进行认证时只能得到无害的消息,而真正在通讯两边交流的内容则被视为垃圾。如此使得在没有正确的解密密钥的情况下无法证实明文消息的来源或存在,即可否认加密。缺点在于,假如暴力机关要求通讯者提供所有密钥,则始终无法证实其是否已经提供全部密钥。
2. 防止流量分析
我尚未查找到已有的研究,只有维基百科中提及该技术的变体可以或许在分组网络中防止消息泄露和流量分析[7]。
3. 潜在的诬陷攻击
试想通讯两边之间存在一个发起中间人攻击的主动对手,可以或许用自己的密钥生成MAC并嵌入有害信息,这对于通讯两边担当消息没有影响。此时对手拥有通讯的全文和自己的密钥,则他可以对通信两边进行诬陷:指定其通讯内容为有害信息而他们无法辩解。一方面,由于可否认加密的存在,他们可被认定为提供虚假无害的消息密钥;另一方面,通讯两边根本没有机密性需求,也没有使用Chaffing and Winnowing技术,他们本身就没有密钥,对手嵌入的信息在通讯两边的可忽视区内。
4. 怎样协商一个私钥
原文中仅用一个段落草草带过两边协商密钥的过程——“例如”使用Diffie-Hellman密钥交换协议[8],即通讯两边交换对方的公钥与自己的私钥计算得到共有的密钥。然而原始的协议仅在窃听对手存在的情况下是安全的,通讯两边并不知道对方的身份,假如要抵御主动攻击对手,则需要涉及数字证书和指定验证者署名[9]等技术。这不在作者Rivest讨论的范围内,因为他的安全目标规定独裁者只知道加密密钥,而不限定认证。
5. 消息体积剧增与对抗暴力枚举
通讯两边仍需发送充足量的chaff包以疑惑对手,使之在计算上找到包的组合不可行。这也无疑增大了包的体积,加之需要充足长度的MAC对抗碰撞。
目前该技术亟需解决的问题个人认为就是以上的3、4、5点;由此技术衍生的变形加密和变形署名相关研究已连续两年在CRYPTO发表[1][10]。
四、实验仿真
以下使用C# .NET 9 on Windows平台进行实验,模拟通讯两边使用Chaffing and Winnowing技术的全部过程。
1. 通讯两边协商密钥
生成ECDiffieHellmanCng实体并生成密钥对,输出公钥,要求输入私钥后计算共同密钥:- Console.WriteLine("Step 1: Key Exchange");
- Console.WriteLine("Generating key...");
- using var client = new ECDiffieHellmanCng()
- {
- KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash,
- HashAlgorithm = CngAlgorithm.Sha256
- };
- var publicKey = client.PublicKey.ToByteArray();
- Console.WriteLine($"Public Key: {Convert.ToBase64String(publicKey)}");
- Console.WriteLine("Enter the public key of the other party:");
- string otherKey = Console.ReadLine();
- byte[] otherPublicKey = Convert.FromBase64String(otherKey);
- var privateKey = client.DeriveKeyMaterial(CngKey.Import(otherPublicKey, CngKeyBlobFormat.EccPublicBlob));
复制代码
2. 实现一个AONT变换
这里接纳原作者的简朴变换:将数据按BLOCK_SIZE分块,生成与块等大的随机生成的密钥块key,将每个数据块与key逐比特异或得到效果,再将key与效果做异或储存在效果的最后一块之后:
[code]public static readonly int BLOCK_SIZE = 16; public static byte[] Transform(byte[] data){ int blocks= (data.Length+BLOCK_SIZE-1)/BLOCK_SIZE; byte[] result = new byte[(blocks+1)*BLOCK_SIZE];//reserve one block for the hash byte[] key= new byte[BLOCK_SIZE]; RandomNumberGenerator.Fill(key); Console.WriteLine($"Key: {string.Join(',',key)}"); for(int i=0;i |