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]+" ");
}
}
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]+" ");
}
}
上一篇: JAVA RSA密钥对的生成与验证
下一篇: RSA加密与解密(转)