标签:style blog io color ar java for sp div
//RSA 基本实现版
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigInteger; import java.util.Random; import java.util.Scanner; import org.omg.CORBA.PUBLIC_MEMBER; public class RSAFrame { private RSA rsa = new RSA(); private BigInteger p, q, e, n, d, ran; private Random rnd = new Random(); //全局变量 private int numBit = 10; public static void main(String[] args) { RSAFrame myrsa=new RSAFrame(); myrsa.beforeMessage(); //计算p,q,n,ran,e,d的值 BigInteger[] encodingM =myrsa.Encryption(); //对输入的信息m进行加密 myrsa.Decryption(encodingM); //对密文进行解密 myrsa.showValue(); //输出p,q,n,ran,e,d的值 } public void beforeMessage() //在发生信息之前,把这些算出来 { p = rsa.getPrimes(rnd); //得到素数p q = rsa.getPrimes(rnd); //得到素数q n = rsa.getN(p, q); //得到p*q ran = rsa.getRan(p, q); //得到(p-1)*(q-1),ran e = rsa.getE(ran); //根据生成的大随机数与ran公约数是否为1,得到了公钥e d = rsa.getKey(e,ran); //根据公钥e,和ran,生成了密钥d System.out.println("请输入随机数的位数(大于9):"); Scanner input=new Scanner(System.in); numBit=input.nextInt(); if(numBit<9) { System.out.println("随机数的位数应该大于9"); } } public BigInteger[] Encryption() { String Message = ""; System.out.println("请输入要发送的消息M(please in English):"); InputStream mym= System.in; BufferedReader rd = new BufferedReader(new InputStreamReader(mym)); try { Message= rd.readLine(); System.out.println("输入的消息为: "+Message); } catch(IOException e) { System.out.println(e.getMessage()); } char[]c = Message.toCharArray(); BigInteger[] deal_message=new BigInteger[c.length]; for (int i = 0;i < c.length;i ++) { // System.out.println(c[i]); //分解成每一位: int a=(int)c[i]; BigInteger bigInteger = BigInteger.valueOf(a); deal_message[i]=bigInteger; //成功赋值 } deal_message=RSA.encodeRSA(deal_message,e,n); //直接在原来基础上修改 return deal_message; } public void Decryption(BigInteger[] encodingM ) { encodingM=RSA.dencodeRSA(encodingM, d, n); //解码后,得到的信息,二维 char[] c=new char[encodingM.length]; for (int i = 0;i < encodingM.length;i ++) { // System.out.println(encodingM[i]); //分解成每一位: int d = encodingM[i].intValue(); c[i]=(char)d; } String message = String.valueOf(c); System.out.println("解密后的信息为: "+message); } private void showValue() { System.out.println(" "); System.out.println("素数p: "+p); System.out.println("素数q: "+q); System.out.println("计算p*q: "+n); System.out.println("计算(p-1)*(q-1): "+ran); System.out.println(" "); System.out.println("公钥e为: "+e); System.out.println("密钥d为: "+d); } }
import java.math.BigInteger; import java.util.Random; public class RSA { private BigInteger primes = BigInteger.ZERO; private BigInteger n, ran, d = BigInteger.ZERO; private BigInteger e = BigInteger.ZERO; private String m; Random rnd = new Random(); private int numBit = 10; public int getNumBit(int n) { numBit = n; return numBit; } public BigInteger getPrimes(Random rnd) { return primes = BigInteger.probablePrime(numBit, rnd); } public BigInteger getN(BigInteger p, BigInteger q) { return n = p.multiply(q); } public BigInteger getRan(BigInteger p, BigInteger q) { /*long r = (p.intValue() - 1)*(q.intValue() - 1); String tr = String.valueOf(r);*/ ran = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE)); return ran; } public BigInteger getE(BigInteger ran) { BigInteger temp = null; //中间变量 e = BigInteger.ZERO; do { temp = BigInteger.probablePrime(numBit, rnd); // 随机生成一个素数,看他是否与ran的公约数为1,如果为1,e=temp退出循环 if((temp.gcd(ran)).equals(BigInteger.ONE)) { e = temp; } } while(!((temp.gcd(ran)).equals(BigInteger.ONE))); return e; } public BigInteger getKey(BigInteger e, BigInteger ran) { d = e.modInverse(ran); return d; } public static BigInteger[] encodeRSA(BigInteger[] encodeM , BigInteger e, BigInteger n) { //直接用encodeM表示: for(int i=0; i < encodeM.length; i++) { encodeM[i] = encodeM[i].modPow(e, n); } return encodeM; } public static BigInteger[] dencodeRSA(BigInteger[] encodeM, BigInteger d, BigInteger n) { if (encodeM == null) return null; for (int i = 0; i <encodeM.length; i++) { encodeM[i] = encodeM[i].modPow(d,n); } return encodeM; //直接返回 } }
标签:style blog io color ar java for sp div
原文地址:http://www.cnblogs.com/aniy/p/4063071.html