TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
RSA算法是最流行的公钥密码算法,使用长度可以变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。
RSA算法的可靠性基于分解极大的整数是很困难的。
RSA算法原理如下:
1.随机选择两个大质数p和q,p不等于q,计算N=pq;
2.选一个大于1小于N的自然数e(公钥),e必须与(p-1)(q-1)互素。
3.用公式计算出d(私钥):d×e≡ 1(mod(p-1)(q-1))。
4.对于明文数字m,计算密文c的公式是m的e次方再与n求模
5.对于密文c,计算明文m的公式是c的d次方再与n求模
RSA的安全性依赖于大数分解,小于1024位的N已经被证明是不安全的,而且由于RSA算法进行的都是大数计算,使得RSA最快的情况也比DES慢上数倍,这是RSA最大的缺陷,因此通常只能用于加密少量数据或者加密密钥,但RSA仍然不失为一种高强度的算法。
- import java.math.BigInteger;
- public class RSA {
- private long p,q,e,d,n;
- public RSA(){
-
- p = 1033;
- q = 2017;
- e = 29437; //公钥
- n = p*q;
- d = calculateD(); //私钥
- }
- private long calculateD(){
- long t0 = 0,t1 = 1,t2 = -1;
- long r0 = (p-1)*(q-1), m = r0,r1 = e ,r2 = -1;
- do{
- long q = r0/r1;
- r2 = r0-r1*q;
- if(r2==0)break;
- t2 = t0 - t1*q;
- while(t2<0){
- t2+=m;
- }
- if(t2>=m){
- t2 %= m;
- }
- r0 = r1;
- r1 = r2;
- t0 = t1;
- t1 = t2;
- }while(r2!=0);
- if(r1!=1){
- return 0;
- }
- else{
- return t2;
- }
- }
-
- public long getE() {
- return e;
- }
- public long getN() {
- return n;
- }
- public long getD() {
- return d;
- }
- public BigInteger encode(BigInteger data){ //加密
- return pow(data,e).mod(new BigInteger(n+""));
- }
- public BigInteger decode(BigInteger code){ //解密
- return pow(code,d).mod(new BigInteger(n+""));
- }
- public BigInteger pow(BigInteger data,long p){
- data = data.pow((int)p);
- return data;
- }
- public static void main(String args[]){
- RSA rsa = new RSA();
-
- BigInteger data = new BigInteger("222222");
- long oldtime = System.currentTimeMillis();
- BigInteger code = rsa.encode(data);
-
- long newtime = System.currentTimeMillis();
- double codetime = ((double)(newtime-oldtime))/1000;
- oldtime = System.currentTimeMillis();
- BigInteger decode = rsa.decode(code);
-
- newtime = System.currentTimeMillis();
- double decodetime = ((double)(newtime-oldtime))/1000;
- System.out.println("privateKey:"+rsa.d);
- System.out.println("publickKey:"+rsa.e);
- System.out.println("N:"+rsa.n);
- System.out.println("data:"+data);
- System.out.println("code:"+code+" time:"+codetime);
- System.out.println("decode:"+decode+" time:"+decodetime);
- }
- }
复制代码
运行结果: C:java>java RSA
privateKey:6997
publickKey:29437
N:2083561
data:222222
code:750743 time:4.777
decode:222222 time:0.28
相关文章:
使用RSA算法进行加密和解密
源码下载:http://file.javaxxz.com/2014/11/7/000344843.zip |
|