之前在做專案時,客戶提了個需求說是對前後臺互動進行加密傳輸,我們給的解決方案是前端進行加密後將加密資料傳輸給後台,然後後台根據對應的金鑰進行解密,當時選擇的演算法是rsa演算法,但是大家都知道rsa演算法加解密是有最大長度限制的,加密的最長字串是117個位元組,解密的最大長度是
define([
'jsencrypt-master',
], function(jsencrypt)
if (i + 1 == h.length)
else if (i + 2 == h.length)
while ((ret.length & 3) > 0)
return ret;
} return function encryptlong (string) else if (c >= 0x000800 && c <= 0x00ffff) else if (c >= 0x000080 && c <= 0x0007ff) else
if ((byteno % 117) >= 114 || (byteno % 117) == 0) }}
//2.擷取字串並分段加密
if (bytes.length > 1) else
var t1 = k.encrypt(str);
ct += t1;
}if (bytes[bytes.length - 1] != string.length - 1)
return hex2b64(ct);
}var t = k.encrypt(string);
var y = hex2b64(t);
return y;
} catch (ex)
};});
後台使用python的內建模組pkcs1_v1_5解密,也是進行了再次封裝,一下**可以支援超長字串解密,我用的是python2.7,使用python3及以上的版本可能會有些許不同哦,大家根藝根據自己的實際情況進行調整,話不多說,貼**
import os呼~終於解決了乙個大難題,親測加解密成功,並且支援中文from crypto.cipher import pkcs1_v1_5
from crypto.publickey import rsa
import base64
# from urllib import parse
# 獲取當前路徑
curr_dir = os.path.dirname(os.path.realpath(__file__))
private_key_file = os.path.join(curr_dir, "my_private_rsa_key.bin") # 私鑰,和前端加密使用的保持一致
public_key_file = os.path.join(curr_dir, "my_rsa_public.pem") # 公鑰,和前端加密使用的保持一致
# 適合加密前明文長度不超過117直接的字串解密
def decrypt_data(inputdata, code="123456"):
# urldecode
# data = parse.unquote(inputdata)
# openssl genrsa - out rsa_1024_priv.pem 1024 生成私鑰
# openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem 生成公鑰
# base64decode
data = base64.b64decode(inputdata)
private_key = rsa.importkey(
open(curr_dir + "/my_private_rsa_key.bin").read(),
passphrase=code
)# 使用 pkcs1_v1_5,不要用 pkcs1_oaep
# 使用 pkcs1_oaep 的話,前端 jsencrypt.js 加密的資料解密不了
cipher_rsa = pkcs1_v1_5.new(private_key)
# 當解密失敗,會返回 sentinel
sentinel = none
ret = cipher_rsa.decrypt(data, sentinel)
return ret
# 適合加密前明文長度不超過117(及密文長度不超過128位元組)直接的字串和明文長度超過117位元組的字串解密
def rsa_decrypt(msg, code="123456"):
"""1024bit的證書用128,2048bit證書用256位
"""private_key = rsa.importkey(
open(curr_dir + "/my_private_rsa_key.bin").read(),
passphrase=code
)cipher = pkcs1_v1_5.new(private_key)
tempdata = base64.b64decode(msg)
# 當解密失敗,會返回 sentinel
sentinel = none
offset = 0
res =
length = len(tempdata)
# 128:rsa演算法加密後並轉成十六進製制的最大密文長度
if length > 128:
while length - offset > 0:
if length - offset > 128:
tempstr = tempdata[offset: offset+128]
else:
tempstr = tempdata[offset:]
# data = base64.b64decode(tempstr)
ret = cipher.decrypt(tempstr, sentinel)
offset += 128
return "".join(res)
else:
ret = cipher.decrypt(tempdata, sentinel)
return ret
字串加解密
題目 1 對輸入的字串進行加解密,並輸出。2加密方法為 當內容是英文本母時則用該英文本母的後乙個字母替換,同時字母變換大小寫,如字母a時則替換為b 字母z時則替換為a 當內容是數字時則把該數字加1,如0替換1,1替換2,9替換0 其他字元不做變化。3 解密方法為加密的逆過程。輸入 輸入一串要加密的密...
字串加解密
題目描述 1 對輸入的字串進行加解密,並輸出。2 加密方法為 當內容是英文本母時則用該英文本母的後乙個字母替換,同時字母變換大小寫,如字母a時則替換為b 字母z時則替換為a 當內容是數字時則把該數字加1,如0替換1,1替換2,9替換0 其他字元不做變化。3 解密方法為加密的逆過程。介面描述 實現介面...
字串加解密
描述 1 對輸入的字串進行加解密,並輸出。2 加密方法為 當內容是英文本母時則用該英文本母的後乙個字母替換,同時字母變換大小寫,如字母a時則替換為b 字母z時則替換為a 當內容是數字時則把該數字加1,如0替換1,1替換2,9替換0 其他字元不做變化。3 解密方法為加密的逆過程。輸入輸入一串要加密的密...