RSA的作业完成啦~~


//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;    //直接返回
    }

}

 

posted @ 2014-10-30 16:34  爱吃萝卜干  阅读(228)  评论(0编辑  收藏  举报