java实现底层的rsa加密算法

import java.math.BigInteger;
import java.security.SecureRandom;

import javax.crypto.Cipher;


public class ModeTest
{

public static void main(String args[])
{
// int result = ModeTest.modeOperator(7, 563, 563);
// System.out.println(result);
//
// int result1 = Fermat(563,7);
// System.out.println("Fermat result ="+result1);
testRSA();
}

/**
* 实现a1^a2 mod a3 的运算
* @param a1
* @param a2
* @param a3
* @return
*/
public static int modeOperator(int a1,int a2,int a3)
{

BigInteger b1 = new BigInteger(a1+"");
// BigInteger b2 = new BigInteger(a2+"");
BigInteger b3 = new BigInteger(a3+"");

return b1.pow(a2).mod(b3).intValue();

}

/**
* 费马定理 ,要求p是素数,而且a>0 那么 a**p == a(mod p) ,即a的p次方mode p 与a mode p同余
* @param p
* @param a
* @return
*/
public static int Fermat(int p,int a)
{
//实现要判断p是素数,这个可以同Miller-Rabin算法实现
if(!MillerRabin(p, 1))
{
System.out.println("p is no a prime!");
return -1;
}
return a%p;
}


    public static boolean MillerRabin(int n,int t)
    {      
        for(int i=0;i<t;i++)
           if(!isPrime(n))
              return false;
       return true;
    }
    /**
     *
     * @param n The number should be tested whether it is a prime.
     */
    public static boolean isPrime(int n)
   {
       int k,q;
       SecureRandom random=new SecureRandom();
       for(k=0;(((n-1)>>k)&1)==0;k++);
        q=(n-1)>>k;
        int a=random.nextInt(n);
      if(squareMultiply(a, q, n)==1)
            return true;
       for(int j=0;j<k;j++)
            if(squareMultiply(a, (int)Math.pow(2, j)*q,    n)==n-1)
                return true;
       return false;
    }

    public static int squareMultiply(int a,int b,int p)
    {
       int x=1,y=a;
        int len=(int)Math.ceil((Math.log(b)/Math.log(2)));
       for(int i=0;i<len;i++)
        {
            if(((b>>i)&1)==1)
           {
                x=(x*y)%p;
            }
           y=(y*y)%p;
       }
       return x;
    }
   
   public  static int [] charToAscii(char cypher[],int c[])
     {
   int temp[] = new int[cypher.length];
   for(int i=0;i<cypher.length;i++)
   {
   //将字母转换成数字
  // cypher[i] =  Character.forDigit(cypher[i], 16);
   temp[i] = cypher[i];
  
   }
  
   return temp;
    }
  
   public static char[] asciiToChar(int c[],char cypher[])
   {
   char temp[] = new char[c.length];
   for(int i=0;i<c.length;i++)
   {
   temp[i] = (char) c[i];
   }
   return temp;
   }
   public static void testRSA()
   {

char cypher[]= new String("I LOVE THE PEOPLE'S REPUBLIC OF CHINA").toCharArray();
//对“我爱中华人民共和国”加解密
   int c[] = new int[cypher.length];; //用于存放将上面的字符数组转换成16进制数字数组
int a[] = new int[cypher.length];; //用于存放加密的数字数组
int b[] = new int[cypher.length];; //用于存放解密的数字数组
    c=charToAscii(cypher,c);//字母变数字的过程

// for(int k1=0;k1<cypher.length;k1++)
// {
// System.out.println(c[k1]);
// System.out.println(cypher[k1]);
// }
    System.out.println("plain text:"+new String(cypher));
//选取两个素数p=563,q=823
int n=0, e,fn=0, p=563,q=823,d=0;
n=p*q;fn=(q-1)*(p-1);
//选e与fn互素
for(e=2;e<fn;e+=3)
{
if(EuclidExtend.gcd(e,fn)==1)
break;
}
d=EuclidExtend.compute(e,fn);

System.out.println("密码和密钥e d and n:");;
System.out.println(e+" "+d+" "+n);
//加密过程
System.out.println("加密:");
for(int i=0;i<cypher.length;i++)
{
a[i]=modeOperator(c[i],e,n);
System.out.println(a[i]+" ");
}
System.out.println("解密:");
//解密过程
for(int j=0;j<cypher.length;j++)
{
b[j]=modeOperator(a[j],d,n);
System.out.println(b[j]+" ");
}


}

你可能感兴趣的:(rsa,cipher)