RSA是一種非對稱的加密方式。
該算法需要有兩個密鑰:其中一個爲公鑰,另一個是私鑰。公鑰私鑰都可以用來加密明文。具體說明可以查看這個:
私鑰和公鑰到底是誰來加密,誰來解密?
前端採用JSEncrypt庫來加密:該庫似乎只支持公鑰加密,私鑰解密:
通過官網的demo加密一段短文本的文本是沒有問題的,能順利得到一段base64的密文,
後臺java接到這個密文也順利解開了。
但是超過了117位的長字符加密時,前臺報錯了:
百度後發現原來RSA只能最多加密117位長度字符,解密最多128位字符;
解決的方式就是通過把加密的長明文分割爲多個117的明文,然後再進行分別加密,再拼接輸出密文。
/*
* 解決超長字符的分節加密,117位
*/
JSEncrypt.prototype.encryptLong = function(string) {
var k = this.getKey();
// var maxLength = (((k.n.bitLength()+7)>>3)-11);
var maxLength = 117;
try {
var lt = "";
var ct = "";
if (string.length > maxLength) {
lt = string.match(/.{1,117}/g);
lt.forEach(function(entry) {
var t1 = k.encrypt(entry);
ct += t1 ;
});
return ct;
}
/* var t = k.encrypt(string);
var y = t;
return y;*/
}
catch (ex) {
return false;
}
};
解密需要通過分割密文爲128位
上邊的加密代碼對不含中文的明文加密,已實驗,可以直接用。下文鏈接中的方法二對明文考慮到了中文,但是沒有實驗是否能行。
代碼參見:
加密後的編碼是base64,直接傳輸到後臺,可能有些符號會出問題,比如+ 傳輸前需要轉爲%2b