加密算法在各個網站運用很平常,今天整理代碼的時候看到了我們項目中運用了RSA加密,就了解了一下。
先簡單說一下RSA加密算法原理,RSA算法基於一個十分簡單的數論事實:將兩個大質數相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
RSA的算法涉及三個參數,n、e1、e2。
其中,
n是兩個大質數p、
q的積,n的二進制表示時所占用的位數,就是所謂的密鑰長度。
e1和e2是一對相關的值,e1可以任意取,但要求e1與(p-1)*(q-1)互質;再選擇e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n,e1),(n,e2)就是密鑰對。其中
(n,e1)為公鑰,
(n,e2)為私鑰。
RSAPublicKey rsap; rsap = (RSAPublicKey) RSAUtil.getKeyPair().getPublic(); //模 String module = rsap.getModulus().toString(16); //公鑰指數 String empoent = rsap.getPublicExponent().toString(16); request.setAttribute("m", module); request.setAttribute("e", empoent);
這是java代碼,簡單來說就是將模和公鑰指數傳回到前台頁面上,按我的理解module就是上面所說的n,empoent也就是上面說的e1。
接着是Javascript的處理,先引入3個js文件RSA.js,BigInt.js,Barrett.js(網上可以隨便找到)
function doEncrypt(){ var result = $("#password").val(); setMaxDigits(130); //3個參數,分別是公鑰指數,私鑰指數,module (一般module是1024位的長度,私鑰肯定是不會傳到前台的)
key = new RSAKeyPair("12345","","12a3d32ad");
//生成密文 result = encryptedString(key, encodeURIComponent(result)); $("#encrypt").attr("value", 1); $("#pwd").attr("value", result); }
之后就把生成的公鑰生成的公鑰傳回去就行了。
RSAUtils.decryptByPrivateKey(mi, priKey);
然后把傳回去的密文通過私鑰進行解密就行了,大致過程就是這樣。
PS:本人是以登錄作為例子進行講解的。