RSA算法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二非对称密码算法RSA
一、实验目的
通过实际编程了解非对称密码算法RSA勺加密和解密过程,加深对非对称密码算法的认识。
二、实验环境
运行Windows或Linux操作系统的PC机,具有版本的Java语言编译环境。
三、实验内容和步骤
1、对RSA算法的理解
RSA算法(公开密钥算法)的原理:
(1) •选择两个大的素数p和q (典型情况下为1024位)
(2) .计算n = p * q 和z = ( p-1 ) * ( q-1 ) .
(3) .选择一个与z 互素的数,将它称为d
⑷. 找到e,使其满足e*d = 1 mod z
提前计算出这些参数以后,我们就可以开始执行加密了。首先将明文分成块,使得每个明文消息P落在间隔0*P 为了加密一个消息P,只要计算C=P A e(mod n)即可。为了解密C,只要计算 P=C A d(modn)即可。可以证明,对于指定范围内的所有P,加密盒解密互为反函数。为了执行加密,你需要e和n;为了执行解密,你需要d和n。因此,公钥是有(e,n)对组成,而私钥是有(d,n)对组成。 实例:根据已知参数:p=3,q=11,M=2计算公私钥,并对明文进行加密,然后对密文进行解密。 由题意知:n = p * q = 33, z = (p-1 ) * (q-1 )= 20,选 d = 7, 计算得e=3,所以 C=MAe(mod n) = 8 M=CAd(mod n) = 2 2、RSA 算法与DES 算法的比较: 运行附件的RSATool,输入一大段文字,记录运行时间。再使用DES算法加密相同的文字,记录运行时间,对比这两个时间发现,RSA算法比DES算法慢很多,因为RSA算法进行的是大数运算,所以程序运行的速度比DES慢很多。因此RSA算法只适合于少量数据加密,不适合于大量数据加密。 3、算法设计 主要的方法: (1)、public static void GetPrime() 方法名称:产生大数的方法。 说明: 利用Java语言的中的类的方法中随机产生大数。 (2)、public static boolean MillerRobin(BigInteger num) 方法名称:判断是否是素数 的方法。 参数说明: num 是由GetPrime 方法产生的大数。说明: 这个方法判断GetPrime 方法传过来的是否是一个素数,是就返回true, 否就返回false。 3)、public static BigInteger powmod( BigInteger a, BigInteger t, BigInteger num ) 方 法名称:大数的幂运算方法。 说明:这个方法对传入的大数进行幂运算。 4)、public static BigInteger invmod(BigInteger a, BigInteger b) 方法名称:大数的取模运算方 法。说明:这个方法对大数进行取模运算。 5)、public static String Encode(String inStr,BigInteger PrimeP,BigInteger PrimeQ, BigInteger n,int nLen,int m,JTextField d) 方法名称:加密算法。 参数说明: inStr 是从界面输入的明文。 PrimeP 和PrimeQ 是由GetPrime 方法产生的两个大素数。 n 是由PrimeP 和PrimeQ 得到的值。 nLen 为n 的长度。d 为公钥。 6)、public static String Decode(String inStr,BigInteger PrimeP,BigInteger PrimeQ, BigInteger n,int nLen,int m,JTextField e) 方法名称:解密算法。 参数说明: inStr 是从界面输入的明文。 PrimeP 和PrimeQ 是由GetPrime 方法产生的两个大素数。 n 是由PrimeP 和PrimeQ 得到的值。nLen 为n 的长度。 e 为私钥。 4、源程序:(文件) import .*; import import .*; import .*; import .*; import .*; public class RSA1{ public static void main(String[] args) { MyFrame frame = new MyFrame(); MyPanel_fbutton panel_fbutton = new MyPanel_fbutton(frame,,,,; FlowLayout fl = new FlowLayout ,0,0); (fl); (panel_fbutton); ( 150, 100, 500, 480 ); J (true); } } class MyFrame extends JFrame { public MyFrame() { setTitle("RSA 算法"); add(wel); MyPanel_p panel_p = new MyPanel_p(P); add(panel_p); MyPanel_q panel_q = new MyPanel_q(Q); add(panel_q); MyPanel_d panel_d = new MyPanel_d(d); add(panel_d); MyPanel_e panel_e = new MyPanel_e(e); add(panel_e); MyPanel_in panel_in = new MyPanel_in(input); add(panel_in); MyPanel_out panel_out = new MyPanel_out(output); add(panel_out); MyPanel_out1 panel_out1 = new MyPanel_out1(output1); add(panel_out1); MyPanel_button panel_button = new MyPanel_button(P,Q,d,e,input,output,output1); add(panel_button); } private JLabel wel = new JLabel(" RSA 算法演示"); protected JTextField P = new JTextField(35); protected JTextField Q = new JTextField(35); protected JTextField d = new JTextField(35); protected JTextField e = new JTextField(35); protected JTextArea input = new JTextArea(4,35); protected JTextArea output = new JTextArea(4,35); protected JTextArea output1 = new JTextArea(4,35);