RSA算法: package key; import java.math.BigInteger; import java.util.Random; public class RSA extends Cryption{ KEY ku;//公钥 KEY kr;//私钥 public RSA() { Random r = new Random(); BigInteger p,q,n,nn; BigInteger e = BigInteger.ONE;// = new BigInteger(3+""); BigInteger d = BigInteger.ONE; //素数p,q,e,d while(true) { p = BigInteger.probablePrime(17, r);//new BigInteger(7+""); q = BigInteger.probablePrime(19, r);//new BigInteger(5+""); n = p.multiply(q); nn = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE)); if(nn.longValue() > 65535) { for(int i=3; i<nn.intValue(); i++) { if(MyMath.gcd(i, nn.intValue()) == 1) { e = BigInteger.valueOf(i); if(MyMath.exgcd(e, nn).longValue() == -1) continue; else break; } } d = MyMath.exgcd(e, nn).mod(nn); BigInteger big = d.multiply(d);big = big.multiply(big); if(big.compareTo(n) > 0) { break; } else continue; } } this.ku = new KEY(e,n); this.kr = new KEY(d,n); } public RSA(KEY ku, KEY kr) { super(); this.ku = ku; this.kr = kr; } class KEY { BigInteger x; BigInteger n; public KEY(BigInteger x, BigInteger n) { super(); this.x = x; this.n = n; } } //加密 public String Encryption(String s, KEY key) { StringBuffer sb = new StringBuffer(); char[] cs = s.toCharArray(); for(int i=0; i<cs.length; i++) { int k = cs[i]; if(k < key.n.longValue()) { BigInteger p = new BigInteger(k+""); int kk = Integer.parseInt(MyMath.reaminder(key.n, p,Long.parseLong(key.x.toString())).toString()); char c =(char)kk; sb.append(c); } else { sb.append(cs[i]); } } return sb.toString(); } //加密成16进制字符串 public String Encryption(String s) { StringBuffer sb = new StringBuffer(); char[] cs = s.toCharArray(); for(int i=0; i<cs.length; i++) { int k = cs[i]; if(k < this.ku.n.longValue()) { BigInteger p = new BigInteger(k+""); long kk = Long.parseLong(MyMath.reaminder(this.ku.n, p,Long.parseLong(this.ku.x.toString())).toString()); sb.append(Long.toHexString(kk)); sb.append(" "); } else { sb.append(Integer.toHexString(k)); sb.append(" "); } } return sb.toString(); } //解密 public String Decryption(String s, KEY key) { return Encryption(s,key); } public String Decryption(String s) { StringBuffer sb = new StringBuffer(); String[] ss = s.split(" "); for(int i=0; i<ss.length; i++) { long k = Long.parseLong(ss[i], 16); BigInteger p = new BigInteger(k+""); int kk = Integer.parseInt(MyMath.reaminder(this.kr.n, p,Long.parseLong(this.kr.x.toString())).toString()); sb.append(Tools.obox(Integer.toHexString(kk), 4)); } return Tools.hexStr2Str(sb.toString()); } public static void main(String[] args) { RSA rsa = new RSA(); String s = "大家好abi 是低估 斯蒂芬和欧冠发 蛋糕房女生佛 ,;"; String sa = rsa.Encryption(s); System.out.println("密文: " + sa); System.out.println("明文: " + rsa.Decryption(sa)); System.out.println("e:"+rsa.kr.x + " d:" + rsa.ku.x +" n:" + rsa.kr.n); } } ECC算法 package key; import java.math.BigInteger; import java.util.Random; public class ECC extends Cryption{ static E e;//椭圆曲线 Pare pare;//椭圆上的已知点 long privatekey;//7位速度变慢 私钥--随机 Pare publickey;//公钥 public ECC() { super(); Random rand = new Random(); this.e = new E(BigInteger.probablePrime(30, rand).intValue(),rand.nextInt(1024),rand.nextInt(1024)); this.privatekey = rand.nextInt(1024);//7位速度变慢 私钥--随机 this.pare = new Pare(rand.nextInt(10000000),rand.nextInt(10000000)); this.publickey = this.pare.multiply(privatekey);//new Pare(); } class E {// 表示椭圆曲线方程 Long p;//模p的椭圆群 Long a; Long b; public E(long p, long a, long b) { super(); this.p = p; this.a = a; this.b = b; } } class Message {//传送消息的最小单元 Pare pa; Pare pb; public Message(Pare pa, Pare pb) { super(); this.pa = pa; this.pb = pb; } public String toString() { return this.pa.toString() +" "+ this.pb.toString(); } } class Pare {//椭圆曲线上的点(x,y) long x; long y; public Pare() { super(); } public Pare(long x, long y) { super(); this.x = x; this.y = y; } //加法 public Pare add(Pare pare) { if(this.x == Integer.MAX_VALUE) {//为无穷大时O+P=P return pare; } Pare res = new Pare(); if(this.y==pare.y && this.x==pare.x) {//相等时 long d = moddivision(3*this.x*this.x + ECC.e.a,ECC.e.p,2*this.y); res.x = d*d - 2*this.x; res.x = mod(res.x, ECC.e.p); res.y = d*(this.x - res.x) - this.y; res.y = mod(res.y, ECC.e.p); } else if(pare.x - this.x != 0) { long d = moddivision(pare.y - this.y,ECC.e.p,pare.x - this.x); res.x = d*d - this.x - pare.x; res.x = mod(res.x, ECC.e.p); res.y = d*(this.x - res.x) - this.y; res.y = mod(res.y, ECC.e.p); } else {//P Q互逆,返回无穷大 res.x = Integer.MAX_VALUE; res.y = Integer.MAX_VALUE; } return res; } //减法 public Pare less(Pare p) { p.y *= -1; return add(p); } //乘法 public Pare multiply(long num) { Pare p = new Pare(this.x,this.y); for(long i=1; i<num; i++) { p = p.add(this); } return p; } //求余,解决负号问题 public long mod(long a, long b) { a = a%b; while(a<0) { a += b; } return a; } //求余取商(a mod b)/c /*public long moddivision(long a, long b, long c) { a = mod(a,b); while(a%c != 0) { a += b; } a = a/c; return a; }*/ public long moddivision(long a, long b, long c) { a = mod(a,b); c = mod(c,b); a = a*MyMath.exgcd(c,b); return mod(a,b); } public String toString() { return Tools.obox(Tools.long2hexStr(this.x), 4) + " " + Tools.obox(Tools.long2hexStr(this.y), 4); } } //加密 public Message encryption(Pare g,Pare pbk,Pare word) { pbk = g.multiply(privatekey);//公钥 int d = new Random().nextInt(1024);//随机数 Pare dg = g.multiply(d); Pare dp = pbk.multiply(d); Pare send = word.add(dp); return new Message(dg,send); } public String encryption(Pare g, Pare pbk, String word) { StringBuffer sb = new StringBuffer(); Pare[] words = Str2Pares(word); for(int i=0; i<words.length; i++) { sb.