0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于python Crypto的知识整理

冬至配饺子 来源:缪斯之子 作者:肖新苗 2022-08-19 18:02 次阅读

由来

做爬虫逆向的时候, 经常要用到加密解密

目录

pkcs7填充: pad和unpad

crypto: 一个共同方法 + 一个例子

pkcs7填充:pad和unpad

1. 为什么要PKCS7填充?

因为PKCS7是当下各大加密算法都遵循的数据填充算法

2.基础

1个字节有8位, 所以16个字节是128位, 比如: 一个字母A就是一个字节

16进制: 0-9, a,b,c,d,e,f, 其中a代表10,后面依次加1, 满16进一,所以 15对应\x0f,16对应\x10

转换:

int -> unicode: chr(1) 结果是 \x01

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

3. pkcs7补位规则

补位的个数: 不足16位字节的倍数,补足变成16位的倍数,如果刚好是16的倍数, 补16个字节

补位的值: 等于补位个数的unicode码, 比如:content有7位,那么补充9个字节,每个字节的值都是\x09

4. 如何获取真实字符串?

直接获取字符串的最后一个字符,转换为int即为补位的数, 然后,真实 = 原始字符串长度 - 补位的数


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])
# 获取真实字符串,去掉最后补位的数据
return content[:-last_char]


def test_pad():
# 计算字符数
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"'{b}'" == 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])    # 获取真实字符串,去掉最后补位的数据    return content[:-last_char]

def test_pad():    # 计算字符数    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"'{b}'" == 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: 一个共同方法 + 一个例子

代码很简单, 不需要过多的解释

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()


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符串
    +关注

    关注

    1

    文章

    578

    浏览量

    20509
  • 加密算法
    +关注

    关注

    0

    文章

    215

    浏览量

    25547
  • python
    +关注

    关注

    56

    文章

    4795

    浏览量

    84646
  • 加密解密
    +关注

    关注

    0

    文章

    9

    浏览量

    2636
收藏 人收藏

    评论

    相关推荐

    4G模组Air780E的LuatOS开发:关于通用加解密函数(crypto)教程!

    本次我将讲解低功耗4G模组Air780E的LuatOS开发,关于通用加解密函数(crypto)教程分享给大家。我会从加解密概述、演示功能概述、硬件准备、软件环境、API 说明等全面讲述…
    的头像 发表于 12-01 15:50 199次阅读
    4G模组Air780E的LuatOS开发:<b class='flag-5'>关于</b>通用加解密函数(<b class='flag-5'>crypto</b>)教程!

    关于4G模组LuatOS开发:通用加解密函数(crypto)|全攻略

    本次我要说的攻略是关于4G模组LuatOS开发的通用加解密函数,我以我常用的Air780E模组为例子供大家参考。
    的头像 发表于 11-30 09:52 245次阅读
    <b class='flag-5'>关于</b>4G模组LuatOS开发:通用加解密函数(<b class='flag-5'>crypto</b>)|全攻略

    如何用python控制usb2any?

    我想用python控制usb2any,在网上搜索后得到的关于usb2any的资料很少,是否有官方的usb2any函数库?
    发表于 11-08 14:36

    使用Python进行图像处理

    下面是一个关于使用Python在几行代码中分析城市轮廓线的快速教程。
    的头像 发表于 11-07 10:14 212次阅读
    使用<b class='flag-5'>Python</b>进行图像处理

    关于反应热报告我们应该了解的知识

    。本文简单梳理国内化工领域热风险评估的演进历程,以及对反应热报告中的关键知识点进行了整理,以期为业内人士在开展 HAZOP (危险和可操作性分析)等工作时,能够更准确地理解和应用反应热分析报告,从而促进行业内的知识共享和
    的头像 发表于 10-21 13:45 720次阅读
    <b class='flag-5'>关于</b>反应热报告我们应该了解的<b class='flag-5'>知识</b>

    如何用python控制usb2any?

    我想用python控制usb2any,在网上搜索后得到的关于usb2any的资料很少,是否有官方的usb2any函数库?
    发表于 09-27 06:44

    pytorch和python的关系是什么

    在当今的人工智能领域,Python已经成为了最受欢迎的编程语言之一。Python的易学易用、丰富的库和框架以及强大的社区支持,使其成为了数据科学、机器学习和深度学习等领域的首选语言。而在深度学习领域
    的头像 发表于 08-01 15:27 1909次阅读

    ubuntu下(python ver 2.7.6)运行python demo_server.py后无反应怎么解决?

    你好,以下是mesh demo中关于如何运行meshdemo的描述 Please follow below steps to run mesh_demo: 1. Set up mesh_demo
    发表于 07-22 08:20

    opencv-python和opencv一样吗

    不一样。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。OpenCV-Python
    的头像 发表于 07-16 10:38 1167次阅读

    关于labview调用python问题

    大哥们,请教一下,为啥我用labview调用python写好的功能,但无法输入参数 ?
    发表于 05-08 11:48

    全志R128 SDK HAL 模块开发指南——Crypto Engine

    Crypto Engine 模块介绍 CE 模块主要支持对称算法、非对称算法、摘要算法进行数据的加密和解密功能。 CE 模块主要支持的算法如下: AES 算法 ECB/CBC/CTR/CTS/OFB
    发表于 03-21 10:44

    收藏!IGBT7系列分立器件核心知识点最全整理

    英飞凌IGBT7单管系列,作为目前炙手可热的光储应用新星产品,正受到众多玩家的追捧。本篇文章特地为大家贴心整理该系列产品的核心知识大全,希望大家买得放心,用得顺手~ 更全型号选择,总有一款适合你
    的头像 发表于 03-13 15:14 473次阅读
    收藏!IGBT7系列分立器件核心<b class='flag-5'>知识</b>点最全<b class='flag-5'>整理</b>!

    IGBT7系列分立器件核心知识点最全整理

    英飞凌IGBT7单管系列,作为目前炙手可热的光储应用新星产品,正受到众多玩家的追捧。本篇文章特地为大家贴心整理该系列产品的核心知识大全,希望大家买得放心,用得顺手~更全型号选择,总有一款适合你
    的头像 发表于 02-23 08:13 520次阅读
    IGBT7系列分立器件核心<b class='flag-5'>知识</b>点最全<b class='flag-5'>整理</b>!

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

    正在使用 PSOC4 开发板 (CY8KIT-149),尝试让 SHA256 和 CRC 加密功能正常运行。 这两个函数都会持续返回 0。Cy_Crypto_Enable (CRYPTO) 成功了
    发表于 01-30 07:04

    如何解决Python爬虫中文乱码问题?Python爬虫中文乱码的解决方法

    Python爬虫中文乱码问题。 一、了解字符编码 在解决乱码问题之前,我们首先需要了解一些基本的字符编码知识。常见的字符编码有ASCII、UTF-8和GBK等。 1. ASCII:是一种用于表示英文字母、数字和常用符号的字符编码,它使用一个字节(8位)来表示一个字符。
    的头像 发表于 01-12 15:11 2355次阅读