当前位置: 首页 > article >正文

《深入挖掘Python加解密:自定义加密算法的设计与实现》

利用python实现加解密

在正式编写各种加解密前,我们先写个小案例,如下。

封面在文末呦!

基础加解密-源码

# 加密
def encode():
    source01 = '乐茵'

    for c in source01:
        ascii01 = ord(c)
        ascii01 += 1
        print(chr(ascii01), end='')


# 解密
def decode():
    source02 = '乑茶'

    for c in source02:
        ascii01 = ord(c)
        ascii01 -= 1
        print(chr(ascii01), end='')


if __name__ == '__main__':
    # encode()
    decode()

基础加解密-源码解析

这段代码包含两个函数:encode()decode(),以及一个主程序入口

encode() 函数

这个函数的作用是对字符串 "乐茵" 进行加密。加密的方法是将每个字符的 ASCII 码值加 1,然后将新的 ASCII 码值转换回字符。

  1. 定义一个字符串 source01,值为 "乐茵"。

  2. 使用 for 循环遍历 source01 中的每个字符 c

  3. 使用 ord() 函数获取字符 c 的 ASCII 码值,将其赋值给 ascii01

  4. ascii01 的值加 1。

  5. 使用 chr() 函数将新的 ASCII 码值转换回字符,并打印出来。注意这里使用 end='' 参数,使得打印结果不换行。

decode() 函数

这个函数的作用是对字符串 "乑茶" 进行解密。解密的方法是将每个字符的 ASCII 码值减 1,然后将新的 ASCII 码值转换回字符。

  1. 定义一个字符串 source02,值为 "乑茶"。

  2. 使用 for 循环遍历 source02 中的每个字符 c

  3. 使用 ord() 函数获取字符 c 的 ASCII 码值,将其赋值给 ascii01

  4. ascii01 的值减 1。

  5. 使用 chr() 函数将新的 ASCII 码值转换回字符,并打印出来。注意这里使用 end='' 参数,使得打印结果不换行。

主程序入口

在主程序入口中,调用 decode() 函数进行解密操作。如果需要加密,可以取消 encode() 函数前的注释,然后注释掉 decode() 函数的调用。

这段代码的主要作用是演示了一个简单的字符加密和解密方法,即将每个字符的 ASCII 码值加 1 或减 1。这种方法非常简单,但安全性较低,不适用于实际的安全需求。

base64加解密-源码

# base64加密
import base64

# 二进制与十六进制完全等价在计算机中,每四个二进制位等于一个十六进制位

source = 'echo'
print(base64.b64encode(source.encode()))

# base64解密
source = 'ZWNobw=='
print(base64.b64decode(source.encode()))


def decode():
    de_source = 'ZWNobw=='
    print(base64.b64decode(de_source).decode())


# 对文件进行编码
def file_encode():
    with open('文件引用/index.png', 'rb') as file:
        data = file.read()
        print(base64.b64encode(data).decode())


# 对base64还原成文件
def file_decode():
    file_source = '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'
    data = base64.b64decode(file_source)
    with open('文件引用/index_1.png', 'wb') as file:
        file.write(data)


if __name__ == '__main__':
    # file_encode()
    file_decode()

base64加解密-源码解析

这段代码主要演示了如何使用Python的base64库进行编码和解码操作

base64编码部分

import base64

source = 'echo'
print(base64.b64encode(source.encode()))
  1. 导入base64库。

  2. 定义一个字符串source,值为'echo'。

  3. 使用base64.b64encode()函数对字符串进行编码。注意,b64encode需要接收字节类型的数据,所以使用source.encode()将字符串转换为字节。

  4. 打印编码后的结果。

base64解码部分

source = 'ZWNobw=='
print(base64.b64decode(source.encode()))
  1. 定义一个字符串source,值为'ZWNobw==',这是'echo'的base64编码结果。

  2. 使用base64.b64decode()函数对字符串进行解码。同样地,需要先将字符串转换为字节。

  3. 打印解码后的结果。

decode函数

def decode():
    de_source = 'ZWNobw=='
    print(base64.b64decode(de_source).decode())

这个函数与上面的解码部分功能相同,但将解码后的字节数据再转换回字符串并打印。

file_encode函数

def file_encode():
    with open('文件引用/index.png', 'rb') as file:
        data = file.read()
        print(base64.b64encode(data).decode())
  1. 打开一个名为'文件引用/index.png'的文件,并以二进制模式读取。

  2. 读取文件内容到data变量。

  3. 对文件内容进行base64编码,并打印编码后的结果。

file_decode函数

def file_decode():
    file_source = 'iVBORw0KGgoAAAANSUhEUgAA...'
    data = base64.b64decode(file_source)
    with open('文件引用/index_1.png', 'wb') as file:
        file.write(data)
  1. 定义一个字符串file_source,值为一个很长的base64编码字符串(这里省略了部分内容)。

  2. 对该字符串进行base64解码,得到原始的二进制数据。

  3. 打开一个名为'文件引用/index_1.png'的文件,并以二进制模式写入。

  4. 将解码后的二进制数据写入文件。

