本文介绍密码学中常用的一些符号和数学知识。
标准符号
#S,集合S中的元素数目
Fq,q个元素的有限域
desc(A),代数结构A的描述
x←D,根据分布D进行赋值
x←US,按S为均匀分布进行赋值
ord(x),群元素的阶
<g>,由g生成的循环群
概率论和信息论
概率论和信息论是现代密码技术发展必不可少的工具。
现代密码系统,特别是公钥密码系统,对概率行为的要求已经达到相当苛刻的程度:语义安全性。
概率论的基本概念
令S为一个任意确定的点的集合,称之为概率空间(或样本空间)。任意元素x∈S称为样点(也称为结果、简单事件或不可分事件;为了简单我们将只用点)。一个事件(也称为合成事件或可分事件)是S的一个子集,通常用一个大写字母表示(比如E)。一次实验或观察是一种从S中产生(取出)一个点的动作。一个事件E的发生就是一个试验产生某个点x∈S,并满足:x∈E。
概率的经典定义
假设一个实验可以从n=#S个等可能的点中产生一个点,并且每次实验必须产生一个点。令m表示事件E包含的点的数目,那么nm为事件E发生的概率,并记为Prob[E]=nm
概率的统计定义
假设在相同条件下进行了n次实验,其中事件E发生了μ次,如果对所有足够大的n,nμ保持不变,那么就是说事件E的概率为nμ,记为,Prob[E]≈nμ
随机变量及其概率分布
在密码学中,我们主要考虑定义在离散空间上的函数。设离散空间S包含有限个或者可数个孤立的点x1,...,
离散随机变量及其分布函数
一个离散随机变量是一个实验的数字化结果。它是定义在样本空间上的函数
设S为一个概率空间,ξ为一个随机变量。ξ的分布函数是S→R的一个函数,以一个概率值Prob[ξ=xi]=pi
均匀分布
密码学中最常用的随机变量服从均匀分布:Prob[ξ=xi]=#S1
设S表示最长为k比特的非负数集合,依据均匀分布,从S中随机取出一个数,所取的数为k比特的概率是21
二项式分布
假定一个实验只有两个结果,记为“成功”和“失败”(例如,抛一枚硬币只有两个结果,“正面”和“反面")。独立地重复进行该实验,如果每一次实验结果仅有两种可能的点,且它们的概率在整个实验过程中保持不变,那么这样的实验就称为贝努利试验(bernoulli trials)。
假设在任何一次试验中:Prob[Y]=p,Prob[N]=1−p
那么Prob[n test,k N]=Cnkpk(1−p)n−k
如果随机变量ξn取值为0,1,n,且对每一个p,0<p<1,有Prob[ξn=k]=Cnkpk(1−p)n−k
那么我们说ξn服从贝努利分布
生日悖论
对任意函数f:X→Y,其中Y为包含n个元素的集合,我们来解决下面的问题:
对于一个概率界限ϵ,0<ϵ<1,找一个整数k,使得对于k个两两互异的值x1,x2,...,xk∈UX,k个函数值f(x1),f(x2),...,f(xk)对某些i=j有 Prob[f(xi)=f(xj)]≥ϵ
即在k个函数值中,以不小于ϵ的概率发生碰撞
上述问题可以表示成:从装有n个不同颜色小球的袋子中去一个球,记下该球的颜色,然后放回。找到一个整数k,至少出现一次颜色匹配的概率为ϵ。令yi表示第i次取出的小球的颜色,第二次取出小球颜色不同的概率为1−1/n,以此类推,第k个球还未发生碰撞的概率为(1−n1)(1−n2)...(1−nk−1)
当n足够大且x相对较小时1+nx=enx
因此(1−n1)(1−n2)...(1−nk−1)=e−2nk(k−1)
这是不碰撞的概率,因此碰撞的概率为1−e−2nk(k−1)=ϵ
我们有k≈2nlog1−ϵ1
考虑ϵ=1/2,则k=1.1774n,它表示对于一个输出空间大小为n的随机函数,我们只需计算大约n个函数值,就能以一个不可忽略的概率发现一个碰撞。
如果说,我们将一组数据作为某个密码函数的原像隐藏,如果该数据的平方根不够大,那么就可以通过随即计算函数值来找出这组数据。这种攻击被称为生日攻击。它来源于:n=365,k≈22.49,为了以大于50%的概率从房间中找到有两个人的生日相同,在该房间中只需有23人即可。
生日悖论的应用:指数计算的Pollard袋鼠算法
p为素数,f(x)=gx(mod p)是一个随机函数,对于x=1,2,..,p−1,函数值f(x)在整数区间[1,p−1]范围内任意变化,这个函数具有单向性。求逆十分困难。
在某些情况下,我们知道a和b,可以计算f(a),f(a+1),...在穷尽b-a步之前找到x。如果b-a太大,那么这种穷搜索方法不现实。但如果b−a是一个容易处理的值,那么生日悖论在b−a步求f(x)中起到作用。
Pollard发现了这种方法,他称之为λ算法或袋鼠算法。
Pollard用两个袋鼠描述他的算法,一只是驯养的袋鼠T,另一只是野生的袋鼠W,已知f(x)=gx(mod p)求解x的问题可以模型化为T追捕W。这一点是通过让袋鼠沿着跳跃的方式完成的。
S={s(0),s(1),...,s(J−1)}={20,21,...,2J−1}
袋鼠每一次跳跃的距离为S中随机的一个数,每只袋鼠都随身携带一个里程表来计算它跳过的总距离。
T从已知点t0=gb(mod p)开始跳,T是驯服的袋鼠,它的路线为t(i+1)=t(i)gs(t(i)mod J)(mod p)
在跳了n此后,T携带的里程表记录着它目前跳过的距离d(n)=Σi=0ns(t(i)mod J)
我们将上面的表达式重新表达为t(n)=gb+d(n−1)mod p
W是野生的,它从一个未知的点w0=gxmod p,它的路线为w(i+1)=w(i)gs(w(i)mod J)(mod p)
W携带的里程表记录着它目前跳过的距离D(j)=Σk=0js(wkmod J)
我们将上面的表达式重新表达为w(i)=gx+D(i−1)mod p
显然,它们的足迹t(i)和w(j)是两个随机函数,根据生日悖论,在T和W分别大约跳n≈b−a步内,发生碰撞,也就是跳在了同一个点。如果超过n≈b−a,那么碰撞发生的概率趋向于1.
信息论
香农关于消息源的熵(entropy)的定义用来衡量这个源所含信息量的多少。这个量度以源输出的所有可能的消息集上的概率分布函数形式给出。
设L=a1,a2,...,an为由n个不同符号组成的语言,假设信源S以独立的概率Prob[a1],Prob[a2],...,Prob[an]分别输出这些符号,并且满足Σi=1nProb[ai]=1
S的熵为H(S)=Σi=1nProb[ai]log2(Prob[ai]1),我们称之为“每个信源输出的比特数”
如果S以概率1输出某个符号,例如a1,则熵函数H(S)有最小值0,这是因为H(S)=Prob[a1]log2(Prob[a1]1)=log21=0,这种情况说明,当我们确信信源S确定地仅输出a1,我们没必要浪费比特来记录它。