Python はファイルの単純な暗号化と復号化を実装します

目次

1. 基礎知識

2. 暗号化および復号化アルゴリズム

1. ランタイムライブラリをインポートする

2. 鍵生成関数を定義する

3. 暗号化ユニットと復号化ユニットを定義する

4. ファイルを暗号化する

5. ファイルを復号化する

3. テスト


1. 基礎知識

Python の XOR 演算子は ^ であり、XOR としても記録されます。ビット単位の XOR の結果は、値が同じ場合は XOR が 0、値が異なる場合は XOR が 1 になります。合計の状況: 0 ^ 0 = 0 、0 ^ 1 = 1、1 ^ 0 = 1、1 ^ 1 = 0。XOR を使用して、ファイルに対して単純な暗号化および復号化操作を実行できます。

暗号化操作: まずファイルをバイナリ数値に変換し、次にそのバイナリ数値と同じ長さのキーをランダムに生成し、ファイルのバイナリ数値とキーに対して XOR 演算を実行して、暗号化されたバイナリ数値を取得して保存します。暗号化されたファイルとして。

復号化操作: 暗号化されたバイナリ ファイルとキーを XOR して元のバイナリ番号を取得し、元のバイナリ番号をファイルに復元します。

2. 暗号化および復号化アルゴリズム

1. ランタイムライブラリをインポートする

import json
from pathlib import Path
from secrets import token_bytes
import argparse

2. 鍵生成関数を定義する

def random_key(length):
    key = token_bytes(nbytes=length)            #根据指定长度生成随机密钥
    key_int = int.from_bytes(key, 'big')        #将byte转换为int
    return key_int

3. 暗号化ユニットと復号化ユニットを定義する

def encrypt(raw):                                    #加密单元
    raw_bytes = raw.encode()                         #将字符串编码成字节串
    raw_int = int.from_bytes(raw_bytes, 'big')       #将byte转换成int
    key_int = random_key(len(raw_bytes))             #根据长度生成密钥
    return raw_int ^ key_int, key_int         #将密钥与文件异或,返回异或后的结果和密钥

def decrypt(encrypted, key_int):                             #解密单元
    decrypted = encrypted ^ key_int                          #将加密后的文件与密钥异或
    length = (decrypted.bit_length() + 7) // 8               #计算所占比特大小
    decrypted_bytes = int.to_bytes(decrypted, length, 'big') #将int转换回byte
    return decrypted_bytes.decode()                          #解码后返回

4. ファイルを暗号化する

def encrypt_file(path, key_path=None, *, encoding='utf-8'):    #参数path指定文件地址
    path = Path(path)
    cwd = path.cwd() / path.name.split('.')[0]
    path_encrypted = cwd / path.name
    if key_path is None:
        key_path = cwd / 'key'
    if not cwd.exists():
        cwd.mkdir()
        path_encrypted.touch()
        key_path.touch()

    //打开文件并将内容写入
    with path.open('rt', encoding=encoding) as f1, \
            path_encrypted.open('wt', encoding=encoding) as f2, \
            key_path.open('wt', encoding=encoding) as f3:
        encrypted, key = encrypt(f1.read())
        json.dump(encrypted, f2)
        json.dump(key, f3)

5. ファイルを復号化する

def decrypt_file(path_encrypted, key_path=None, *, encoding='utf-8'):
    path_encrypted = Path(path_encrypted)
    cwd = path_encrypted.cwd()
    path_decrypted = cwd / 'decrypted'
    if not path_decrypted.exists():
        path_decrypted.mkdir()
        path_decrypted /= path_encrypted.name
        path_decrypted.touch()
    if key_path is None:
        key_path = cwd / 'key'
    with path_encrypted.open('rt', encoding=encoding) as f1, \
            key_path.open('rt', encoding=encoding) as f2, \
            path_decrypted.open('wt', encoding=encoding) as f3:
        decrypted = decrypt(json.load(f1), json.load(f2))
        f3.write(decrypted)

3. テスト

暗号化するファイルをpyファイルと同じディレクトリに置き、以下を実行して1.txtを暗号化します。

encrypt_file("D:/PyCharm Community Edition 2021.3.2/Workplace/encryption/1.txt")

 復号化するファイルとキーをpyファイルと同じディレクトリに配置し、以下を実行して1.txtを復号して復元します。

decrypt_file("D:/PyCharm Community Edition 2021.3.2/Workplace/encryption/1.txt")

おすすめ

転載: blog.csdn.net/SAGIRIsagiri/article/details/124541807