chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么要PKCS7填充?如何獲取真實(shí)字符串?

冬至配餃子 ? 來(lái)源:繆斯之子 ? 作者:肖新苗 ? 2022-08-23 11:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

由來(lái)

做爬蟲逆向的時(shí)候, 經(jīng)常要用到加密解密

目錄

pkcs7填充: pad和unpad

crypto: 一個(gè)共同方法 + 一個(gè)例子

pkcs7填充: pad和unpad

1. 為什么要PKCS7填充?

因?yàn)镻KCS7是當(dāng)下各大加密算法都遵循的數(shù)據(jù)填充算法

2. 基礎(chǔ)

1個(gè)字節(jié)有8位, 所以16個(gè)字節(jié)是128位, 比如: 一個(gè)字母A就是一個(gè)字節(jié)

16進(jìn)制: 0-9, a,b,c,d,e,f, 其中a代表10,后面依次加1, 滿16進(jìn)一,所以 15對(duì)應(yīng)\x0f,16對(duì)應(yīng)\x10

轉(zhuǎn)換:

int -> unicode: chr(1) 結(jié)果是 \x01

unicode -> int: ord('\x11')值為17

3. pkcs7補(bǔ)位規(guī)則

補(bǔ)位的個(gè)數(shù): 不足16位字節(jié)的倍數(shù),補(bǔ)足變成16位的倍數(shù),如果剛好是16的倍數(shù), 補(bǔ)16個(gè)字節(jié)

補(bǔ)位的值: 等于補(bǔ)位個(gè)數(shù)的unicode碼, 比如:content有7位,那么補(bǔ)充9個(gè)字節(jié),每個(gè)字節(jié)的值都是\x09

4. 如何獲取真實(shí)字符串?

直接獲取字符串的最后一個(gè)字符,轉(zhuǎn)換為int即為補(bǔ)位的數(shù), 然后,真實(shí) = 原始字符串長(zhǎng)度 - 補(bǔ)位的數(shù)

def pad(content: str, block_size: int = 16) -> str:
p_len = block_size - len(content) % block_size
p = p_len * chr(p_len)
return content + p

def unpad(content: str) -> str:
last_char = ord(content[-1])
# 獲取真實(shí)字符串,去掉最后補(bǔ)位的數(shù)據(jù)
return content[:-last_char]

def test_pad():
# 計(jì)算字符數(shù)
assert 3 == len('11中'), 'pad china error'
assert 4 == len('abcd'), 'pad china error'

p1 = pad('1')
assert '1\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' == p1, 'pad 1 error'

b = r'1\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f'
assert f"''" == repr(p1), 'pad 1 1 error'

p2 = pad('11')
assert '11\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e' == p2, 'pad 2 error'

p15 = pad('111111111122222')
assert '111111111122222\x01' == p15, 'pad 15 error'

p16 = pad('1111111111222222')
assert '1111111111222222\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10' == p16, 'pad 16 error'


def test_unpad():
p1 = '1\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f'
assert '1' == unpad(p1)

p2 = '11\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e'
assert '11' == unpad(p2)

p15 = '111111111122222\x01'
assert '111111111122222' == unpad(p15)

p16 = '1111111111222222\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10'
assert '1111111111222222' == unpad(p16)

crypto: 一個(gè)共同方法 + 一個(gè)例子

代碼很簡(jiǎn)單, 不需要過多的解釋

from base64 import b64decode, b64encode
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

class CryptoR():

def __init__(self, key: str, iv: str):
self.aes = AES.new(key.encode('utf8'), AES.MODE_CBC, iv.encode('utf8'))

def encrypto(self, text: str) -> str:
p = pad(text.encode('utf8'), AES.block_size)
return b64encode(self.aes.encrypt(p)).decode('utf8')

def decrypto(self, text: str) -> str:
d = self.aes.decrypt(b64decode(text))
return unpad(d, AES.block_size).decode('utf8')

def call_en():
text = 'm3u8.okjx.cc|057f1eed099f2f7e'
key = 'dvyYRQlnPRCMdQSe'
iv = '057f1eed099f2f7e'
aes = CryptoR(key, iv)
e1 = aes.encrypto(text)
assert e1 == 'ncZvyrJ2IPdKSF2EmvfZAGVrtAj9D8eXnGpjPTV1QTM=', 'encrypto error'

