1、(2)计算模 n=p*q(n公开)(3)计算欧拉函数(n) =(p-1)*(q-1)( (n)保密),丢弃p和q(4)随机选取整数e,满足 gcd(e, (n)=1 ( e和n为公钥)(5)计算d满足d*e1 mod (n)(d和n为私钥) (6)加密:将明文分组,每组长度xn, 计算 y =xe mod n,产生密文 y(7)解密:计算 x= y d mod n,恢复出明文 x(B)附:Rabin-Miller素数检验算法(1)选择一个小于p随机数a(2)设 j=0且 z=am mod p(3)如果z=1或z=p1,那么p通过测试,可能是素数(4)如果j0且z=1,那么p不是素数(5)设j=
2、j+1。如果jb且zp-1,设z=z2 mod p,然后回到第(4)步。 如果z=p-1,那么p通过测试,可能是素数(6)如果j=b且zp-1,那么p不是素数2源程序有良好人机界面,书写实验报告,于11月22日提交。四、实验内容与步骤1.实现公钥密码算法RSA算法流程2. 实验步骤(主要代码)(1)随机产生素数randomprimep、randomprimeq并判断randomprimep、randomprimeq是否为素数:int randomprimep = 0; /素数p初始赋值为零int randomprimeq = 0; /素数q初始赋值为零 Random rand = new Ra
3、ndom(); randomprimep = 10 + rand.nextInt(200);/随机产生素数p while (ifPrime(randomprimep) /判断p是否为素数 randomprimeq = 10 + rand.nextInt(200); /随机产生素数q while (ifPrime(randomprimeq) /判断q是否为素数(2)计算模 keyn(keyn公开):keyn = randomprimep * randomprimeq;(3)计算欧拉函数eulern(eulern保密),丢弃randomprimep和randomprimeq:eulern = (r
4、andomprimep - 1) * (randomprimeq - 1);randomprimep = randomprimeq = 0; /销毁两个随机素数(4)生成公钥:publickeye = 10 + rand.nextInt(200); /随机产生公钥while (relativePrime(publickeye,eulern) /判断随机公钥与公私钥相同部分的欧拉数是否为相对素数 publickeye = 10 + rand.nextInt(200); (5)用简捷方法求私钥:boolean mark = true; /用简捷方法求私钥,从模逆运算原始定义出发int k = 0;
5、while (mark) k+; if(k * eulern + 1)%publickeye = 0) mark = false; privatekeyd = (k * eulern + 1)/publickeye; /计算私钥(6)加密: RandomAccessFile rafr = new RandomAccessFile(source,r);/定义源文件 RandomAccessFile rafw = new RandomAccessFile(destination,rw /定义目标文件 String understandtxts = ;/明文初始赋值 String passwordt
6、xts = /密文初始赋值 understandtxts = rafr.readLine();/从源文件中读取数据赋值给明文变量 passwordtxts = passwordtxts + fastPowerMultiplication(int)eachchari,publickeye,keyn) + getRandomString();/用公钥将明文加密后并赋值给密文变量 rafw.writeBytes(passwordtxts);/将密文写入目标文件中 rafr.close();/关闭源文件 rafw.close();/关闭目标文件(7)解密: passwordtxts = rafr.re
7、adLine();/从源文件中读取加密后的数据并赋值给密文变量 understandtxts = understandtxts + (char)fastPowerMultiplication(intchar,privatekeyd,keyn);/用私钥将密文解密后并赋给明文变量 rafw.writeBytes(understandtxts);/将解密后的明文写入目标文件中 rafr.close(); 3、主要的函数(1)判断一个整型数据是否为素数:public boolean ifPrime(int number)/number为素数,mark返回false;否则,返回true boolean
8、 mark = false;/mark初始赋值为false for (int i = 2;i 127 | charint 10)加密失败!原文中包含不能加密的字符。 if (mark) pos = rafr.getFilePointer(); rafr.seek(0); pos = 0; if (!mark)从文件读入明文: System.out.println(rafr.readLine();明文加密后密文: while (true) for (int i = 0; passwordtxts = passwordtxts + fastPowerMultiplication(int)eachc
9、hari,publickeye,keyn) + getRandomString(); System.out.println(passwordtxts); rafw.writeBytes(passwordtxts); if (pos = filelength) passwordtxts = rafw.writeChar( catch (Exception e) e.printStackTrace(System.out); finally rafw.close(); catch (IOException ex) ex.printStackTrace(System.out); public Stri
10、ng getRandomString() String randstr = int number = 1 + rand.nextInt(5); int charint = 65 + rand.nextInt(26); randstr = randstr + (char)charint; charint = 65 + rand.nextInt(26); return randstr; public void dataDeciphering(String source,String destination) int intchar = 0; int j = 0;密文解密后明文: eachchar
11、= passwordtxts.toCharArray(); if (Character.isDigit(eachchari) intchar = 10*intchar + Integer.valueOf(String.valueOf(eachchari); else j = i - 1; if (Character.isDigit(eachcharj) & !Character.isDigit(eachchari) intchar = 0; System.out.println(understandtxts); System.out.println( understandtxts = public static void main(String args)
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2