西北农林科技大学信息安全实验三._第1页
西北农林科技大学信息安全实验三._第2页
西北农林科技大学信息安全实验三._第3页
西北农林科技大学信息安全实验三._第4页
西北农林科技大学信息安全实验三._第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、信息安全实验报告信息工程学院信息安全原理及应用实验报告实验三 基于RSA的公钥加密班 级: 计算机XX 学 号: XXXXXXX 姓 名: XXXXX 指导老师: XXXXX 一、 实验目的1 理解公钥密码算法,熟悉常用密码算法:RSA、椭圆曲线密码体制;2 理以RSA加密算法为例,掌握公钥密码算法加解密过程的实现。二、实习内容1基本要求以RSA为例,利用java中的相关类实现对指定字符串的加解密。2实现提示(1) 可以利用java中的KeypairGenerator类创建公钥密钥对,工厂类KeypairGenerator的静态方法getInstance()可以获得KeypairGenerat

2、or类型对象。(2) 方法getInstance()的参数为字符串类型,指定加密算法的名称如:RSA。(3) 利用工厂类Cipher的对象创建密码器。同样的,getInstance()的参数为字符串类型,指定加密算法的名称。(4) JSDK1.2中只是实现了RSA密钥创建,没有实现RSA算法,因此需要安装其他加密软件提供者的软件包,才能直接使用Cipher类执行加解密。(5) RSA算法是使用整数进行加密运算的,RSA的公钥中包含两个信息:公钥对应的整数e和用于取模的整数n。对于明文m计算密文的公式是me mod n。java中的BigInteger类中定义的modPow()方法可以计算me

3、mod n。(6) RSA的私钥中包含两个信息:私钥对应的整数d和用于取模的整数n。计算明文的公式是:Ce mod n。三、 测试数据和预期结果1 测试数据:明文:Hello UserB !e = 65537n = 901555080980479054261289117105730288186307404340275543727489749127530630355136991505778292433621397964374722520249984354228603713933977340430005741464776854333372749220974186623425710735870724

4、296620347804598554579103192757058530634283892779474717827772519179435753552898900020878547019341532042941570207847472 预测结果:m = 11253840535488571628089706713713923229723157675217664799906607973026015578815420520321236527400219496525363940515236822159671810260812132516608590481840367585218934895815814

5、333869183138495764680612749825153910274532648748320204216833296167081023385937007859365228073517478723018190901085831856225136435773586d = 25207280320866530647243330915124894030434558916537542248291075519192015610460549357388774937140361164379209325207227540636411392731016373630223271139357260160898

6、347846618224557735499399971970242992916184496303669743854746835920016717183151204857451734643665107085662188516607520806177363202710556814157473153n = 90155508098047905426128911710573028818630740434027554372748974912753063035513699150577829243362139796437472252024998435422860371393397734043000574146

7、477685433337274922097418662342571073587072429662034780459855457910319275705853063428389277947471782777251917943575355289890002087854701934153204294157020784747解密:Hello UserB !四、 算法分析和流程图1、RSA算法的加密解密基础过程分为三个:生成RSA公钥和私钥、使用公钥加密、使用密钥解密。1.1生成RSA公钥和私钥Java 的 KeyPairGenerator 类提供了一些方法来创建密钥对以便用于非对称加密,密钥对创建好后

8、封装在 KeyPair 类型的对象中,在 KeyPair 类中提供了获取公钥和私钥的方法。具体步骤如下:1.1.1创建密钥对生成器KeyPairGenerator kpg=KeyPairGenerator.getInstance(RSA);1.1.2初始化密钥生成器kpg.initialize(1024);对于密钥长度。对于 RSA 算法,这里指定的其实是 RSA 算法中所用的模的位数。可以在 512 到 2048 之间。1.1.3生成密钥对KeyPair kp=kpg.genKeyPair( );一对公钥和私钥的信息。1.1.4获取公钥和私钥PublicKey pbkey=kp.getPub

9、lic( );PrivateKey prkey=kp.getPrivate( );1.2使用公钥加密RSA算法是使用整数进行加密运算的,在RSA公钥中包含了两个信息:公钥对应的整数e和用于取模的整数n。对于明文数字m,计算密文的公式是:memod n。因此,编程步骤如下:1.2.1获取公钥FileInputStream f=new FileInputStream(Skey_RSA_pub.dat);ObjectInputStream b=new ObjectInputStream(f);RSAPublicKey pbk=(RSAPublicKey)b.readObject( );1.2.2获取

