|

楼主 |
发表于 2022-5-3 11:30:28
|
显示全部楼层
- package text;
- import java.nio.charset.Charset;
- import java.math.BigInteger;
- import java.util.Random;
- import java.util.Scanner;
- public class RAs {
- static BigInteger p,q,e,q1,p1,p2,q2,e1,m;
- static BigInteger nn = new BigInteger("1");
- static BigInteger mm = new BigInteger("0");
- public BigInteger run(){
- Random rnd=new Random();
- BigInteger a = new BigInteger(500,rnd);
- int s=(int)Math.pow(2,20);
- String pp=String.valueOf(s);
- BigInteger t= new BigInteger(pp);
- BigInteger temp=a.add(t);
- testsu(temp);
- if(testsu(temp)==true){}
- p1=temp;
- p2=p1.nextProbablePrime();
- p=p2;
- return p;
- }
- public BigInteger run1(){
- Random rnd=new Random();
- BigInteger a = new BigInteger(500,rnd);
- int s=(int)Math.pow(2,20);
- String pp=String.valueOf(s);
- BigInteger t= new BigInteger(pp);
- BigInteger temp=a.add(t);
- testsu(temp);
- if(testsu(temp)==true){}
- q1=temp;
- q2=q1.nextProbablePrime();
- q=q2;
- return q;
- }
- private boolean testsu(BigInteger temp) {
- for(int k=2; k<Math.pow(2,20);k++){
- int k1=k;
- String pp=String.valueOf(k1);
- BigInteger t= new BigInteger(pp);
- BigInteger[] m =temp.divideAndRemainder(t);
- BigInteger mm = new BigInteger("0");
- if(m[1].equals(mm)){return false;}
- }
- return true;
- }
- public boolean gcd(BigInteger k,BigInteger p){
- if(k.compareTo(p)>0){
- while(k.remainder(p)==nn){
- if(k.remainder(p)==mm&&p!=nn){
- return false;
- }
- else{
- BigInteger ll=p;
- p=k.remainder(p);
- k=ll;
- }
- }
- }
- else{BigInteger r=k;
- k=p;
- p=r;}
- return true;
- }
- public BigInteger ggcdeee(){
- int v=0;
- Random snd=new Random();
- while(v==0){
- BigInteger t=new BigInteger(400, snd);
- BigInteger tt=t.gcd((p.subtract(nn)).multiply(q.subtract(nn)));
- if(tt.equals(nn)){
- e1=t;
- e=e1;
- v++;
- }
- }
- return e;
- }
- public BigInteger lock(BigInteger e1,BigInteger n1,BigInteger d1,BigInteger m1){
- BigInteger c=m1.modPow(e1, n1);
- return c;
- }
- public BigInteger unlock(BigInteger c2,BigInteger d2,BigInteger n2){
- m=c2.modPow(d2,n2);
- return m;
- }
- public static BigInteger encodeString(String str){
- if(str.length()>4){
- return BigInteger.ONE;
- }
- if(str.length()<4){
- str=str+(4-str.length())*' ';
- }
- BigInteger a[] =new BigInteger[4];
- for(int i=0;i<4;i++){
- a[i]=BigInteger.valueOf(str.codePointAt(i));
- }
- return a[3].xor(a[2].shiftLeft(16)).xor(a[1].shiftLeft(32)).xor(a[0].shiftLeft(48));
- }
- public static String decodeBiginteger(BigInteger b){
- long a[] =new long[4];
- String result="";
- for(int i=3;i>=0;i--){
- a[i]=b.shiftLeft(i*16).shiftRight(48).longValue();
- result=(char)(a[i])+result;
- }
- return result;
- }
- public static void main(String[] args){
- Scanner t=new Scanner(System.in);
- while(true){
- RAs s=new RAs();
- s.run();
- s.run1();
- s.ggcdeee();
- System.out.println("素数p="+s.run());
- System.out.println("素数q="+s.run1());
- BigInteger n=p.multiply(q);
- System.out.println("公共数模n="+n);
- BigInteger ss=(p.subtract(nn)).multiply(q.subtract(nn));
- System.out.println("欧拉函数φ(n)="+ss);
- System.out.println("公钥e="+e);
- BigInteger d=s.ggcdeee().modInverse(ss);
- System.out.println("私钥d="+d);
- System.out.println("请输入解密数据");
- String m=t.next();
- String str=m;
- BigInteger string1= encodeString(str);
- byte[] bs = str.getBytes();
- System.out.println("转换的中间代码="+encodeString(str));
- BigInteger c1=s.lock(e, n,d, string1);
- System.out.println("加密后="+c1);
- System.out.println("转换的中间代码="+s.unlock(c1, d, n));
- System.out.println("解密后的文件时: "+decodeBiginteger(s.unlock(c1, d, n)));
- }
- }
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|