天天看點

非對稱加密算法RSA的前背景密文傳輸對接

RSA是一種非對稱的加密方式。

該算法需要有兩個密鑰:其中一個為公鑰,另一個是私鑰。公鑰私鑰都可以用來加密明文。具體說明可以檢視這個:

https://cloud.tencent.com/developer/news/229749

私鑰和公鑰到底是誰來加密,誰來解密?

https://blog.csdn.net/magvwiz/article/details/83719282

前端采用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位

上邊的加密代碼對不含中文的明文加密,已實驗,可以直接用。下文連結中的方法二對明文考慮到了中文,但是沒有實驗是否能行。

代碼參見:

https://www.cnblogs.com/Lrn14616/p/10154529.html

加密後的編碼是base64,直接傳輸到背景,可能有些符号會出問題,比如+ 傳輸前需要轉為%2b

繼續閱讀