欢迎光临UUpython
最大、最新、最全的Python代码收集站

加解密算法

程序运行后有几个选项可以选择,然后根据提示输入文本即可获得加/解密结果。
源码仅供参考,由于安全性以及加密算法的复杂度不够,请勿用于专业用途。

from base64 import b64decode,b64encode
import hashlib
from Crypto.Cipher import AES
 
ver = 2.0
numset = 0
 
def code_base64(code, state=1):
    if state == 1:
        try:
            en = b64encode(code.encode('utf-8')).decode("utf-8")
            return en
        except:
            return False
    elif state == 2:
        try:
            de = b64decode(code.encode("utf-8")).decode("utf-8")
            return de
        except:
            return False
    else:
        return None
 
key = {
    "1":"g", "2":"8", "3":"m", "4":"o", "5":"P", "6":"a", "7":"s", "8":"5", "9":"d", "0":"i",
    "a":"f", "b":"h", "c":"b", "d":"k", "e":"j", "f":"c", "g":"e", "h":"n", "i":"1", "j":"2",
    "k":"3", "l":"4", "m":"0", "n":"B", "o":"E", "p":"O", "q":"Q", "r":"R", "s":"U", "t":"Z",
    "u":"T", "v":"M", "w":"q", "x":"X", "y":"z", "z":"A", "A":"p", "B":"r", "C":"l", "D":"u",
    "E":"v", "F":"w", "G":"I", "H":"J", "I":"C", "J":"x", "K":"y", "L":"N", "M":"t", "N":"9",
    "O":"6", "P":"7", "Q":"L", "R":"H", "S":"G", "T":"D", "U":"S", "V":"F", "W":"K", "X":"W",
    "Y":"V", "Z":"Y"
}
 
key_new = {
    "g":"1", "8":"2", "m":"3", "o":"4", "P":"5", "a":"6", "s":"7", "5":"8", "d":"9", "i":"0",
    "f":"a", "h":"b", "b":"c", "k":"d", "j":"e", "c":"f", "e":"g", "n":"h", "1":"i", "2":"j",
    "3":"k", "4":"l", "0":"m", "B":"n", "E":"o", "O":"p", "Q":"q", "R":"r", "U":"s", "Z":"t",
    "T":"u", "M":"v", "q":"w", "X":"x", "z":"y", "A":"z", "p":"A", "r":"B", "l":"C", "u":"D",
    "v":"E", "w":"F", "I":"G", "J":"H", "C":"I", "x":"J", "y":"K", "N":"L", "t":"M", "9":"N",
    "6":"O", "7":"P", "L":"Q", "H":"R", "G":"S", "D":"T", "S":"U", "F":"V", "K":"W", "W":"X",
    "V":"Y", "Y":"Z"
}
 
def set_numset():
    global numset
    numset = int(input("请设置加密字典(默认0,可设置0到无限): "))
    print("加密字典设置成功!")
 
def encrypt():
    global numset
    key = input("请输入加密密钥:") # 新增加密密钥输入
    key = hashlib.sha256(key.encode()).digest() # 对密钥进行哈希处理,得到32字节的密钥
    code = input("请输入要加密的内容: ")
    code = code_base64(code)
    code2 = ""
    for i in code:
        try:
            code2 += key[i + str(numset)]
        except:
            code2 += i
    cipher = AES.new(key, AES.MODE_EAX) # 使用AES算法进行加密,选择EAX模式,可以避免填充问题
    ciphertext, tag = cipher.encrypt_and_digest(code2.encode()) # 加密后得到密文和验证标签
    print(b64encode(cipher.nonce + tag + ciphertext).decode(), "\n") # 将随机数、标签和密文拼接后进行base64编码输出
 
def decrypt():
    global numset
    key = input("请输入解密密钥:") # 新增解密密钥输入
    key = hashlib.sha256(key.encode()).digest() # 对密钥进行哈希处理,得到32字节的密钥
    code = input("请输入要解密的内容: ")
    code = b64decode(code) # 对输入的内容进行base64解码
    nonce = code[:16] # 取出随机数部分
    tag = code[16:32] # 取出验证标签部分
    ciphertext = code[32:] # 取出密文部分
    cipher = AES.new(key, AES.MODE_EAX, nonce=nonce) # 使用AES算法进行解密,选择EAX模式,传入随机数参数
    try:
        data = cipher.decrypt_and_verify(ciphertext, tag) # 解密并验证标签,如果不匹配会抛出异常
        code2 = ""
        for i in data.decode():
            try:
                code2 += key_new[i - numset]
            except:
                code2 += i
        code2 = code_base64(code2, 2)
        print(code2, "\n")
    except:
        print("解密失败,可能是因为密钥错误或者数据被篡改\n")
 
def main():
    while True:
        print("1.加密")
        print("2.解密")
        print("3.加密字典设置")
        print("4.关于")
        print("5.退出")
        try:
            state = int(input("请选择:"))
        except:
            state = 4
        if state == 1:
            encrypt()
        elif state == 2:
            decrypt()
        elif state == 3:
            set_numset()
        elif state == 4:
            print("Tao Yuanhang Encryption and Decryption(TED) version ", ver)
            print("基于base64编码以及一些简易加密算法,程序本身仅供学习使用。")
        elif state == 5:
            break
        else:
            print("错误!")
 
main()
赞(0) 打赏
未经允许不得转载:UUpython » 加解密算法
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!