剑客
关注科技互联网

数字签名中的幽灵——阈下信道

* 本文原创作者:1phan,本文属FreeBuf原创奖励计划,未经许可禁止转载

前言

本文使用了Simmons论文中的公式,提到的阈下信道方案也并非作者发现,都是很多密码学家们的研究成果。不过这篇文章是作者原创,作者在各个平台都搜索过,似乎还没人发表过类似的科普文章。

介绍

场景模拟

假设Alice和Bob被捕入狱,Bob被关在男牢房,而Alice被关在女牢房。看守Walter同意他们交换消息,但不允许他们加密。Walter明白,这样他们会商讨一个逃跑计划,他打算阅读他们之间的信件。

Walter希望欺骗他们,他希望他们中的一个将一份欺诈的消息当做来自另一个人的真实消息。不过Alice和Bob愿意冒这种欺诈的危险,因为他们必须商讨他们的逃跑计划。为了完成这件事情,他们肯定要欺骗看守,并找出一个秘密通信的方法。他们建立一个阈下信道,即完全在Walter视野内的、他们之间的 一个秘密通信信道。通过交换无害的签名的消息,他们可以互相传送秘密消息,并骗过Walter,即使Walter始终监视着所有的通信。

简单实现

一个简单的阈下信道可以是句子中单词的数目。句子中奇数个单词对应“1”,而偶数个单词对应“0”。因此,当读这种仿佛无关紧要的句子时,已经将信息“1010”传递给了自己的人员。不过这个例子的问题在于它没有密钥,安全性完全依赖于算法的保密性。阈下信道的概念是Gustavus J Simmons于1978年在美国圣地亚国家实验室(Sandia National Labs)提出的,之后又做了大量的研究工作。事实上,阈下信道签名算法与通常的签名算法区别不开,至少对Walter是这样,  Walter不仅读不出阈下信道消息,而且他也无法确定阈下信道已经存在。

存在条件

经典密码体制中不存在阈下信道。分组密码中也不存在阈下信道,因为与明文块相对应的密文块的大小是相同的。如果存在阈下信道,则一个明文块要对应多个不同的密文块,而事实上在大部分分组密码中,明文块与密文块都是一一对应的。不过在大多数基于公钥体制的签名方案中,文本m与数字签名S(m)不是一一对应的,这是由于会话密钥具有可选择性,从而对同一个消息可产生多个数字签名,即对每个m可以有多个S(m)。这就为阈下信道的存在提供了条件,接收方可以根据这些不同的数字签名获取监视者无法得到的阈下信息。有学者研究表明,绝大多数数字签名方案都可包含阈下信道的通信,其最大特点是阈下信息包含于数字签名之中,但对数字签名和验证的过程无任何影响,这正是其隐蔽性所在。即使监视者知道要寻找的内容,也很难发现信道的使用和获取正在传送的阈下消息。

阈下信道的价值

阈下信道提供了一种:仅有了解该协议的分组内才能得到消息,分组外无法得到,甚至无法发现有此信道存在的 通信方案。前些年比较热点的是将此技术应用在证书签发机构对用户的区分、认证上。

Ong-Schnoor-Shamir

关于 Ong-Schnoor-Shamir

需要说明的是,这个签名方案基于二次多项式,在其出现不久就被证明是危险的方案。在此之后,方案的设计者又提出了基于三次多项式的算法,但是也同样被破译了。随后方案设计者们不屈不挠的提出了基于四次多项式的算法……然而……没错,很快又被破译了。。

此处介绍这种签名方案,其一是因为Simmons第一次设计阈下信道时是基于这种签名算法,其二嘛……也对本方案的设计者的不屈不挠表示敬意。

签名方案

签署方首先选择一个大整数N,再选择一个与N互素的随机整数k,计算h:

>>h = -k^(-2) mod N = -(-k^(-1))^2 mod N

其中, h和n是私钥, k是公钥。

对消息M签名时:首先产生一随机数r,r与N互素,然后计算:

>>S1 = 1/2 * (M/r + r) mod N

>>S2 = k/2 * (M/r – r) mod N

此处S1, S2就是数字签名。TIPS: 签名时一般取M为消息原文的散列值。

那么在验证数字签名时,只需要检验(用笔演算一下就可得到):

>>S1^2 + h * S2^2 === M mod N

阈下信道利用方案

阈下信道协议中,与原方案不同的是:接收方与签署方共享签名方案中的k值。并用需要被传递的信息E代替原方案中的随机数r。此处有一点限制是:E与N必须互素才能实现本次阈下信道。

>>S1 = 1/2 * (M/E + E) mod N

>>S1 = k/2 * (M/E – E) mod N

此时, 只要所有量的值都满足方案中所给的限制,则接受方可以恢复出签署方隐藏的消息。同时,这一个签名依然有意义,可以用作身份验证。

>>E = M/(S1 + S2 * K^(-1)) mod N

这就是Simmons在1978年设计的一个阈下信道方案。虽然这个方案在现在看来几乎是完全不安全的,不过这为后人开启了一个思路,也创建了阈下信道这个概念~

ElGamal

关于ElGamal

ElGamal的安全性依赖计算有限域上离散对数的难度。它是一种即可以用于数字签名,又可用于加密的算法。就目前而言,这种算法是安全的。

签名方案

签署方首先选择一个素数p,两个小于p的随机数g和x。通过下述等式计算出y:

>>y = g^x mod p

y, g, p用作公钥,x用做私钥。在对消息M签名时,首先选择一个随机数k,k与 p-1 互素。然后计算:

>>a = g^k mod p

使用扩展欧几里得算法,从下述等式中求出b:

>>M = (x * a + k * b) mod (p-1)

(a,b)就是本次的签名。TIPS: 签名时一般取M为消息原文的散列值。

在验证签名时,只需验证:

>>y^a * a^b mod p = g^M mod p

注意:每次的签名中,k必须选择不同的值。且k的值必须保密。如果k的值泄露出去,那么可以很容易的通过模运算恢复出私钥x;如果两次签名中使用相同的k值,那么可以通过模运算求出k,然后求出私钥x。恢复方式如下:

假设两次的消息分别是M1, M2;共用了一个k值;它们的签名分别是(a, b1)、(a, b2):

>>M1 – M2 = k * (b1 – b2) mod (p – 1)

上式中只有一个未知量k, 可以通过欧几里得算法求出k的值。在知道k值后,因为数字签名的计算方法如下:

>>M = (x * a + k * b) mod (p-1)

此时只剩一个未知量x,可以通过欧几里得算法求出x的值。

阈下信道利用方案

签署方首先选择一个素数p,两个小于p的随机数g和x。第一步与正常签名算法相同:

>>y = g^x mod p

不一样的地方:在选择随机数k时,将k值设为需要传递的消息E。注意:E,M,和p都必须相互完全互素。如下式计算a:

>>a = g^E mod p

最后一步与原方案中的步骤一样,通过扩展欧几里得算法计算b,并将(a, b)当作签名。

>>M = (x * a + E * b) mod (p-1)

接收方需要和签署方共享私钥x才能恢复出隐藏消息E:

>>E = ((M – x * a)*b^(-1)) mod (p-1)

同时,数字签名(a, b)依然有意义,接收方可以正常验证这个签名是否是经过签署方的认证。

在这次阈下信道中,签署方为阈下信道添加了一个私钥x,使得中间人就算猜到了这条签名中可能出现阈下信道,但依然无法恢复出被隐藏的信息E。但是这也带来了一个问题:接收方可以不受限制的冒充签署方对消息进行签名。这里的安全隐患依然存在。同时,这个阈下信道对隐藏信息的要求比较多(必须与M和p互素),在某些特定情况下,这种阈下信道可能无法起到作用。

ESIGN

