欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java实现底层的rsa加密算法

程序员文章站 2022-07-04 14:43:29
...
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 *").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]+" ");
}


}
相关标签: cipher RSA