10、公钥的参数(e, n)BigInteger e=pbk.getPublicExponent();BigInteger n=pbk.getModulus();分别获得公始中 e 和 n 的值。由于密钥很长,因此对应的整数值非常大,无法使用一般的整型来存储,Java 中定义了 BigInteger 类来存储这类很大的整数并可进行各种运算。1.2.3获取明文整数(m)String s=Hello World!;byte ptext=s.getBytes(UTF8);BigInteger m=new BigInteger(ptext);分析:明文是一个字符串,为了用整数表达这个字符串,先使用字符串的

11、getBytes( )方法将其转换为 byte 类型数组,它其实是字符串中各个字符的二进制表达方式,这一串二进制数转换为一个整数将非常大,因此仍旧使用 BigInteger 类将这个二进制串转换为整型。1.2.4执行计算BigInteger c=m.modPow(e,n);执行这个计算。底数m执行这个方法,方法modPow( )的第一个参数即指数e,第二个参数即模n。方法返回的结果即公式memod n的计算结果,即密文。1.3使用密钥解密RSA算法的解密和加密类似,在RSA私钥中包含了两个信息:私钥对应的整数d和用于取模的整数n。其中的n和加密时的n完全相同。对于密文数字c,计算明文的公式是:

12、cdmod n,之所以加密时由公式memod n得到的密文c通过这个公式计算一下就可以反过来得到原来的明文m,有其本身的数学规律决定。1.3.1读取密文BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(Enc_RSA.dat);String ctext=in.readLine();BigInteger c=new BigInteger(ctext);由于这一行字符串表示的是一个很大的整型数,因此使用 BigInteger 类来表示这个整型数。1.3.2获取私钥FileInputStr

13、eam f=new FileInputStream(Skey_RSA_priv.dat);ObjectInputStream b=new ObjectInputStream(f);RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );用的是 RSA 算法,因此从文件读取公钥对象后强制转换为 RSAPrivateKey 类型,以便后面读取 RSA 算法所需要的参数。1.3.3获取私钥的参数(d, n)BigInteger d=prk.getPrivateExponent( );BigInteger n=prk.getModulus( );1.3.4执行

14、计算BigInteger m=c.modPow(d,n);1.3.5计算明文整型数对应的字符串byte mt=m.toByteArray();for(int i=0;imt.length;i+)System.out.print(char) mti);RSA 算法解密的结果 m 是一个很大的整数,为了计算出其对应的字符串的值,先使用 BigInteger 类的 toByteArray( )方法得到代表该整型数的字节数组,然后将数组中每个元素转换为字符,组成字符串。2、程序设计程序模拟A、B两用户,实现他们之间的通讯。通讯方法:A用B的公钥将明文加密后,将密文发送给B,B用自己的密钥解密可得到明文

15、;同理B用A的公钥加密后,将密文发送给A,A用自己的密钥解密可得到明文。A、 B的公钥以二进制文件的形式存储,方便读写,A、B的私钥封装在UserA、UserB类对象中。12UserA向UserB单项的传输信息的过程UserB向UserA传输信息的过程与此相同3、程序结构程序包括4个大类3.1 MainClass.java成员函数:public static void main(String args) /主函数3.2 Frame.java成员变量:JLabel A_label;JLabel B_label;JLabel A_pt;JLabel B_pt;JLabel A_ct;JLabel

16、B_ct;JLabel A_receive;JLabel B_receive;JTextArea Ap_tArea;JTextArea Ac_tArea;JTextArea Bp_tArea;JTextArea Bc_tArea;JTextArea Ar_tArea;JTextArea Br_tArea;JButton button_CA;JButton button_CB;JButton A_encrypt;JButton B_encrypt;JButton A_send;JButton B_send;JButton A_decrypt;JButton B_decrypt;UserA Use

17、rA;UserB UserB;成员函数:public Frame(String st) /初始化函数public void actionPerformed(ActionEvent e) /事件监听函数3.3 RSA.java成员变量:private PublicKey pbkey /公钥private PrivateKey prkey /私钥成员函数:public RSA() 初始化函数public void writeToFile(String fileName) /将密钥写入一二进制文件public RSAPrivateKey changeToRSAPrivateKey() /将Priva

18、teKey类的私钥转成RSAPrivateKey类的私钥3.4 UserA.java(UserB.java与UserA.java类似)成员变量:private RSA RSA_Aprivate RSAPublicKey rsa_a_pbkey /公钥private RSAPrivateKey rsa_a_prkey /私钥成员函数:public UserA() /初始化函数public String encrypt(String text) /加密函数public String decrypt (String text) /解密函数UML类图:五、运行结果1.运行程序2.分别点击UserA、UserB的“生成密钥对”按钮,控制台会显示生成成功,在工程文件夹下生成了两个二进制文件。3.在UserA的明文框里输入“Hello UserB !”,后点击加密,密文会出现在密文框中4.点击“发送”按

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论