还有加密串等你来解密,等你来挑战

Posted 小5聊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了还有加密串等你来解密,等你来挑战相关的知识,希望对你有一定的参考价值。

🍦🍦写这篇AES文章也是有件趣事,有位小伙伴发了段密文,看看谁解密速度快,学过Python的小伙伴一下子就解开来了,内容也挺有趣的。
🍟🍟原来加解密也可以这么有趣,虽然看起来很枯燥!

目录

【🍬挑战谁最快解密这个密文🍬】

  • 温馨提示:
选项
AES加密模式CBC
填充pkcs
数据块128位
密码my_python_key_20230220ABC_ComeOn
偏移量python1234567890
输出hex
字符集uft编码(unicode编码)

【加密串:a5e83e3ad027dd2ce1f57a85cfb170f423f569cad3307b7766ea586c9b8c02725f5771664b25c1205f14567f04f906f5095dae85ee241c14fdc188cbe9e6425c3267a10d95b1f6ec63dff96dd519a06e0e6f0ea1c906dd79902cdd57517658d00cd5a5fe93b782582c7968f9b917495af50c7376dc9157fce048db2b72ddcf1deda7f66658fadb50f7cee0b024b2ad0c】

1、认识AES

1.1、全称

Advanced Encryption Standard,高级加密标准

1.2、简介

AES,是一种最常见的对称加密算法。
它的特点是分组加密,每一组是16字节,是目前主流的高级加密算法

1.3、对称加密

对称加密算法使用了相同的密钥进行加密和解密,它的特点就是速度快计算量小,是最常用的加密方式以及各种安全技术应用的基础

1.4、密钥

密钥支持16位和32位,必须正确设置长度,否则会报错。
加密和解密使用的密钥都是相同的,所以在实际使用时,传输肯定是密文,密钥是不允许传输,只有接收方和发送方知道密钥。
如果实在需要把密文也要在网络上传输,那么就需要通过非对称加密方式加密密钥。否则泄露密钥,那密文就毫无保密作用。

1.5、加密函数

设密钥为Key,明文为Plaintext,密文Ciphertext,加密函数名Encryption,函数如下
C=E(K,P)

1.6、解密函数

设密钥为Key,明文为Plaintext,密文Ciphertext,解密函数名Decrypt,函数如下
P=D(K,C)

1.7、非对称加解密

和对称加解密算法相反,它是使用了不同的密钥进行加解密,它的特点就是速度非常慢破解难度大,适合网络上偶尔临时传输。
它常见的算法有RSA、ECC和EIGamal

1.8、简单结构说明

除了第一轮加密,其他轮次都是循环加密
AES支持的长度:128、192、256,AES128/AES192/AES256,特点就是位数长安全性高性能低,反之安全性低性能高。

1.9、加密模式

ECB模式和CBC模式是最常用的两种模式,除了ECB不需要加初始值,其他模式都需要加

编号模式说明
1ECB
Electronic Code Book Mode
常用的模式之一
不需要加偏移量或初始值
2CBC
Cipher Block Chaining Mode
常用的模式之一
需要加偏移量或初始值
3CFB
Cipher Feedback Mode
需要加偏移量或初始值
4OFB
Output Feedback Mode
需要加偏移量或初始值
5CTR
Counter Mode
需要加偏移量或初始值
6PCBC
Propagating Cipher Block Chaining Mode
需要加偏移量或初始值

🏆🏆 原则:Write Less Do More!
🍎🍎简介:一只喜欢全栈方向的程序员,专注基础和实战分享,欢迎咨询,尽绵薄之力答疑解惑!

2、基础信息

2.1、安装模块

安装pycryptodome模块,
由于pycrypto模块为第三方库,已经停止多年不更新和维护了,这个时候pycryptodome模块就来了,它是之前模块的扩展,用法和之前一样。

# 运行如下命令安装
pip install pycryptodome

# 如下方式引用
from Crypto.Cipher import AES

2.2、查看目录

查看Python安装目录,
由于小编这里用的是VS开发工具,默认安装的Python路径为如下目录
具体查看Python版本,可以浏览点击此篇文章【python】基础学习系列之查看版本(1)

C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\Python39_64

2.3、注意点

默认在windows环境下安装,pycryptodome安装的路径如下,
温馨提示,可能在其他环境安装文件夹是小写需要改为大写,正确路径和命名如下,Crypto

2.4、进制转换

1)binascii.b2a_hex
将字符串转为十六进制,得到的字符串是是原数据长度的两倍,如下

  • 引用方式一
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2023-03-09

import binascii

a = 'Python'
print("a字符串值:",a)

# 字符串转为十六进制
b = binascii.b2a_hex(a.encode()) #注意:这里需要转换为编码格式,否则报错
print("b字符串值:",b)

  • 引用方式二
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2023-03-10

