RSA算法实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档