【Python】密码相关基础

一、base64编码算法

Base64编码采用一个包含64个字符的字符集,其中包括大写字母A-Z、小写字母a-z、数字0-9以及符号"+"和"/"。这种编码方式能够把不容易传输或存储的二进制数据转换成可见字符格式,便于在不同的系统和应用之间传递。Base64编码首先将原始数据的二进制位分成六个一组(每组称为一个“六位组”),每组映射到Base64字符集中的一个字符。

1.导入base64模块:为了使用Base64编码,首先需要导入Python的base64模块。

2.使用base64.b64encode()方法:该方法接受一个字节串作为参数,返回该字节串的Base64编码版本。

3.使用base64.b64decode()方法:该方法接受一个Base64编码的字节串作为参数,返回原始的字节串。

import base64

# 需要编码的数据
data = "Hello, World!"

# 对数据进行Base64编码
encoded_data = base64.b64encode(data.encode("utf-8"))
print("编码后的数据:", encoded_data)

# 对编码后的数据进行Base64解码
decoded_data = base64.b64decode(encoded_data).decode("utf-8")
print("解码后的数据:", decoded_data)

二、摘要算法 

摘要算法,也称为哈希算法或散列算法,是一种将任意长度的数据转换为固定长度数据串(通常用十六进制字符串表示)的算法。常见的摘要算法包括MD5、SHA。摘要算法的一个典型应用是在验证数据完整性时。例如,在文件传输中,发送方可以先计算文件的摘要,并将该摘要与文件一同发送给接收方。接收方收到文件后,再次计算文件的摘要,并与发送方传送过来的摘要进行比对。如果这两个摘要相同,说明文件在传输过程中未被篡改;如果不同,则说明文件可能已损坏或被恶意修改。

1.导入hashlib模块。

2.根据需要选择相应的算法(如MD5、SHA1等),创建一个hash对象。

3.使用该对象的update方法输入数据,最后使用hexdigest方法获取摘要。

import hashlib

# 创建MD5对象
md5 = hashlib.md5()
# 输入数据
md5.update('hello world'.encode('utf-8'))
# 获取16进制格式的摘要
digest = md5.hexdigest()
print(digest)


# 创建SHA256对象
sha256 = hashlib.sha256()
# 打开文件
sha256.update('hello world'.encode('utf-8'))
# 获取16进制格式的摘要
digest = sha256.hexdigest()
print(digest)

三、凯撒加密算法

使用凯撒加密的原理,运用位移实现加解密,大小写翻转。

import string

upper_list = string.ascii_uppercase    #生成大写A-Z列表形式
lower_list = string.ascii_lowercase     #生成大写a-z列表形式
#print(upper_list)

#利用凯撒加密右移动5位
def encrypt(source):
    dest = ''
    for c in source:
        #如果是大写的情况
        if c in upper_list:
            index = (upper_list.index(c)+5) % len(upper_list)
            dest += upper_list[index]
        #小写情况
        elif c in lower_list:
            index = (lower_list.index(c)+5) % len(lower_list)
            dest += lower_list[index]
    return dest

#凯撒解密左移5位    FGHIJKLMNOPQRSTUVWXYZABCDE
def decrypt(source):
    dest = ''
    for c in source:
        #大写情况
        if c in upper_list:
            index = (upper_list.index(c)-5)
            dest += upper_list[index]
        elif c in lower_list:
            index = (lower_list.index(c)-5)
            dest += lower_list[index]
    return dest

#大小写互换
def convert(source):
    dest = ''
    for c in source:
        if ord(c) >65 and ord(c) <= 90:
            dest += chr(ord(c)+32)
        elif ord(c) >= 97 and ord(c) <= 122:
            dest += chr(ord(c)-32)
    return dest
if __name__ == '__main__':
    source = 'Hello World'
    en_source = encrypt(source)
    print(en_source)
    de_source = decrypt(en_source)
    print(de_source)
    conv_source = convert(source)
    print(conv_source)

使用凯撒加密的原理,给文件加解密。

import base64

#通过向右位移5位给文件加密
def en_file():
    with open ('./test.jpg',mode='rb') as file:
        data = file.read()
    en_data =''
    bs64_data = ''
    bs64_data = base64.b64encode(data).decode()
    for c in bs64_data:
        en_data = en_data + chr(ord(c)+5)
    with open('./test.jpg.enc', mode='w') as file:
        file.write(en_data)
en_file()
#解密
def de_file(): 
    with open('./test.jpg.enc',mode='rb') as file:
        data = file.read().decode()
    bs64_data =''
    for c in data:
        bs64_data += chr(ord(c)-5)
    de_data = ''
    de_data = base64.b64decode(bs64_data)
    with open('./test1.jpg.', mode='wb') as file:
        file.write(de_data)

de_file()


四、非对称加密RSA

RSA算法是一种非对称加密算法,由罗纳德·李维斯特、阿迪·萨莫尔和伦纳德·阿德曼于1977年提出,被广泛应用于安全通信、数字签名和数据加密等领域,其安全性基于大数分解的困难性。RSA算法的关键特性是使用不同的加密密钥与解密密钥,且根据已知加密密钥推导出解密密钥在计算上不可行。

import rsa

source = 'hello world'
#生成公钥和私钥
pub_key,priv_key = rsa.newkeys(256)
#使用公钥加密
encrypt = rsa.encrypt(source.encode(),pub_key)
print(encrypt)
#私钥解密
decrypt = rsa.decrypt(encrypt,priv_key).decode()
print(decrypt)

五、对称加密AES 

高级加密标准(AES)是一种对称加密算法,广泛应用于数据加密,提供高安全性和快速处理能力。它通过多轮的置换-置换网络(SPN)结构实现加密过程,每一轮包括字节替换、行移位、列混淆和轮密钥加四个步骤。这些步骤共同作用于明文,生成难以破解的密文。支持128位、192位和256位三种长度的密钥,不同长度的密钥对应不同的加密轮数。

from Crypto.Cipher import AES
from binascii import b2a_hex,a2b_hex

source = 'Hello world'
#如果source 分组剩余长度不足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 = 'abc1234567891111'.encode()
#定义模式为CBC
mode = AES.MODE_CBC   
#定义偏移量
iv = b'1234567890ABCDEF'
cryptos = AES.new(key,mode,iv)
cipher = cryptos.encrypt(source.encode())
print(cipher)
#转换成16进制
print(b2a_hex(cipher).decode())

#解密过程
source = '9ab405adf54e1f773c499e48ac6acf81'
key = 'abc1234567891111'.encode()
mode = AES.MODE_CBC   
iv = b'1234567890ABCDEF'
cryptos = AES.new(key,mode,iv)
dest = cryptos.decrypt(a2b_hex(source))
print(dest.decode().strip('\0'))

每篇一言:在不同的遭遇里我发现你的瞬间,有种不可言说的温柔直觉。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cityミ slaves

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值