python 文件加解密


 

描述待添加

 

 

 

#pip install pycryptodome == 3.9.9

from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES, PKCS1_OAEP
import os
import base64

code = '1ikwcwtfph'
# 創建秘鑰對
def CreateRSAKeys():
    key = RSA.generate(2048)
    encrypted_key = key.exportKey(passphrase=code, pkcs=8, protection="scryptAndAES128-CBC")
    # 私鑰
    with open('my_private_rsa_key.bin', 'wb') as f:
        f.write(encrypted_key)
    # 公鑰
    with open('my_rsa_public.pem', 'wb') as f:
        f.write(key.publickey().exportKey())

#加密
def Encrypt(filename):
    data = ''
    with open(filename, 'rb') as f:
        data = f.read()
    with open(filename, 'wb') as out_file:
        # 收件人秘鑰 - 公鑰
        recipient_key = RSA.import_key(open('my_rsa_public.pem').read())
        session_key = get_random_bytes(16)
        # Encrypt the session key with the public RSA key
        cipher_rsa = PKCS1_OAEP.new(recipient_key)
        out_file.write(cipher_rsa.encrypt(session_key))
        # Encrypt the data with the AES session key
        cipher_aes = AES.new(session_key, AES.MODE_EAX)
        ciphertext, tag = cipher_aes.encrypt_and_digest(data)
        out_file.write(cipher_aes.nonce)
        out_file.write(tag)
        out_file.write(ciphertext)


#解密
def Descrypt(filename):
    with open(filename, 'rb') as fobj:
        private_key = RSA.import_key(open('my_private_rsa_key.bin').read(), passphrase=code)
        enc_session_key, nonce, tag, ciphertext = [fobj.read(x)
                                                   for x in (private_key.size_in_bytes(),
                                                             16, 16, -1)]
        cipher_rsa = PKCS1_OAEP.new(private_key)
        session_key = cipher_rsa.decrypt(enc_session_key)
        cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce)
        data = cipher_aes.decrypt_and_verify(ciphertext, tag)

    with open(filename, 'wb') as wobj:
        wobj.write(data)

# 文件重命名
def RenameFile(dir, filename):
    filename_bytes = filename.encode('utf-8')
    filename_bytes_base64 = base64.encodebytes(filename_bytes)

    filename_bytes_base64 = filename_bytes_base64[::-1][1:]
    new_filename = filename_bytes_base64.decode('utf-8') + '.crypt1'
    print(os.path.join(dir, filename))
    print(os.path.join(dir, new_filename))
    os.rename(os.path.join(dir, filename), os.path.join(dir, new_filename))

# 解密並且恢復名字
def ReserveFilename(dir, filename):
    f = filename
    filename = filename[::-1][7:][::-1]
    filename_base64 = filename[::-1] + '\n'
    filename_bytes_base64 = filename_base64.encode('utf-8')
    ori_filename = base64.decodebytes(filename_bytes_base64).decode('utf-8')
    print(os.path.join(dir, f))
    print(os.path.join(dir, ori_filename))
    os.rename(os.path.join(dir, f), os.path.join(dir, ori_filename))


# 文件夾所有文件加密
def encryptFolder(rootDir):
    list_dirs = os.walk(rootDir)
    for root, dirs, files in list_dirs:
        for f in files:
            filename = os.path.join(root, f)
            Encrypt(filename)
            RenameFile(root, f)

# 文件夾所有文件解密
def descryptFolder(rootDir):
    list_dirs = os.walk(rootDir)
    for root, dirs, files in list_dirs:
        for f in files:
            filename = os.path.join(root, f)
            Descrypt(filename)
            ReserveFilename(root, f)

if __name__ == '__main__':
    rootDir = "D://folder"
    '''
    1.第一步執行創建秘鑰函數
    CreateRSAKeys()
    2.第二步加密文件所有文件
    encryptFolder(rootDir)
    3.解密文件前,先注釋第二部代碼
    #CreateRSAKeys()
    #encryptFolder(rootDir)
    descryptFolder(rootDir)
    '''
    CreateRSAKeys()
    #encryptFolder(rootDir)
    #descryptFolder(rootDir)

 

效果圖如下

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM