0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(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)

做爬蟲(chóng)逆向的時(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)單, 不需要過(guò)多的解釋

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

    關(guān)注

    1

    文章

    566

    瀏覽量

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

    關(guān)注

    0

    文章

    6

    瀏覽量

    1602
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    labview字符串如何轉(zhuǎn)換為16進(jìn)制字符串

    在LabVIEW中,將字符串轉(zhuǎn)換為16進(jìn)制字符串是一個(gè)常見(jiàn)的需求,尤其是在處理數(shù)據(jù)通信和硬件接口時(shí)。LabVIEW提供了多種方法來(lái)實(shí)現(xiàn)這一轉(zhuǎn)換,包括使用內(nèi)置函數(shù)、編寫(xiě)VI(Virtual
    的頭像 發(fā)表于 09-04 15:54 ?442次閱讀

    labview中常用的字符串函數(shù)有哪些?

    在LabVIEW中,常用的字符串函數(shù)廣泛覆蓋了對(duì)字符串的各種操作,包括但不限于格式化、搜索、替換、連接、計(jì)算長(zhǎng)度等。以下是一些常用的字符串函數(shù)及其簡(jiǎn)要說(shuō)明: 字符串長(zhǎng)度(String
    的頭像 發(fā)表于 09-04 15:43 ?152次閱讀

    labview字符串的四種表示各有什么特點(diǎn)

    。在LabVIEW中,字符串是一種基本的數(shù)據(jù)類型,用于表示文本信息。字符串在LabVIEW中有多種表示方式,每種方式都有其特定的應(yīng)用場(chǎng)景和特點(diǎn)。以下是對(duì)LabVIEW中四種字符串表示方式的分析: 1.
    的頭像 發(fā)表于 09-04 15:40 ?140次閱讀

    C語(yǔ)言字符串編譯函數(shù)介紹

    在C語(yǔ)言中,字符串實(shí)際上是使用null字符O'終止的一維字符數(shù)組。因此,一個(gè)以null結(jié)尾的字符串,包含了組成字符串
    的頭像 發(fā)表于 03-07 16:18 ?386次閱讀
    C語(yǔ)言<b class='flag-5'>字符串</b>編譯函數(shù)介紹

    labview掃描字符串怎么用

    LabVIEW 是一種流程化編程語(yǔ)言和開(kāi)發(fā)環(huán)境,主要用于控制、測(cè)量和監(jiān)測(cè)系統(tǒng)。在 LabVIEW 中,掃描字符串是一項(xiàng)常見(jiàn)的任務(wù),它允許用戶按照一定的模式從輸入字符串中提取所需的信息。下面我將詳細(xì)
    的頭像 發(fā)表于 12-29 10:12 ?1509次閱讀

    labview掃描字符串怎么用

    LabVIEW是一種圖形化編程語(yǔ)言,用于開(kāi)發(fā)控制、測(cè)量和監(jiān)控系統(tǒng)。雖然它主要用于工程和科學(xué)領(lǐng)域,但也可以用于處理文本和字符串。 在LabVIEW中,可以使用字符串處理函數(shù)來(lái)掃描字符串。以下是一些常用
    的頭像 發(fā)表于 12-26 16:58 ?1460次閱讀

    labview中怎么對(duì)字符串中的進(jìn)行實(shí)時(shí)處理

    。 字符串操作函數(shù): LabVIEW提供了許多函數(shù)來(lái)對(duì)字符串進(jìn)行操作。這些函數(shù)包括查找、替換、插入、刪除和連接等。使用這些函數(shù),您可以實(shí)時(shí)修改字符串的內(nèi)容。例如,您可以使用"字符串替換
    的頭像 發(fā)表于 12-26 14:12 ?1278次閱讀

    s7-200字符串賦值指令

    S7-200是一款由西門子公司生產(chǎn)的可編程控制器(PLC),被廣泛應(yīng)用于工業(yè)自動(dòng)化領(lǐng)域。在S7-200的指令集中,字符串賦值指令是一項(xiàng)重要的功能,它用于將字符串值賦給指定的變量。本文將
    的頭像 發(fā)表于 12-08 14:44 ?1638次閱讀

    oracle字符串split成多個(gè)

    Oracle是一種廣泛使用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它提供了許多強(qiáng)大的功能和函數(shù),用于處理和操作數(shù)據(jù)。其中之一就是字符串分割(split)方法,該方法用于將一個(gè)字符串按照指定的分隔符分割成多個(gè)子字符串
    的頭像 發(fā)表于 12-06 09:54 ?4219次閱讀

    oracle判斷字符串包含某個(gè)字符

    包含某個(gè)字符,以及介紹使用的相關(guān)函數(shù)。 正文: 一、使用INSTR函數(shù)進(jìn)行判斷: INSTR函數(shù)是Oracle中最常用的字符串函數(shù)之一,它用于查找字符串中是否包含某個(gè)字符。INSTR函
    的頭像 發(fā)表于 12-06 09:53 ?1.2w次閱讀

    字符數(shù)組和字符串有沒(méi)有區(qū)別?

    字符數(shù)組和字符串有沒(méi)有區(qū)別?
    的頭像 發(fā)表于 11-30 16:39 ?489次閱讀

    MySQL替換字符串函數(shù)REPLACE

    MySQL是目前非常流行的開(kāi)源數(shù)據(jù)庫(kù)管理系統(tǒng)之一,它具有強(qiáng)大的功能和性能。其中之一的字符串函數(shù)REPLACE,可以用于替換字符串中的指定字符字符串。在本文中,我們將詳細(xì)討論MySQL
    的頭像 發(fā)表于 11-30 10:44 ?1252次閱讀

    c語(yǔ)言字符串定義

    C語(yǔ)言是一種強(qiáng)大而廣泛使用的編程語(yǔ)言,字符串是其中一個(gè)非常重要的概念。在C語(yǔ)言中,字符串是由一系列字符組成的數(shù)組,它可以表示文本、數(shù)字等各種類型的數(shù)據(jù)。在本文中,我們將詳盡、詳實(shí)、細(xì)致地介紹C語(yǔ)言
    的頭像 發(fā)表于 11-24 10:02 ?1424次閱讀

    字符串如何轉(zhuǎn)換成日期型

    隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,我們經(jīng)常遇到需要處理日期的情況。在編程中,字符串是最常見(jiàn)的日期輸入格式,在許多情況下,我們需要將字符串轉(zhuǎn)換為日期類型以便進(jìn)行日期計(jì)算和比較。本篇文章將詳細(xì)介紹如何使用不
    的頭像 發(fā)表于 11-17 16:27 ?8974次閱讀

    mysql字符串包含某個(gè)字符串

    MySQL是一種開(kāi)源的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),被廣泛用于構(gòu)建Web應(yīng)用程序和其他大型數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用。在進(jìn)行MySQL數(shù)據(jù)庫(kù)查詢時(shí),經(jīng)常需要使用字符串包含操作,即判斷一個(gè)字符串是否包含另一個(gè)字符串。本文
    的頭像 發(fā)表于 11-16 14:52 ?2986次閱讀