主程序入口

if __name__ == '__main__':
    # encode()
    decode()
    # file_encode()
    file_decode()

主程序入口部分注释了encode()file_encode()函数,只执行了decode()file_decode()函数。如果需要执行编码操作,可以取消相应函数的注释。

总结:这段代码主要演示了如何使用Python的base64库对字符串和文件进行编码和解码操作。

AES加解密-源码

from Crypto.Cipher import AES
from binascii import b2a_hex
from binascii import a2b_hex
# AES加密
source = 'kfc-v50'
# 第一步,补足16位
# 如果source不足16位的倍数就用空格补足16位
if len(source.encode('utf-8')) % 16:
    add = 16 - (len(source.encode('utf-8')) % 16)
else:
    add = 0
source = source + ('\0' * add)
print(source)

# 第二步,定义密钥
# 定义偏移量,必须是16,24,32位
key = 'today-is-thursday-kfc-permit-v50'.encode()
mode = AES.MODE_CBC
iv = b'1234567890ABCDEF'
cryptos = AES.new(key, mode, iv)
cipher = b2a_hex(cryptos.encrypt(source.encode()))
print(cipher.decode())

# AES解密
# cipher = '加密密文'

key = 'today-is-thursday-kfc-permit-v50'.encode()
mode = AES.MODE_CBC
iv = b'1234567890ABCDEF'
cryptos = AES.new(key, mode, iv)
dest = cryptos.decrypt(a2b_hex(cipher))
print(dest.decode().rstrip('\0'))

AES加解密-源码解析

这段代码使用了Python的pycryptodome库来实现AES加密和解密。以下是对代码的详细分析:

导入模块

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
  • Crypto.Cipher.AES:提供了AES加密算法的实现。

  • binascii.b2a_hexbinascii.a2b_hex:用于在二进制数据和十六进制字符串之间进行转换。

AES加密部分

1. 数据预处理(填充)
source = 'kfc-v50'

if len(source.encode('utf-8')) % 16:
    add = 16 - (len(source.encode('utf-8')) % 16)
else:
    add = 0
source = source + ('\0' * add)
print(source)
  • 目的:确保明文长度是16字节的倍数,因为AES是分组加密算法,要求数据长度必须是块大小(16字节)的倍数。

  • 步骤
    • 计算source字符串的字节长度。

    • 判断是否需要填充(即长度是否为16的倍数)。

    • 如果需要,计算需要填充的字节数,并用\0(空字符)进行填充。

  • 输出:填充后的字符串,例如'kfc-v50\0\0\0\0\0\0\0\0\0'

2. 定义密钥和初始化向量(IV)
key = 'today-is-thursday-kfc-permit-v50'.encode()
mode = AES.MODE_CBC
iv = b'1234567890ABCDEF'
  • 密钥(Key):必须是16、24或32字节长。这里使用的是32字节(256位)的密钥。

  • 模式(Mode):使用CBC(Cipher Block Chaining)模式,这是最常见的AES加密模式之一。

  • 初始化向量(IV):16字节长,用于CBC模式中增加加密的随机性。IV应该是随机生成的,但在示例中使用了固定的值。

3. 加密过程
cryptos = AES.new(key, mode, iv)
cipher = b2a_hex(cryptos.encrypt(source.encode()))
print(cipher.decode())
  • 创建AES加密对象:使用指定的密钥、模式和IV初始化AES加密器。

  • 加密:将填充后的明文字符串编码为字节并进行加密。

  • 转换:将加密后的二进制数据转换为十六进制字符串,便于显示和存储。

  • 输出:加密后的十六进制字符串,例如'e3b0c44298fc1c14...'

AES解密部分

1. 定义密钥和IV
key = 'today-is-thursday-kfc-permit-v50'.encode()
mode = AES.MODE_CBC
iv = b'1234567890ABCDEF'
  • 解密时使用的密钥、模式和IV必须与加密时完全相同。

2. 解密过程
cryptos = AES.new(key, mode, iv)
dest = cryptos.decrypt(a2b_hex(cipher))
print(dest.decode().rstrip('\0'))
  • 创建AES解密对象:同样使用指定的密钥、模式和IV初始化AES解密器。

  • 解密:将十六进制字符串转换回二进制数据并进行解密。

  • 去除填充:解密后的数据可能包含填充字符\0,使用rstrip('\0')去除这些字符,恢复原始明文。

  • 输出:解密后的原始字符串,例如'kfc-v50'

注意事项

  1. 安全性

    • 固定IV:在实际应用中,IV应该是随机生成的,并且每次加密时都不同。使用固定的IV会降低加密的安全性,特别是在处理大量数据时。

    • 密钥管理:确保密钥的安全存储和管理,避免泄露。

  2. 填充方式

    • 示例中使用了\0进行填充,这种方式简单但不够通用。推荐使用标准的填充方案,如PKCS7填充,以确保兼容性和安全性。

  3. 异常处理

    • 代码中没有包含异常处理机制。在实际应用中,应添加适当的错误处理,以应对可能的异常情况(例如解密失败、数据格式错误等)。

  4. 依赖库

    • 确保安装了pycryptodome库,可以使用以下命令安装:
      pip install pycryptodome
      

