rsa加解密字串

2021-10-09 05:27:43 字數 3061 閱讀 2127

之前在做專案時,客戶提了個需求說是對前後臺互動進行加密傳輸,我們給的解決方案是前端進行加密後將加密資料傳輸給後台,然後後台根據對應的金鑰進行解密,當時選擇的演算法是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 解密方法為加密的逆過程。輸入輸入一串要加密的密...