密碼算法中,按密鑰的類型分爲:對稱密鑰密碼和非對稱密鑰密碼(其加密解密不是使用的同一個密鑰)。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