关于ESIGN

ESIGN是由日本NTT提出的数字签名方案。对于同样长度的密钥、签名,它的安全性被保证至少和RSA, DSA一样。不过ESIGN的速度要比这两个算法快得多。

签名方案

签署方生成一对大素数p, q 作为私钥,生成一个公开的安全参数k,这个值被建议至少大于512。由下式生成公钥N:

>>N = p^2 * q

另取一个作用于消息M上的散列函数H(M),要求是:

>>0 < H(M) < n – 1

除此之外,签署方需要选择一个小于p*q的随机数x。 计算签名时的流程:

>>w = [(H(M) – x^k(mod N)) / p*q]

>>z = w / k*x^(k-1) mod p

>>s = x + z*p*q

s是就是签署方的签名值。

接收方收到消息与签名后,首先计算出t,t是比N的位数的2/3大的整数。在验证时,只需计算:

>>H(M) <= s^k mod N < H(M) + 2^t

若等式成立,则签名有效。

阈下信道利用方案

在ESIGN的阈下信道中,私钥除了p, q 以外,增加一个隐藏消息密钥素数r,密钥r是接收方在接收隐藏消息时需要的密钥。如下式计算出公钥N:

>>N = p * q * r

对消息签名时,签署方生成一个小于p*q的随机数u,并通过隐藏消息E如下式计算出x:

>>x = E + u * r

然后计算:

>>w = [(H(M) – x^k(mod N)) / p*q*r]

>>z = w / k*x^(k-1) mod p

>>s = x + z*p*q*r

接收方如果需要恢复出隐藏消息E,只需计算:

>>s === x + z*p*q*r === E + u * r === E mod N

接收方在得到隐藏消息E的同时,数字签名s依然有意义。

在这次阈下信道中,接收方只知道一个密钥r,他如果想冒充签署方给文件签名,则需要分解p*q,但是分解因数问题依然存在,就是说:如果接收方想冒充签署方,则他需要付出的分解N的计算量 与不存在阈下信道时的接收方需要付出的分解N的计算量相同。相比之下,这种阈下信道对签署方来说更加安全。

但是这次阈下信道中,N的值将是三个大素数的乘积。中间人可能通过N的大小来判断某次签名中是否存在阈下信道。

DSA

关于DSA

DSA是由NIST在1991年提出的数字签名算法。它曾被批评为政治性多于学术性……不过依然成为了数字签名标准DSS所采用的算法。本文不对此做评论。感兴趣的朋友自行谷歌……

之所以在本文中提及这种算法,是因为阈下信道的提出人Simmons特意提过这种算法。在最后提到的黑盒签名器泄露私钥的方法对于其他签名算法的攻击,也是值得借鉴的。在此做个提醒,使用密码学库最好使用开源库,尽量不要使用封装好的商业软件。。

签名方案

p是L位长的素数,L的取值范围为512~1024,且L必须是64的倍数。【L的值曾被固定为512,不过被很多密码学者指责,后来NIST做了更正。】q是160位长,且与p-1互素的因子。另取小于p-1的随机数h,通过下式计算g,若g是小于1的数,则重新生成h,直到g>1:

>>g = h^(p-1)/q mod p

取任意数x小于q

>>y = g^x mod p

DSA算法使用了一个散列函数H(m),DSS标准指定该算法应为SHA。在近些年,对SHA-0、SHA-1的碰撞攻击的研究成果越来越多,在使用时应考虑使用更安全的散列生成算法。

在签名中,前面三个参数p, q, g是公开的,可以被网络上的所有用户共用。私人密钥是X,公开密钥是y。在对消息m签名时,签署方首先生成一个小于q的随机数k:

>>r = (g^k mod p) mod q

>>s = (k^(-1)*(H(m) + x*r)) mod q

r和s就是签署方的签名。接收方验证签名时,进行如下验证:

>>w = s^(-1) mod q

>>u1 = (H(m) * w) mod q

