密码算法中,按密钥的类型分为:对称密钥密码和非对称密钥密码(其加密解密不是使用的同一个密钥)。javascript
RSA算法是现今使用最普遍的公钥密码算法,属于非对称密钥密码。java
一、取两个值p、q , 令r = p*q。(注意:p、q为质数;实际运用的p、q 值越大则越不容易被破解)算法
二、令 l =(p-1)*(q-1)的最小公倍数。工具
三、取任意值e,条件:①e为整数,② 1<e < l;③e与l互质;(即e与l最大公约数为1)。测试
四、取值d,条件:①e*d % l == 1;②1<d<l;加密
到这一步,密钥生成了,主要的值为:e(公钥),d(密钥),r(取模的除数);spa
加密:密文 =Math.pow(明文,e)%r;code
解密:明文 =Math.pow(密文,d)%r;ip
测试使用的数据比较小,若是太大,部分工具测出的值会出现加密的数据长度问题。console
var p=3,q=11,r=p*q, n=p-1,m=q-1,k,l,e,d; for(let i=Math.min(n,m);i>=1;i--){ if(n%i==0 && m%i==0){ //最大公因数 k = i; //最小公倍数 = 乘积 ÷ 最大公因数 l = n*m/k; break; } } console.log("最小公倍数:"+l);//最小公倍数:10 for(let i=2;i<l;i++){ if(l%i != 0){ e = i;//e与l互质(即最大公约数为1)且1<e<l break; } } var m=l-1; while(m>=2 && m*e%l != 1 ){ m--; } if(m>1){ d = m } console.log("公钥:"+e,"密钥:"+d,"取模除数:"+r)//公钥:3 密钥:7 取模除数:33 var mm = 13; console.log("明文:"+mm); var ll = Math.pow(mm,e)%r; var pp = Math.pow(ll,d)%r; console.log("密文:"+ll,"明文(等于mm):"+pp)//密文:19 明文(等于mm):13 console.log(Math.pow(mm,e))//2197 console.log(Math.pow(ll,d))//893871739