公钥密码算法及其JAVA编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
n p 1q 1 42 58 2436 取 e 13, de 13d 1 mod 2436 得 d 937 e 由加密算法 C M mod n C 152013 mod 2537
C 1520 2
6
1520 mod 2537
e
6.3
RSA 算法的 JAVA 编程
6.3.1 素数测试类的设计 检验素数性方面已经出现了许多方法,几乎所有的方法都是 概率性质的,也就是说,这个检验只是确定一个给定的整数可能 是素数。虽然缺乏完全的确定性,但是这些检验在运行时可以按 照需要做到使得概率尽可能地接近 1。 检验一个给定整数是否是素 数的过程是完全涉及 n 和一个随机选取的整数 a 的素数性检验计 算过程。如果 n 没有通过这次检验,那么 n 就不是一个素数。如 果 n 通过了这次检验,那么 n 可能是素数也可能不是。如果 n 通 过了许多这种检验,其中涉及许多随机选取的 a 值,那么就对于 n 是素数有了很高的信心。 对于较小的数(32 位以下),判断一个数是否是素数的简单方 法是求因子。如果除了 1 和本身之外没有别的因子,则此数是素 数。通常,素数的测试用于较大数。这些测试确定一个数为素数 的 可 能 性 。 一 个 常 见 的 方 法 是 利 用 JAVA 的 BigInteger 类 的 isProbablePrime()方法。这个方法取 n 值作为变元,对于固定值 m,如果 BigInteger 为素数的概率大于 1 2 ,则返回 true。当 n 等于 10 时,素数的概率为 99.9%,当 n 等于 20 时,素数的概 率为 99.9999%。 下面的程序显示如何用 BigInteger 的 isProbahlePrime() 方法测试素数。程序取固定值(正整数)n 和要测试的数 m,然后返 回一个概率结果 result。 6.3.2 素数测试类的实验指导及源程序
160
,也许会大到 2
1024 e
。下面我们讨
论幂模计算的方法, 即对某正整数 g 和 e , 求 g mod m 的算法。 (1)反复平方和乘法 1、从右到左的二进制幂模法 输入:正整数 m ,小于 m 的整数 g 及整数 e 1 。 输出: g mod m 。 (1) s 1, r g (2)当 e 0 执行: ①如果 e 是奇数,则 s sr mod m ; ② e e / 2 ; ③如果 e 0 , r rr mod m 。 (3)返回 s 。 如果 t 是 e 的二进制表示的比特长度, we 是该表示中的 1
第 6 章公钥密码算法及其 JAVA 程序设计
6.1 公钥密码
公开密钥密码编码学的发展是整个密码编码学历史上一个革 命。从最初一直到现代,几乎所有密码编码系统都建立在基本的 替代和置换工具的基础上。 公开密钥密码编码学则与以前的所有 方法都截然不同。一方面公开密钥算法基于数学中的数论而不是 替代和置换,更重要的是,公开密钥密码编码学是非对称的,它 用到两个不同的密钥,而对称的常规加密则只使用一个密钥。使 用两个密钥对于保密通信、密钥分配和鉴别等领域都有着深远的 影响。公开密钥密码编码学是为解决常规加密面临的密钥分配问 题而发展起来的。由于公钥加密在计算上的巨大开销,当前的使 用只限于密钥管理和数字签名等应用。 公开密钥算法用一个密钥进行加密,而用另一个不同但是有 关的密钥进行解密。算法有以下重要特性: (1)仅仅知道密码算 法和加密密钥而要确定解密密钥,在计算上是不可能的。 (2)两 个相关密钥中任何一个都可以用作加密而让另外一个用作解密。 使用步骤如下: (1)网络中的每个端系统都产生一对用于它将接 收的报文进行加密和解密的密钥。 (2)每个系统都通过把自己的 加密密钥放进一个登记本或者文件来公布它,这就是公钥。另一 个密钥则是私有的。 (3)如果 A 想给 B 发送一个报文,他就用 B 的公钥加密这个报文。百度文库(4)B 收到这个报文后就用他的保密密钥解 密报文。其他所有收到这个报文的人都无法解密它,因为只有 B 才有 B 的私有密钥。 使用这种方法,所有参与方都可以获得各个 公开密钥,而各参与方的私有密钥由各参与方自己在本地产生, 因此不需要被分配得到。为了区分常规和公开密钥加密这两个体 制,我们一般将常规加密中使用的密钥称为秘密密钥,公开密钥 加密中使用的两个密钥则称为公开密钥和私有密钥。在任何时候 私有密钥都是保密的,但我们把它称为私有密钥而不是秘密密钥, 以免同常规加密中使用的秘密密钥混淆。
一个随机延时来迷惑定时攻击者,这样可以得到更好的性能。 (3) 盲化:在进行取密运算之前先用一个随机数与密文相乘。这个处 理防止了攻击者了解计算机中正在处理的密文(盲化操作增加的 开销是 2%到 10%) 。 4、大数幂模求法过程 BSA 公钥密码需要对某个大的正整数 m , 求模 m 的取幂运算, 在密码应用中 m 的大小超过 2
1786 95 mod 2537 787 58 95 1786 mod 2537 34129 2228 mod 2537 2116 14 2228 341 mod 2537 2188 7 1185 mod 2537 25 3 1185 2188 mod 2537 1520 mod 2537 最后得明文 M 1520
n
实验指导 2、 安装 JDK1.3。 3、 取要测试的数 m 为 1999 (实验用的默认数, 程序中已经定义) , 取固定值正整数 n 为 20 (实验用的默认数, 程序中已经定义) , 对应素数的概率为 99.9999%。 4、 程序取名 C431.java 编译、运行。
5、 结果显示 true。即数 1999 为素数的概率为 99.9999%。 6、 自行实验: 在源程序中修改定义不同的测试数 m 和 n 重复上述 实验过程。 JAVA 源程序 // 程序名 : C431.java // 目的 : 用于 JAVA 课 RSA 中素数测试演示 // 修改时间: 2004 年 4 月 2 日 import java.math.*; public class C431{ public static void main(String[] arge){ String number="1999"; BigInteger m=new BigInteger(number); int n=20; boolean result=m.isProbablePrime(n); System.out.print(result); } }//display true 6.3.3 素数生成类的设计 素数的生成过程为:随意取一个数,然后测试素数性,如果 测试成功,则找到了所要的数,否则在数字中加 1 然后重试,一 直重复直到生成素数。生成素数的方法有多种,但通常使用试错 法就可以了。选取一个素数的过程为: 1、 随机选一个整数 n 。 2、 完成随机素数性检验,如果 n 没有通过检验, n 1 并转到步 骤 1。 3、 如果 n 通过了检验,就接受 n 。 这是一个有点烦琐的过程。然而,相对来说并不经常进行这 个过程,只有在需要一对新的密钥时才需要进行一次。 6.3.4 素数生成类的实验指导及源程序
e d e
因为 ed 1 mod n , M
ed
M C d mod n M
M mod n
e d
mod n M ed mod n
2、RSA 算法举例 下面举个具体例子说明加密和解密过程。 加密过程 取明文为 1520 设 p 43 , q 59 , n 43 59 2537
1520 2
同理
1730 mod 2537
C 1730 6 1520 mod 2537 C 1777 1520 mod 2537
3 2
C 1730 2 1520 mod 2537
3
C 1777 1777 1520 mod 2537 C 1701 1777 1520 mod 2537 因为 1777 1520 1672 mod 2537 C 1701 1672 mod 2537 因为 1701 1672 95 mod 2537 C 95 mod 2537 最后得密文 C 0095 。
6.2
RSA 算法的原理
RSA (Rivest Shamir Adleman)算法是由美国麻省理工学院的 Ron Rivest,Adi Shamir 和 Len Adleman 于 1977 年研制并于 1978 年发表的一种算法。目前,此方案被广泛接受并成为通用公开密 钥加密算法。 1、RSA 算法的描述: 1、 取两个素数 p 和 q (保密) 2、 计算 n pq (公开) ,
解密过程
M 95 937 mod 2537 468 M 1414 95 mod 2537 M 240
234
95 mod 2537
3、对 RSA 算法方法的攻击 (1)强行攻击:对所有的私有密钥都进行尝试。 (2)数学攻击:等效于对两个素数乘积的因数分解。 (3)定时攻击:这依赖于解密算法的运行时间。 强行攻击 强行攻击是对所有的私有密钥都进行尝试(一般需要尝试一半
M M M M M M M
117
的密钥空间) ,因为加密前明文和加密后密文是共开的(解密公钥 共开) ,攻击者只需逐一尝试加密密钥,所以强行攻击是 RSA 算法 特点带来的独有的一种攻击方法。 对 RSA 强行攻击的防范模式与其他密码系统采用的方法相同, 即采用一个大的密钥。然而 e 和 d 的比特数越多,在密钥产生和 加密/解密中包含的计算越复杂。密钥越大,系统越慢。 因子分解攻击 我们可以辨别出三种以数学方式攻击 RSA 的方法: (1) n 分解为两个素数因子。这就可以使我们计算
e
的个数,以上算法要做 t 1 次平方和( we -1)次乘法运算。如 果 e 是在区间 0 e m 上随机选取的,则预期需要大约 1 / 2lg n 1 次乘法。 2、从左到右的二进制幂模法 输入:正整数 m ,小于 m 的整数 g 及正整数 e et et 1 e1e0 2 。 输出: g mod m 。 (1) s 1 。 (2)对 i 从 t 依次到 0,执行: ① s ss mod m ; ②如果 ei 1, s sg mod m 。 (3) 返回 s 。
3、 n p 1q 1 (保密)
4、随机选取整数 e ,满足 gcd e, n 1 (公开) 5、计算 d ,满足 ed 1 mod n (保密) 加密算法: C M mod n 解密算法: M C mod n 算法验证: C M mod n
n p 1q 1 ,然后可以确定 d e 1 mod n 。 (2)在不先确定 p 和 q 的情况下直接确定 n 。同样可以确定 d e 1 mod n 。 (3)不先确定 n 而直接确定 d 。
大部分关于 RSA 密码分析的讨论都集中在对 n 进行素因子分 解上。 给定 n 确定 n 就等价于对 n 进行因子分解。 给定 e 和 n 时 使用目前已知的算法求出 d 似乎在时间开销上至少和因子分解问 题一样大。对于一个具有大的素因子的大数,因子分解是一个难 题,最近对 RSA–130 的攻击使用广义数域筛法。用这种方法能够 仅用 10%的计算量进行分解,而特殊数域筛可以用比广义数域筛 快得多的速度分解一个特殊形式的数。因而我们需要小心地选取 RSA 的密钥大小。 定时攻击 窥探者可以通过监视一台计算机解密报文所花费的时间来确 定私有密钥。定时攻击不仅可以用于 RSA,还可以用于其他公开密 钥密码系统。它的攻击方式与常规的方式完全不同,并且它是一 种只用到密文的攻击方式。定时攻击有点像一个窃贼通过观察一 个人转动拨号盘拨出一个个数自所用的时间来猜测一个保险箱的 数字组合。 虽然定时攻击是一种严重的威胁,但是却有简单的防范措施 可以采用,这包括: (1)常数取幂时间:保证所有取密操作在返 回一个结果之前 花费同样多的时间。这是一个不大的更改,但是 确实使算法性能下降。 (2) 随机延时:可以通过对取幂算法增加