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]+" ");
}


}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值