from binascii import b2a_hex

a = 'Python'
print("a字符串值:",a)

# 字符串转为十六进制
b = b2a_hex(a.encode()) #注意:这里需要转换为编码格式,否则报错
print("b字符串值:",b)

2)binascii.a2b_hex

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2023-03-10

from binascii import a2b_hex

a = b'507974686f6e'
print("a十六进制串:",a)

# 十六进制转为字符串
c = a2b_hex(a.decode())
print("c字符串值:",c)

3、加解密

3.1、加密代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2023-02-20
 
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
 
code='utf-8'
offset=b'python1234567890'  # 字节
mykey='my_python_key_20230220ABC_ComeOn'
key = mykey.encode(code)
mode = AES.MODE_CBC
 
# 加16位
def addTo16(txt):
    if len(txt.encode(code)) % 16:
        add = 16 - (len(txt.encode(code)) % 16)
    else:
        add = 0
    txt = txt + ('\\0' * add)
    return txt.encode(code)

# 加密数据函数
def encryptData(text):
    # Incorrect AES key length (15 bytes)
    text = addTo16(text)
    cryptos = AES.new(key, mode,offset)
 
    cipher_text = cryptos.encrypt(text)
    return b2a_hex(cipher_text)
 
# 程序入口
if __name__ == '__main__':
    # 加密
    text="My Name is Python"
    encryptStr = encryptData(text)
  
    print("明文字符串:", text)                            
    print("加密串数据:", encryptStr)

3.2、解密代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2023-03-09
 
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
 
code='utf-8'
offset=b'python1234567890'  # 字节
mykey='my_python_key_20230220ABC_ComeOn'    # 支持16位和32位长度
key = mykey.encode(code)
mode = AES.MODE_CBC
 
# 加16位
def addTo16(txt):
    if len(txt.encode(code)) % 16:
        add = 16 - (len(txt.encode(code)) % 16)
    else:
        add = 0
    txt = txt + ('\\0' * add)
    return txt.encode(code)
 
# 解密数据函数
def decryptData(text):
    cryptor = AES.new(key, mode,offset)
    plain_text = cryptor.decrypt(a2b_hex(text))
    return bytes.decode(plain_text).rstrip('\\0')
     
# 程序入口
if __name__ == '__main__':
    # 加密串
    text="06a9c834a3fa7a9774a0e0e319226f7f"
    # 解密串
    decryptStr = decryptData(text)                                 
    print("加密串数据:", text)
    print("解密串数据:", decryptStr)

4、常见情况

1)使用16位长度密钥解析32位长度密文会报错,提示如下
‘utf-8’ codec can’t decode byte 0x82 in position 2: invalid
“utf-8”编解码器无法解码位置2中的字节0x82:无效

2)使用不正确长度密钥,提示如下
Incorrect AES key length (19 bytes)
AES密钥长度不正确(19字节),正确长度是16和32

5、一图总结

6、推荐阅读

编号文章标题
1【Python】输入一个整数n,1<=n<=10,输出一个n层的特定三角形
2【华为OD机试题】字符串消消乐
3【Python】使用bs4的
4【Python】输入一段字母字符串
5【Python】编写代码实现指定下标值顺序进行正序和倒序排序算法编程

【挑战谁最快解密这个密文:a5e83e3ad027dd2ce1f57a85cfb170f45d5ce9f8e29dfb18c6fbaab26ee56e980c8da839cb63fd9620107bd19b9cb8336ebc43052aad19784ceb8e32839a9ecfb1f12730541f40e58aab9017b2fdec1e1bcb17e8de4a417323f56ffc50e0d13c3651b032bbcf1fe1294142f76b322652381f86fa0d60069ccfda5cc720270f2199f2e1cfed559c9766d580fba2386a8a2873c82ee752befbea04c66e8b8574653e611ee7d423b409ea238448639a17d1f4bec72dde1f2cc6a6b1a6c627700a28】

🍹🍹不管多忙,都要抽出时间来写博客,沉淀一些经验和感受!欢迎小伙伴交流学习,技术碰撞,也欢迎小伙伴加入小5的个人圈,分享个人十年经验和答疑解惑!
学习Python也有一年多了,个人的学习方式比较注重实在,因为有C#语言的基础,所以很多原理以及解题思路都是想通的!

以上是关于还有加密串等你来解密,等你来挑战的主要内容,如果未能解决你的问题,请参考以下文章

Weex Workshop 挑战赛,等你来战!

无挑战,不 Geek!TiDB 性能挑战赛等你来战

Weex Workshop 挑战赛,等你来战!

大奖等你来拿!HMS Core线上Codelabs挑战赛第二期开始

大奖等你来拿!HMS Core线上Codelabs挑战赛第二期开始

Weex Workshop 挑战赛,等你来战!