def call_de():
text = 'HCizZLcgJfm1LvajcEBMHChheUySaJgXpuPL+L9BDW4jdd9ds5qCycVwN6SpotDujY/tok+sT2M//AeeKnDk6TrZ0gvFa1szUi8j3xg2TTZXZMW/52wuXhr1vnxrbrz4socZ2twSY1T63NiJx3XAcLe6RXfSmBxuPzstMQ0pDSSDNPT4H5hKYy1wo227zzcnxdAuwo1WTvcdaMIuXBS/9IkbqNFklzikvvdGjJjsVxRLwSd5T6v4I47CUAgVtncxpf3cKlM37lmEWpZwskJKG/IGkJRRy9K2a/tdIMWNu0JbsF0jlyMNT/kT2OS08jsRsGJPxOnpEiFIPgE6UPGUgq7+SaBHvFdSfusdqDTwBHuyXJTZBixolYEnggfr3UfWOtP1pvWR4R7bY2N7XJ7gEf6QMfjbu0YB1V4+2WX5ucy43954EniGFbUw2Zxi35y+OGgkpunPTzccVbGw871RjiU7iNVo+IXvQHgG+0FPjaWUezWYm4YAePohtxJYAqg+1XATcgFOKTUn21QQCDKAuQ=='
key = '0EAE7A71512EC09C'
iv = '675480787382e6f4'
aes = CryptoR(key, iv)
d1 = aes.decrypto(text)
d2 =
assert d1 == d2, 'decrypto error'


def main():
call_en()
call_de()


