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

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

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

關(guān)于python Crypto的知識(shí)整理

冬至配餃子 ? 來源:繆斯之子 ? 作者:肖新苗 ? 2022-08-19 18:02 ? 次閱讀

由來

做爬蟲逆向的時(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í) = 原始字符串長度 - 補(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)

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è)例子

代碼很簡單, 不需要過多的解釋

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)
vkey=5DD8A1F1C4657D16EE8F61CEA9D4FEDF5195B3F0404A4104E6877F4D61D6DF3F02B8EA021782BFF03319989D91AF586088584D8DB58C6908C6B83C02137CE54CB3F09873AC784EFB2D24A2A4D041757D7E753A5523BB08AC010E33F4DD1F8A16F8266900BA457AF5223DB94A6187A6280CEA7CCA4BF76EDC&QQ=335583&From=www.nxflv.com'
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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    567

    瀏覽量

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

    關(guān)注

    0

    文章

    210

    瀏覽量

    25514
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4759

    瀏覽量

    84296
  • 加密解密
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    2630
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何用python控制usb2any?

    我想用python控制usb2any,在網(wǎng)上搜索后得到的關(guān)于usb2any的資料很少,是否有官方的usb2any函數(shù)庫?
    發(fā)表于 09-27 06:44

    關(guān)于labview調(diào)用python問題

    大哥們,請(qǐng)教一下,為啥我用labview調(diào)用python寫好的功能,但無法輸入?yún)?shù) ?
    發(fā)表于 05-08 11:48

    CRYPTO SHA256和CRC不起作用,總是返回0的原因?

    正在使用 PSOC4 開發(fā)板 (CY8KIT-149),嘗試讓 SHA256 和 CRC 加密功能正常運(yùn)行。 這兩個(gè)函數(shù)都會(huì)持續(xù)返回 0。Cy_Crypto_Enable (CRYPTO) 成功了
    發(fā)表于 01-30 07:04

    如何解決Python爬蟲中文亂碼問題?Python爬蟲中文亂碼的解決方法

    Python爬蟲中文亂碼問題。 一、了解字符編碼 在解決亂碼問題之前,我們首先需要了解一些基本的字符編碼知識(shí)。常見的字符編碼有ASCII、UTF-8和GBK等。 1. ASCII:是一種用于表示英文字母、數(shù)字和常用符號(hào)的字符編碼,它使用一個(gè)字節(jié)(8位)來表示一個(gè)字符。
    的頭像 發(fā)表于 01-12 15:11 ?1871次閱讀

    信號(hào)、系統(tǒng)和數(shù)字信號(hào)處理知識(shí)整理

    信號(hào)、系統(tǒng)和數(shù)字信號(hào)處理知識(shí)整理
    發(fā)表于 12-08 10:47 ?500次閱讀
    信號(hào)、系統(tǒng)和數(shù)字信號(hào)處理<b class='flag-5'>知識(shí)</b><b class='flag-5'>整理</b>

    python語言特點(diǎn)有哪些

    Python是一種高級(jí)編程語言,由Guido van Rossum于1991年首次發(fā)布。它具有許多獨(dú)特的特點(diǎn),這些特點(diǎn)使得Python在軟件開發(fā)領(lǐng)域變得非常流行。以下是關(guān)于Python
    的頭像 發(fā)表于 11-29 14:29 ?964次閱讀

    Python2與Python3的差異

    Python2與Python3是兩個(gè)不同的版本,它們?cè)谡Z法、功能和性能等方面存在一些差異。下面是對(duì)Python2和Python3的詳盡、詳實(shí)、細(xì)致的比較,分為以下幾個(gè)方面: 語法差異:
    的頭像 發(fā)表于 11-23 16:48 ?824次閱讀

    python如何導(dǎo)入模塊

    。本文將詳細(xì)介紹Python中模塊導(dǎo)入的相關(guān)知識(shí),并舉例演示常見的導(dǎo)入方式和用法。 首先,我們需要明確一些基本的概念。Python 的模塊可以分為兩種類型:內(nèi)置模塊和第三方模塊。內(nèi)置模塊是Py
    的頭像 發(fā)表于 11-22 14:46 ?849次閱讀

    關(guān)于貼片電阻的知識(shí)總結(jié)(1)

    關(guān)于電阻,相信小伙伴們已經(jīng)熟知,像貼片電阻,可調(diào)電阻,插件電阻等等;接下來分享我自己工作中常用的貼片電阻應(yīng)用知識(shí)和教訓(xùn)。
    的頭像 發(fā)表于 11-21 11:34 ?2201次閱讀
    <b class='flag-5'>關(guān)于</b>貼片電阻的<b class='flag-5'>知識(shí)</b>總結(jié)(1)

    Python中元類的作用

    1.什么是類 在理解元類之前,我們必須先掌握Python中的類(class)。 和大多數(shù)語言一樣,Python中的類知識(shí)用來描述如何“生成一個(gè)對(duì)象”: 但是,在Python中,類不僅能
    的頭像 發(fā)表于 11-02 11:18 ?455次閱讀
    <b class='flag-5'>Python</b>中元類的作用

    如何一鍵自動(dòng)整理文件

    Python 編程的最好搭檔—VSCode 詳細(xì)指南 。 你只需要修改源代碼主程序中調(diào)用 auto_organize函數(shù)的參數(shù)即可完成對(duì)對(duì)應(yīng)文件夾的整理,比如我想整理
    的頭像 發(fā)表于 10-31 16:26 ?527次閱讀
    如何一鍵自動(dòng)<b class='flag-5'>整理</b>文件

    關(guān)于TCP/IP協(xié)議的知識(shí)總結(jié)

    今天浩道跟大家分享關(guān)于TCP/IP協(xié)議的硬核干貨總結(jié),我常常跟小伙伴說,一個(gè)簡短硬核的知識(shí)總結(jié),可以讓大家快速掌握這些知識(shí)體系,喜歡的小伙伴可以收藏起來,隨時(shí)查看復(fù)習(xí)!
    的頭像 發(fā)表于 10-31 11:48 ?1162次閱讀
    <b class='flag-5'>關(guān)于</b>TCP/IP協(xié)議的<b class='flag-5'>知識(shí)</b>總結(jié)

    Newspaper:能下載38種語言新聞文章的 Python 模塊

    Newspaper 是一個(gè)很棒的python庫,用于提取和整理文章。 它有以下的優(yōu)點(diǎn): 多線程文章下載框架 識(shí)別新聞網(wǎng)址 從html提取文本 從html提取頂部圖像 從html提取所有圖像 從文本
    的頭像 發(fā)表于 10-31 11:09 ?388次閱讀

    線性回歸模型的基礎(chǔ)知識(shí)

    我準(zhǔn)備使用scikit-learn給大家介紹一些模型的基礎(chǔ)知識(shí),今天就來講講 線性回歸模型 。 1.準(zhǔn)備 開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒有,可以訪問這篇文章: 超
    的頭像 發(fā)表于 10-31 10:54 ?488次閱讀
    線性回歸模型的基礎(chǔ)<b class='flag-5'>知識(shí)</b>

    Newspaper:用于提取和整理文章的python

    Newspaper 是一個(gè)很棒的python庫,用于提取和整理文章。 它有以下的優(yōu)點(diǎn): 多線程文章下載框架 識(shí)別新聞網(wǎng)址 從html提取文本 從html提取頂部圖像 從html提取所有圖像 從文本
    的頭像 發(fā)表于 10-30 14:24 ?644次閱讀