总结

这段代码展示了如何使用Python的pycryptodome库进行AES加密和解密操作。通过填充明文、定义密钥和IV、执行加密和解密步骤,实现了对称加密的基本流程。然而,在实际应用中,需要注意提高安全性和健壮性,例如使用随机IV、采用标准填充方案以及添加异常处理。

RSA加解密—源码

from binascii import b2a_hex
from binascii import a2b_hex
import rsa

# 第一步,生成RSA公和私钥
pub, priv = rsa.newkeys(256)
# print(pub, priv)

# 第二步,公钥加密
encrypt = rsa.encrypt('leyinsec'.encode(), pub)
enstr = b2a_hex(encrypt).decode()
# print(enstr)

# 第三步,私钥解密
# decrypt = rsa.decrypt(encrypt, priv)
decrypt = rsa.decrypt(a2b_hex(enstr), priv)
print(decrypt.decode())

RSA加解密—源码解析

这段代码使用了Python的rsa库和binascii库来实现RSA公钥加密和私钥解密的过程

1. 导入库

from binascii import b2a_hex
from binascii import a2b_hex
import rsa
  • binascii库用于在二进制和ASCII编码之间转换数据。

  • rsa库用于实现RSA加密和解密。

2. 生成RSA公钥和私钥

pub, priv = rsa.newkeys(256)
  • 使用rsa.newkeys()函数生成一对RSA公钥和私钥。

  • 参数256表示密钥的长度为256位。这是一个相对较短的密钥长度,对于现代安全标准来说可能不够安全。通常建议使用至少3072位的密钥长度。

3. 公钥加密

encrypt = rsa.encrypt('leyinsec'.encode(), pub)
enstr = b2a_hex(encrypt).decode()
  • 使用公钥pub对字符串'leyinsec'进行加密。注意,rsa.encrypt()函数需要字节类型的输入,所以使用.encode()将字符串转换为字节。

  • 加密后的数据是二进制格式,为了方便显示或存储,使用b2a_hex()函数将其转换为十六进制字符串。

4. 私钥解密

decrypt = rsa.decrypt(a2b_hex(enstr), priv)
print(decrypt.decode())
  • 使用私钥priv对加密后的数据进行解密。由于加密后的数据是以十六进制字符串形式存储的,所以首先使用a2b_hex()函数将其转换回二进制格式。

  • 解密后的数据是字节类型,使用.decode()将其转换回字符串并打印出来。

注意事项

  1. 密钥长度:如上所述,256位的RSA密钥长度相对较短,可能不够安全。建议使用更长的密钥长度,如3072位或更长。

  2. 填充方案:RSA加密通常使用某种填充方案(如PKCS#1 v1.5或OAEP)。在上述代码中,没有明确指定填充方案,因此rsa库可能会使用默认的填充方案。在实际应用中,建议明确指定填充方案以确保安全性。

  3. 错误处理:上述代码没有包含任何错误处理逻辑。在实际应用中,应该添加适当的错误处理来捕获和处理可能发生的异常,如解密失败、无效的输入等。

  4. 安全性:RSA加密虽然强大,但也有其局限性。它主要用于加密小量数据或用于安全地交换对称加密密钥。对于大量数据的加密,通常建议使用对称加密算法,如AES,并使用RSA来安全地交换对称密钥。


http://www.kler.cn/a/459249.html

相关文章:

  • 代码实战:基于InvSR对视频进行超分辨率重建
  • 数据结构考前一天
  • AMP 混合精度训练中的动态缩放机制: grad_scaler.py函数解析( torch._amp_update_scale_)
  • cka考试-02-节点维护
  • 树莓派 Pico RP2040 教程点灯 双核编程案例
  • 【工具推荐】XSS 扫描器-XSStrike
  • 2-200基于Matlab-GUI的SVM和ANN的废弃金属分类、分等级系统
  • 力扣面试题 41 - 魔术索引 C语言解法 二分查找
  • 2024-12-30-g++
  • PawSQL性能巡检平台 (3) - 慢查询采集和优化
  • Python入门系列二-控制结构与函数
  • 在WSL的系统中配置免密和GitHub传输数据(SSH)
  • 自研国产零依赖前端UI框架实战008 用户表单以及随机ID
  • 网络原理(六): UDP 协议
  • nacos-gateway动态路由
  • Java工具类Arrays
  • GPIO相关寄存器,点灯
  • 一次 MySQL IF 函数的误用导致的生产小事故
  • linux上虚拟机显示网络不可用的解决方法
  • 建立一个Macos载入image的实例含界面
  • docker 部署mysql8
  • MySQL如何执行.sql 文件:详细教学指南
  • 今日总结 2024-12-30
  • LeetCode热题100-两数之和【JavaScript讲解】
  • 信息系统常见的系统架构
  • 老鑫网络安全培训课程收费多少钱