if __name__ == '__main__':
main()




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    594

    瀏覽量

    23029
  • 加密解密算法
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    1738
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    MD5信息摘要算法實(shí)現(xiàn)一(基于蜂鳥E203協(xié)處理器)

    長(zhǎng)度。 MD5算法填充規(guī)則如下: ①先把輸入的字符串數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制數(shù)據(jù); ②而后通過運(yùn)用多個(gè)“0”和一個(gè)“1”進(jìn)行填充,“1”為結(jié)束標(biāo)志位,需要加在消息的結(jié)束位置,然后填充多個(gè)“0”
    發(fā)表于 10-30 07:18

    LM3466 多 LED 電流平衡器技術(shù)手冊(cè)

    到電源的數(shù)或每個(gè) LED 的正向電壓 字符串。 如果任何 LED 燈在運(yùn)行過程中打開,LM3466 會(huì)自動(dòng)平衡通過所有剩余活動(dòng) LED 燈的電源電流。 如 因此,即使一些 LED
    的頭像 發(fā)表于 08-29 14:27 ?833次閱讀
    LM3466 多<b class='flag-5'>串</b> LED 電流平衡器技術(shù)手冊(cè)

    labview如何生成一個(gè)帶字符串返回的dll

    labview如何生成一個(gè)dll,如下圖,要求一個(gè)輸入,類型是字符串,返回類型也是字符串
    發(fā)表于 08-28 23:20

    在Python中字符串逆序有幾種方式,代碼是什么

    對(duì)于一個(gè)給定的字符串,逆序輸出,這個(gè)任務(wù)對(duì)于python來(lái)說(shuō)是一種很簡(jiǎn)單的操作,畢竟強(qiáng)大的列表和字符串處理的一些列函數(shù)足以應(yīng)付這些問題 了,今天總結(jié)了一下python中對(duì)于字符串的逆序輸出的幾種常用
    的頭像 發(fā)表于 08-28 14:44 ?756次閱讀

    harmony-utils之StrUtil,字符串工具類

    harmony-utils之StrUtil,字符串工具類 harmony-utils 簡(jiǎn)介與說(shuō)明 [harmony-utils] 一款功能豐富且極易上手的HarmonyOS工具庫(kù),借助眾多實(shí)用工具類
    的頭像 發(fā)表于 07-03 11:32 ?359次閱讀

    PLC通過智能網(wǎng)關(guān)實(shí)現(xiàn)HTTP協(xié)議通訊,先取得token后再提交獲取JSON格式的數(shù)據(jù)文件

    如下: 限定字符串的長(zhǎng)度:當(dāng)數(shù)據(jù)類型設(shè)置為字符串即CHAR[n]時(shí),限定字符串的最大字符數(shù),如‘[n=24]’,范圍1~128; 限定小數(shù)的位數(shù): 當(dāng)數(shù)據(jù)類型設(shè)置為浮點(diǎn)數(shù)即REAL/L
    發(fā)表于 06-17 16:07

    STM32C031C6使用的是UART2通訊,通過printf()函數(shù)發(fā)送字符串時(shí),漢字錯(cuò)碼怎么解決?

    使用的是UART2通訊,通過printf()函數(shù)發(fā)送字符串時(shí),漢字錯(cuò)碼(見下圖),應(yīng)該是KEIL哪里沒有設(shè)置好的問題。 啟用了UART2的中斷接收,可以接收到串口調(diào)試助手的數(shù)據(jù),但是緩存區(qū)的指針沒有歸零,下次接收時(shí)緩存區(qū)中的內(nèi)容接續(xù)(如下圖所示),不知道用什么命令來(lái)清除緩存區(qū)(即讓指針歸零)。
    發(fā)表于 03-07 12:30

    請(qǐng)問如何用Verilog實(shí)現(xiàn)將ascaii碼數(shù)值字符串轉(zhuǎn)換成定點(diǎn)數(shù)?

    我需要接收一個(gè)ascaii碼字符串,內(nèi)容是12位有效數(shù)字的數(shù)值,帶小數(shù)。我不知道怎么把小數(shù)部分轉(zhuǎn)換成定點(diǎn)數(shù)。
    發(fā)表于 01-23 21:57

    字符串在數(shù)據(jù)庫(kù)中的存儲(chǔ)方式

    數(shù)據(jù)庫(kù)是現(xiàn)代信息技術(shù)中存儲(chǔ)和管理數(shù)據(jù)的核心組件。字符串作為最常見的數(shù)據(jù)類型之一,在數(shù)據(jù)庫(kù)中的存儲(chǔ)方式對(duì)其性能和可擴(kuò)展性有著重要影響。 數(shù)據(jù)類型 固定長(zhǎng)度字符串 :如CHAR類型,它為每個(gè)字符串分配
    的頭像 發(fā)表于 01-07 15:41 ?1240次閱讀

    字符串在編程中的應(yīng)用實(shí)例

    字符串在編程中有著廣泛的應(yīng)用,它們被用于表示文本數(shù)據(jù)、處理用戶輸入、構(gòu)建動(dòng)態(tài)內(nèi)容等。以下是一些字符串在編程中的應(yīng)用實(shí)例: 1. 用戶輸入與輸出 用戶輸入 :程序通常需要從用戶那里獲取輸入,這些輸入通
    的頭像 發(fā)表于 01-07 15:33 ?1105次閱讀

    字符串字符數(shù)組的區(qū)別

    在編程語(yǔ)言中,字符串字符數(shù)組是兩種基本的數(shù)據(jù)結(jié)構(gòu),它們都用于存儲(chǔ)和處理文本數(shù)據(jù)。盡管它們?cè)诠δ苌嫌幸欢ǖ闹丿B,但在內(nèi)部表示、操作方式和使用場(chǎng)景上存在顯著差異。 1. 內(nèi)部表示 字符串 字符串
    的頭像 發(fā)表于 01-07 15:29 ?1663次閱讀

    字符串反轉(zhuǎn)的實(shí)現(xiàn)方式

    在編程中,字符串反轉(zhuǎn)是一個(gè)基礎(chǔ)而重要的操作,它涉及到將一個(gè)字符串中的字符順序顛倒過來(lái)。這個(gè)操作在多種編程語(yǔ)言中都有不同的實(shí)現(xiàn)方式,本文將探討幾種常見的字符串反轉(zhuǎn)方法。 1. 遞歸方法
    的頭像 發(fā)表于 01-07 15:27 ?1233次閱讀

    字符串處理方法 字符串轉(zhuǎn)數(shù)字的實(shí)現(xiàn)

    在編程中,將字符串轉(zhuǎn)換為數(shù)字是一個(gè)常見的需求。不同的編程語(yǔ)言有不同的方法來(lái)實(shí)現(xiàn)這一功能。以下是一些常見編程語(yǔ)言中的字符串轉(zhuǎn)數(shù)字的實(shí)現(xiàn)方法: Python 在Python中,可以使用內(nèi)置的 int
    的頭像 發(fā)表于 01-07 15:26 ?1382次閱讀

    養(yǎng)成良好的編程習(xí)慣|堆內(nèi)存初值不一定是0

    ;} 代碼很簡(jiǎn)單,使用 malloc 申請(qǐng)一段堆內(nèi)存,假設(shè)內(nèi)存空間足夠大。 通過 getchar 配合 while 循環(huán),從標(biāo)準(zhǔn)輸入獲取一個(gè)字符串,直到遇到換行符結(jié)束。 最后就是把獲取字符串
    的頭像 發(fā)表于 12-18 09:14 ?568次閱讀

    腳本美化高手之輕松實(shí)現(xiàn)文本顏色和背景定制的酷炫Shell技巧

    ?33[0m Hello World " 輸出效果如下: 它的格式是這樣的: echo -e "?33[字背景顏色;字體顏色m 字符串 ?33[0m" 或者printf "?33[字背景顏色;字體顏色m
    的頭像 發(fā)表于 12-06 10:38 ?1074次閱讀
    腳本美化高手之輕松實(shí)現(xiàn)文本顏色和背景定制的酷炫Shell技巧