770 likes | 1.01k Views
网络与信息安全 密码学基础(二). 潘爱民,北京大学计算机研究所 panaimin@icst.pku.edu.cn http://www.icst.pku.edu.cn/InfoSecCourse. 内容. 公钥算法 背包思想 RSA Elliptic curve Diffie-Hellman 密钥交换 消息算法 散列算法 数字签名 加密库 Crypto++. 公钥密码学的历史. 76年 Diffie 和 Hellman 发表了“密码学的新方向”,奠定了公钥密码学的基础 公钥技术是二十世纪最伟大的思想之一 改变了密钥分发的方式
E N D
网络与信息安全密码学基础(二) 潘爱民,北京大学计算机研究所 panaimin@icst.pku.edu.cn http://www.icst.pku.edu.cn/InfoSecCourse
内容 • 公钥算法 • 背包思想 • RSA • Elliptic curve • Diffie-Hellman密钥交换 • 消息算法 • 散列算法 • 数字签名 • 加密库Crypto++
公钥密码学的历史 • 76年Diffie和Hellman发表了“密码学的新方向”,奠定了公钥密码学的基础 • 公钥技术是二十世纪最伟大的思想之一 • 改变了密钥分发的方式 • 可以广泛用于数字签名和身份认证服务 • 78年,RSA算法 • PKI
基本思想和要求 • 涉及到各方:发送方、接收方、攻击者 • 涉及到数据:公钥、私钥、明文、密文 • 公钥算法的条件: • 产生一对密钥是计算可行的 • 已知公钥和明文,产生密文是计算可行的 • 接收方利用私钥来解密密文是计算可行的 • 对于攻击者,利用公钥来推断私钥是计算不可行的 • 已知公钥和密文,恢复明文是计算不可行的 • (可选)加密和解密的顺序可交换
如何设计一个公钥算法 • 公钥和私钥必须相关,而且从公钥到私钥不可推断 • 必须要找到一个难题,从一个方向走是容易的,从另一个方向走是困难的 • 如何把这个难题跟加解密结合起来 • 计算可行和不可行的界
公钥密码学的研究情况 • 与计算复杂性理论密切相关 • 计算复杂性理论可以提供指导 • 但是需求不尽相同 • 计算复杂性通常针对一个孤立的问题进行研究 • 而公钥密码学往往需要考虑一些相关的问题比如,密码分析还需要考虑已知明文、选择明文等相关的情形 • 讨论的情形不同 • 计算复杂性考虑最坏的情形 • 而对于公钥密码学则是不够的 • 一个困难问题必然会导致一个保密性很好的密码系统吗? • 不一定,还需要有好的构造
背包(knapsack)问题 • 0-1背包问题: • 给定一个正整数S和一个背包向量A=(a1,…,an),其中ai是正整数,求满足方程S = ∑aixi 的二进制向量X=(x1,…,xn)。 • 这是一个NP完全问题,解决这个问题所需要的时间与n呈指数增长 • 背包问题用于公钥密码学 • 做法方法:明文为X,S为密文 • 奥妙在于有两类背包,一类可以在线性时间内求解,另一类则不能 • 把易解的背包问题修改成难解的背包问题 • 公开密钥使用难解的背包问题 • 私钥使用易解的背包问题
易解的背包问题——超递增背包 • 满足下列条件的背包 ai > ∑aj (j = 1,…,i-1) • 这样的背包也被称为简单背包 • 求解 • 从最大的ai开始,如果S大于这个数,则减去ai, 记xi为1,否则记xi为0 • 如此下去,直到最小的ai • 例如背包序列{2, 3, 6, 13, 27, 52} • 求解70的背包 • 结果为{2, 3, 13, 52} • 所以,密文70对应的明文为110101
转换背包 • 简单背包用作私钥 • 如何产生相应的公钥——转换 • 做法: 选择一个整数 m > ∑ai (i = 1,…,n) 然后选择一个与m互素的整数w,然后ai’ = wai (mod m) (i = 1,…,n) 这里的ai’是伪随机分布的 这样得到的背包是非超递增背包
基于背包问题的公钥密码系统 ——MH公钥算法 • 加密 • 将明文分为长度为n的块X=(x1,…,xn) • 然后用公钥A’ = (a1’, …, an’),将明文变为密文S S = E(X) = ∑ai’xi • 解密 • 先计算S’ = w-1S mod m • 再求解简单背包问题 S’ = ∑aixi
背包密码系统的意义 • 是第一个公钥密码系统 • 有较好的理论价值 • 在实践过程中,大多数的背包方案都已被破解,或者证明存在缺陷
RSA算法 • 1977年由Ron Rivest、Adi Shamir和Len Adleman发明,1978年公布 • 是一种块加密算法。 • 明文和密文在0~n-1之间,n是一个正整数 • 应用最广泛的公钥密码算法 • 只在美国申请专利,且已于2000年9月到期
RSA算法描述 • 分组大小为k, 2k < n 2k+1 • 加密: C = Me mod n • 解密: M = Cd mod n = Med mod n • 公钥: KU={e,n}, 私钥: KR={d,n} • 上述算法需要满足以下条件: • 能够找到e,d,n,使得Med mod n = M, 对所有M<n • 计算Me和Cd相对容易 • 从e和n得到d是在计算上不可行的
RSA密钥生成原理 • 令n=pq, pq都是素数,(n)=(p-1)(q-1)是n的Euler数 • Euler定理推论: 若n=pq, pq都是素数, k是任意整数,则 mk(p-1)(q-1)+1 m mod n, 对任意0mn • 只要选择e,d, 满足ed=k(n)+1,即ed 1 mod (n) d e-1 mod (n) • 公钥: KU={e,n}, 私钥: KR={d,n}
数论基础 • Fermat定理: p素数,a是整数且不能被p整除,则: ap-1 1 mod p(证明略) • Euler数(n)定义为小于n且与n互素的正整数个数 • p是素数,(p)=p-1 • 若n的因子分解为n=Piai, ai>0,Pi互不相同,则 (n)= Piai(1-1/Pi) • 若gcd(m,n)=1,则(mn)=(m)(n),特别地,若pq且都是素数, (pq)=(p-1)(q-1)
数论基础(续) • Euler定理: 若a与n为互素的正整数,则a(n) 1 mod n • 推论: 若n=pq, pq都是素数, k是任意整数,则mk(p-1)(q-1)+1 m mod n, 对任意0mn
RSA密钥生成与使用 • 产生密钥对 • 选择两个大素数p,q, pq • 计算n=pq,(n)=(p-1)(q-1) • 选择整数e,使得gcd(e,(n))=1 • 计算d e-1 mod (n) • 公钥: KU={e,n}, 私钥: KR={d,n} • 使用 • 加密: C = Me mod n • 解密: M = Cd mod n
计算乘幂 • 计算d=am, m=bkbk-1…b0(二进制表示) d1 for ik downto 0 do d(dd) mod n if bi = 1 then d(da) mod n return d • 原理: M = ((((((bk2+bk-1)2+bk-2)2+bk-3)2+…)2+b0
RSA密钥产生 • 产生两个素数 • 由于n = pq是公开的,所以,为了防止攻击者利用n获得p和q,必须选择足够大的素数p和q • 大素数产生算法 • 选择e或者d,然后求出另一个
大素数产生 • 素数生成过程: 随机选择一个奇数n(如通过伪随机数发生器) 随机选择a, 使a<n 进行素性测试(例如用Miller-Rabin算法),若n没有通过测试,抛弃n,转到 如果通过了足够次数的测试,认为n是素数,否则转到. • 素数理论: 在N附近,每ln(N)个整数中有一个素数
素性测试 • Miller-Rabin算法:用来测试一个整数是否是素数 • WITNESS(a,n) 设bkbk-1…b0是(n-1)的二进制表示 d1 for ik downto 0 do xd d(dd) mod n if (d=1 & x1 & xn-1) return TRUE if (bi=1) then d(da) mod n if (d1) return TRUE else return FALSE • 如果n不是素数,则返回FALSE的概率(即失败概率)小于0.5 • 如返回TRUE,说明n不是素数。 • 不满足an-1=a mod n • 对于x2=1 mod n,除了1和n-1之外,还有别的解
扩展Euclid算法 • ExtEclid(d,f):求最大公约数或模逆, 假定df (X1,X2,X3)(1,0,f), (Y1,Y2,Y3)(0,1,d) if Y3 = 0 then return X3, no inverse if Y3 = 1 then return 1, inverse is Y2 Q(X3/Y3)的整数部分 (X1,X2,X3)(X1-QY1, X2-QY2, X3-QY3) (X1,X2,X3) (Y1,Y2,Y3) goto • fX1+dX2=X3, fY1+dY2=Y3 • 若Y3=1,则 fY1+dY2=1 dY2=(-Y1)f+1 dY2 1 mod f Y2 = d-1 mod f
RSA安全性 • 基于数学的攻击 公钥: KU={e,n}, 私钥: KR={d,n}, n=pq • 分解n=pq (n)=(p-1)(q-1) d=e-1 mod (n) • 不求出p,q,直接求(n) d=e-1 mod (n) • 不求出(n),直接计算d • 结论 • 已知的方法至少跟因子分解一样难度 • 尚未发现多项式时间的因子分解算法 • 因子分解的算法已经取得了长足进步 • 措施: 选择足够大的n(1024位以上),并且使得e,d之间相差不太大,也不太小
RSA其他攻击 • 同模攻击 • 两对密钥的模n相同 • 时间攻击 • 利用CPU处理某些特殊的模乘比较慢的规律来确定每一位指数
原根(primitive root) • Euler定理表明,对两个互素的整数a,n, a(n) 1 mod n • 定义:存在最小正整数m(n) (m|(n)),使得 am 1 mod n 若对某个a,m=(n),则称a是n的一个原根 • 对于素数p,若a是p的一个原根,则: a,a2, …,ap-1关于p两两不同余,从而构成了p的非0剩余类,即与{1,2,…,(p-1)}关于模p等价.
离散对数 • 若a是素数p的一个原根,则对任意整数b,b0 mod p,存在唯一的整数i, 1i(p-1),使得:bai mod pi称为b以a为基模p的指数(离散对数),记作inda,p(b).容易知道:inda,p(xy)= [inda,p(x)+inda,p(y)] mod (p) inda,p(xr)= [rinda,p(x)] mod (p) • 离散对数的计算:ygx mod p • 已知g,x,p,计算y是容易的 • 已知y,g,p,计算x是困难的
Diffie-Hellman密钥交换 • 允许两个用户可以安全地交换一个秘密信息,用于后续的通讯过程 • 算法的安全性依赖于计算离散对数的难度 • 算法: • 双方选择素数q以及q的一个原根r • A选择X<q,计算XA=rXmod p, AB: XA • B选择Y<q,计算YB=rYmod p, BA: YB • A计算: (YB)X(rY)XrXYmod p • B计算: (XA)Y(rX)YrXYmod p • 双方获得一个共享密钥(rXYmod p) • 素数q以及q的原根r可由一方选择后发给对方
K = rxy A B E A B E K = rxz K = ryz Diffie-Hellman密钥交换的攻击 • replay攻击 • 中间人攻击图示
Diffie-Hellman密钥交换的攻击 • 中间人攻击 • 1 双方选择素数q以及q的一个原根r(假定E知道) • 2 A选择X<q,计算XA=rX mod p, AB: XA • 3 E截获XA,选Z,计算ZE=rZ mod p,冒充AB:ZE • 4 B选择Y<q,计算YB=rY mod p, BA: YB • 5 E截获YB,冒充BA: ZE • 6 A计算: (ZE)X(rZ)XrZX mod p • 7 B计算: (ZE)Y(rZ)YrYZ mod p • 8 E计算: (XA)ZrXZ mod p, (YB)ZrYZ mod p • E无法计算出rXY mod p • E永远必须实时截获并冒充转发,否则会被发现
椭圆曲线密码介绍 • 1985年Miller,Koblitz 独立提出 y2+axy+by=x3+cx2+dx+e • 曲线上的点连同无穷远点O的集合 • 运算定义: • 若曲线三点在一条直线上,则其和为O • O用作加法的单位:O = -O; P+O = P • 一条竖直线交X轴两点P1、P2,则P1+P2+O=O,于是P1 = -P2 • 如果两个点Q和R的X轴不同,则画一连线,得到第三点P1,则Q+R+P1=O,即Q+R=-P1 • 2倍,一个点Q的两倍是,找到它的切线与曲线的另一个交点S,于是Q+Q=2Q=-S
有限域上椭圆曲线 • 有限域上椭圆曲线 y2x3+ax+b mod p p是奇素数,且4a3+27b20 mod p • 针对所有的0<= x <p,可以求出有效的y,得到曲线上的点(x,y),其中x,y < p。记为Ep(a,b) • Ep(a,b)中也包括O • 加法公式: • P+O=P • 如果P=(x,y),则P+(x,-y)=O,(x,-y)点是P的负点,记为-P。而且(x,-y)也在Ep(a,b)中 • 如果P=(x1,y1),Q=(x2,y2),则 P+Q=(x3,y3)为x3=2-x1-x2 (mod p)y3=(x1-x3)-y1 (mod p)其中,如果PQ,则 = (y2-y1)/(x2-x1) 如果P=Q,则 = (3x12+a)/(2y1)
椭圆曲线用于加密 • 找到一个难题: • 考虑等式Q=kP,其中Q、P属于Ep(a,b),k<p • 已知k和P,计算Q,是容易的 • 已知Q和P,计算k,是困难的 • 选择Ep(a,b)的元素G,使得G的阶n是一个大素数 • G的阶是指满足nG=O的最小n值 • 秘密选择整数r,计算P=rG,然后 • 公开(p,a,b,G,P),P为公钥 • 保密r • 加密M:先把消息M变换成为Ep(a,b)中一个点Pm • 然后,选择随机数k,计算密文Cm={kG,Pm+kP) • 如果k使得kG或者kP为O,则要重新选择k. • 解密Cm: (Pm+kP)-r(kG)=Pm+krG-rkG=Pm • 加密信息有扩张
椭圆曲线密码的安全性 • 难点: 从P和kP获得k • 对椭圆曲线研究的时间短 • 椭圆曲线要求密钥长度短,速度快 • 对比: ECC RSA*Pollard rho分析方法
消息认证 • 在网络通信中,有一些针对消息内容的攻击方法 • 伪造消息 • 窜改消息内容 • 改变消息顺序 • 消息重放或者延迟 • 消息认证:对收到的消息进行验证,证明确实是来自声称的发送方,并且没有被修改过。 • 如果在消息中加入时间及顺序信息,则可以完成对时间和顺序的认证
消息认证的三种方式 • Message encryption:用整个消息的密文作为认证标识 • 接收方必须能够识别错误 • MAC:一个公开函数,加上一个密钥产生一个固定长度的值作为认证标识 • Hash function:一个公开函数将任意长度的消息映射到一个固定长度的散列值,作为认证标识
Message Authentication Code • 使用一个双方共享的秘密密钥生成一个固定大小的小数据块,并加入到消息中,称MAC,或密码校验和(cryptographic checksum) • 用户A和用户B,共享密钥K,对于消息M, MAC=CK(M) • 如果接收方计算的MAC与收到的MAC匹配,则 • 接收者可以确信消息M未被改变 • 接收者可以确信消息来自所声称的发送者 • 如果消息中含有序列号,则可以保证正确的消息顺序 • MAC函数类似于加密函数,但不需要可逆性。因此在数学上比加密算法被攻击的弱点要少
MAC应用方式 M M || C C Compare Ck(M) K K
关于MAC算法 • MAC不等于数字签名 • 因为通讯双方共享同一个密钥 • MAC有固定的长度 • MAC结构的重要性,例如,密钥足够长+加密算法足够好安全 • M=(X1,X2,…,Xt) • 对M产生校验核M=X1X2…Xt • MAC = EK(M) • 攻击者选择M=(Y1,Y2,…,Yt-1,Yt),使得Yt满足: Yt= Y1Y2…Yt-1M • 于是M=MEK(M)=EK(M) CK(M)=CK(M) • 所以,尽管攻击者不知道K,仍然可以伪造消息M
MAC算法的要求 • 条件: • 攻击者知道MAC函数但不知道密钥K • 要求: • 已知M和CK(M),要想构造M使得CK(M)=CK(M)在计算上不可行(计算上无碰撞) • CK(M)均匀分布:随机选择M和M, Pr[CK(M) = CK(M)]=2-|MAC| • f是M的一个变换(例如对某些位取反),那么, Pr[CK(M)= CK(f(M))]=2-|MAC|
MAC based on DES • 算法: • M=(X1,X2,…,Xt) • M1=EK(X1) • Mj+1=EK(Xj+1Mj), 1j<t • MAC= Mt • ANSI标准(X9.17) • 即为CBC模式结构,初始向量为0 • 该方法适用于其他加密算法
Hash Function • MAC需要对全部数据进行加密 • MAC速度慢 • Hash是一种直接产生认证码的方法 • Hash函数: h=H(x), 要求: • 可作用于任何尺寸数据且均产生定长输出 • H(x)能够快速计算 • 单向性: 给定h,找到x使h=H(x)在计算上不可行 • Weak Collision Resistence(WCR):给定x,找到yx使H(x)=H(y)在计算上不可行 • Strong Collision Resistence(SCR): 找到yx使H(x)=H(y)在计算上不可行
生日攻击理论基础 • 理论基础 • 若k1.182m/22m/2, 则k个在[1,2m]的随机数中有两个数相等的概率不低于0.5 • 若k0.83n1/2,两个在[1,n]的k个随机数集合有交集的概率不小于0.5 • 因此,当Hash算法选用N位的Hash值时,两组消息(选择k=N/2)中有一对消息产生相同Hash值的概率超过0.5
生日攻击例子 • Letter1: This Letter is I am writing you to to you Mr. -- to introduce P. -- . . . . . . Alfred Barton, • Letter2: . . . . . . Letter2与Letter1中的信含义不同。各自组合出2k封信件,然后在两个组中找到两封hash值相同的信! 对策:Hash值足够长,64-〉128-〉160-〉256
hash函数通用模型 • 由Merkle于1989年提出 • 几乎被所有hash算法采用 • 具体做法: • 把原始消息M分成一些固定长度的块Yi • 最后一块padding并使其包含消息M的长度 • 设定初始值CV0 • 压缩函数f, CVi=f(CVi-1,Yi-1) • 最后一个CVi为hash值
hash函数模型图 Y1 YL-1 Y0 b b b n n f f f n n n CVL IV= CV0 CV1 CVL-1 IV = initial value 初始值 CV = chaining value 链接值 Yi = ith input block (第i 个输入数据块) f = compression algorithm (压缩算法) n = length of hash code (散列码的长度) b = length of input block(输入块的长度)
MD5 算法 • 作者:Ron Rivest • 算法 • 输入:任意长度的消息 • 输出:128位消息摘要 • 处理:以512位输入数据块为单位