>>u2 = (r * w) mod q

>>v = ((g^u1 * y^u2) mod p) mod q

如果 v=r 则签名有效。

阈下信道的利用方案

在利用过程中,接收方和签署方可以通过共享私钥x来传递隐藏信息r。(r是签名方案中的随机数)

除此之外,还有一种不需要泄露私钥的隐藏信息传递方法。首先提及每次传递一个比特位的方案:

签署方和接收方协商一个随机素数Z,如果签署方想发送给接收方1,则签署方生成一个随机数r,使签名参数r是随机素数Z的二次剩余。若想发送0,则生成一个随机数k,使签名参数r不是随机素数Z的二次剩余。因为二次剩余与非二次剩余的数字在数目上相差不大,所以随机数生成比较容易。

这一方案可以很容易的扩展到一次传输多个比特位:

签署方和接收方按顺序协商多个素数,生成随机数k,使得通过k计算出的r对这组有序素数的二次剩余情况分别对应隐藏消息的比特位。若设这个有序素数组中包含的元素为T个,则随机数k恰好符合要求的概率为 1/2^T 对于现在的计算机来说,只要T值不太大,生成k的速度差别几乎毫无影响。在具体平台上的结果不尽相同,感兴趣的朋友不妨自行测试一下。

黑盒签名器泄露私钥

对于恶意攻击者EVE来说,他只需要设计一个极难被逆向分析的闭源加密平台(比如对该软件使用“VM Protect”加壳),该加密平台接收用户的私钥,公钥和一段消息,返回消息与对消息的签名。那么EVE可以通过如下方案,每次在用户的签名数据中隐藏用户私钥的10位,且这个信息只有他能读取。同时这样签名出来的结果与正常签名的结果毫无不同。

EVE规定14个素数,在用户签名时,随机选取用户私钥的10比特位作为隐藏消息,同时使用另外四位添加在十位私钥后作为对私钥块位置的标识。(私钥只有160位,所以只需要标记0~16就可以)

EVE通过在因特网上查询用户的签名信息,就可以很容易的恢复出用户的私钥。

比较麻烦的是:除非对该软件/芯片进行逆向分析,否则用户几乎不可能发现自己的私钥被泄露了。同时,就算用户怀疑自己的私钥被泄露了,他也无法证明这一点。

对DSA中阈下信道的防范

引入可信的第三方T,T生成一个随机数k1,签署器生成一个随机数k2,并计算k:

>>k = k2^k1 mod(p-1)

签署器返回一个值u

u = g^k2 mod p

T只需验证:

>>((u^k1 mod p) mod q) = r

若等式成立,则加密器使用了第三方给定的随机数k1。

不过这一协议使得第三方T也有可能通过生成特殊的k1值,来在消息中隐藏一些信息。这种信道被称作布谷鸟信道。

对这种信道的使用和防范感兴趣的朋友可以查阅论文:

“Protocols that Ensure Fairness”

“Subliminal Channels: Past and Present”

总结

对于阈下信道的研究一直进行着,有一些学者的结论表明,数字签名中的阈下信道是不可能完全封闭的。但是也有一些学者正在尝试着构造出绝对封闭的数字签名。对于普通的用户来说,只要做到签名时能由自己控制所有随机量,签署文件时使用开放源码的签名器,或者干脆自己开发一个库,那么对于用户的签名来说,阈下信道存在对于签署方的隐患几乎可以忽略了。不过当用户作为接收方时……那么似乎只能要求签署方选择对阈下信道限制比较严格的签名协议。不过,说到底,数字签名肯定是要由签署方完全自主生成的。在积极的一面来看,阈下信道有利于签署方对用户进行分类,对每个分组的用户进行定制的服务。从这个方面来看的话,阈下信道带来的结果也不完全是负面的。

微博:1phan

QQ:1540482475

* 本文原创作者:1phan,本文属FreeBuf原创奖励计划,未经许可禁止转载

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址