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