python 异或加密 (加密重要信息)

本文介绍了一个使用Python实现的异或加密程序,该程序能够对文本文件进行加密和解密,利用MD5算法生成密码的哈希值,并采用异或运算进行数据保护。此外,文章还提到了RSA加密算法的实现,尽管在当前程序中未被使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python 异或加密

说明:
- 通过密码对文件进行异或加密并存储加密文件
- 首次使用需要对创建account.txt 并设置密码
- rsa 未使用、但可以用
# -*- coding: utf-8 -*-
# time.yu@foxmail.com
# Derek
# 12/16/2018

"""
这是一个对文本进行加密的程序
"""

import os
import time
import rsa
import hashlib


class RSA(object):
    """rsa 加密 解密操作"""
    def __init__(self):
        self.public_key_file_name = 'public.pem'
        self.private_key_file_name = 'private.pem'

        self.is_empty_create_key()

    def is_empty_create_key(self):
        """没有时:创建私钥公钥"""
        for file in [self.public_key_file_name, self.private_key_file_name]:
            if not self.judge_file_exists(file):
                public_key, private_key = self.create_new_key()
                self.operation_file(self.public_key_file_name, 'w', public_key)
                self.operation_file(self.private_key_file_name, 'w', private_key)

    @staticmethod
    def judge_file_exists(file_name):
        """判断文件是否存在"""
        return os.path.exists(file_name)

    @staticmethod
    def rsa_write_file(file_name, inner=None):
        """对文件进行读操作"""
        with open(file_name, 'w')as f:
            f.write(inner.save_pkcs1().decode())

    def read_rsa_public(self):
        with open(self.public_key_file_name, 'r') as f:
            return rsa.PublicKey.load_pkcs1(f.read().encode())

    def read_rsa_private(self):
        with open(self.private_key_file_name, 'r') as f:
            return rsa.PrivateKey.load_pkcs1(f.read().encode())

    @staticmethod
    def create_new_key(number=1024):
        """创建私钥公钥"""
        return rsa.newkeys(number)

    def rsa_encrypt(self, message):
        """rsa 加密"""
        return rsa.encrypt(message.encode(), self.read_rsa_public())

    def rsa_decrypt(self, crypto):
        """rsa 解密"""
        return rsa.decrypt(crypto, self.read_rsa_private()).decode()


class StrNumber(object):
    """异或加密"""
    def __init__(self, text=None, password=None):
        self.text = text
        self.password = self.get_md5(password)

    @staticmethod
    def get_md5(md5str):
        """对字符 md5"""
        # 生成一个md5对象
        m1 = hashlib.md5()

        # 使用md5对象里的update方法md5转换
        m1.update(md5str.encode("utf-8"))
        token = m1.hexdigest()
        return token

    def text_2_number(self, text=None):
        """字符转数字字符"""
        if not text:
            text = self.text
        number_str = ''
        for i in text:
            s = str(ord(i))
            number_str += '0' * (7 - len(s)) + s
        return number_str

    @staticmethod
    def number_2_text(number_str):
        """数字转字符"""
        number_str = str(number_str)
        text_list = []
        y = len(number_str) % 7
        if y:
            number_str = '0' * (7-y) + number_str

        for i in range(0, len(number_str), 7):
            text_list.append(chr(int(number_str[i: i+7])))
        return "".join(text_list)

    def encrypt(self):
        """加密"""
        a = int(self.text_2_number(self.text))
        b = int(self.text_2_number(self.password))
        d = int(len(str(a)) / len(str(b)))
        if d:
            b = int(str(b) * d)

        return str(a ^ b)

    def decrypt(self, number_str):
        """解密"""
        a = int(self.text_2_number(self.password))
        b = int(len(number_str) / len(str(a)))
        if b:
            a = str(a) * b
        n = int(number_str) ^ int(a)
        return self.number_2_text(n)


def get_password():
    """获取密码"""
    password1 = input("please enter password1:")
    password2 = input("please enter password2:")
    password3 = input("please enter password3:")

    n = StrNumber(password1, password2)
    text = n.encrypt()

    n = StrNumber(text, password3)
    return n.encrypt()


def _encrypt(password, text=None):
    """加密"""
    if not text:
        with open('account.txt', 'r')as f:
            text = f.read()

    n = StrNumber(text, password)
    text = n.encrypt()

    with open('encryption_account', 'w')as f:
        f.write(text)


def _decrypt(password):
    """解密"""
    with open('encryption_account', 'r')as f:
        text = f.read()

    n = StrNumber(None, password)
    text = n.decrypt(text)

    return text


def main():
    """启动函数"""
    print('='*20)
    print("说明:")
    print('对文件:account.txt 加密')
    print('加密后存储到: encryption_account')
    print('='*20)
    password = get_password()
    while True:
        print('=' * 20)
        print('请选择: 1:加密, 2:查看解密后的内容, 3:添加内容, 4:解密并存储到account.txt, q:退出')
        result = input('请输入:')
        if '1' == result:
            _encrypt(password)
        elif '2' == result:
            print()
            print('内容:')
            print('=' * 20)
            print(_decrypt(password))
            print('=' * 20)
            print()

        elif '3' == result:
            text = _decrypt(password)
            text += '\n{}'.format(input('请输入添加内容:'))
            _encrypt(password, text)
        elif '4' == result:
            text = _decrypt(password)
            with open('account.txt', 'w')as f:
                f.write(text)
        elif 'q' == result:
            print('欢迎使用。已退出')
            exit(1)
        else:
            print('输入错误请重新输入')

        time.sleep(1)


def rsa_main():
    """rsa 的操作"""
    r = RSA()
    a = r.rsa_encrypt('123456')
    with open('encryption_account', 'wb')as f:
        f.write(a)

    with open('encryption_account', 'rb')as f:
        b = f.read()
    print('加密后的内容:', b)
    print('解密:', r.rsa_decrypt(b))


if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值