디렉토리 내부에 들어있는 폴더를 암호화하는 방법

Asked 6 months ago, Updated 6 months ago, 86 views

디렉터리를 암호화할 수 있는 프로그램을 만들려고 합니다.

하지만 현재 가지고 있는 것은 디렉토리 내부의 파일만 암호화할 수 있고 안에 들어있는 폴더는 암호화할 수 없습니다.

예를 들어 "Pictures" 폴더를 암호화하려면 "Pictures" 내의 파일과 함께 "Saved Pictures" 및 "Camera Roll"도 암호화 했으면 합니다.

실제 실행해본 코드는 아래와 같습니다.

혹시 해결방법 아시는 분 있나요?

from cryptography.fernet import Fernet
import os

'''
def write_key():
    key = Fernet.generate_key()
    with open('key.key', "wb") as key_file:
        key_file.write(key)
'''


def load_key():
    file = open('key.key', 'rb')
    key_ = file.read()
    file.close()
    return key_


key = load_key()
fer = Fernet(key)

os.chdir(r"C:\Users\{user}\encrypt_test".format(user=os.getlogin()))
files = os.listdir()
print(files)

for i in range(len(files)):

    with open(files[i], 'rb') as f:
        data = f.read()

    with open(files[i], 'w') as f:
        print(len(data))
        f.write(fer.encrypt(data).decode())
        print('done')

python

2022-05-22 09:49

1 Answers

해야할 것이 모든 파일을 찾기 위해 디렉토리를 반복적으로 탐색하고 거기에 어떤 작업을 적용해야합니다.

앞에서 살펴본 os.listdir 메서드는 현재 디렉터리에 있는 항목만 제공합니다.

이 메서드를 사용하여 recursive 메서드를 작성할 수 있지만

(예: 주어진 항목이 디렉터리인지 확인하고, 디렉터리 위에 os.listdir를 실행하고, 그렇지 않으면 암호화합니다. 이걸 계속 반복합니다)

파일 트리를 따라 recursive 처리를 처리하고, 각 레벨의 디렉토리에서 파일을 분리하는 os.walk를 사용하는 것이 더 쉬울 겁니다.

여기서 한 가지 주의할 점은 os.walk가 반환하는 파일 배열은 해당 레벨의 파일 이름뿐이므로 전체 경로를 얻으려면 루트 값과 결합해야 합니다.

이런 방식으로 코드를 고치면 아래와 같습니다.

from cryptography.fernet import Fernet
import os
import path

'''
def write_key():
    key = Fernet.generate_key()
    with open('key.key', "wb") as key_file:
        key_file.write(key)
'''


def load_key():
    file = open('key.key', 'rb')
    key_ = file.read()
    file.close()
    return key_


key = load_key()
fer = Fernet(key)

os.chdir(r"C:\Users\{user}\encrypt_test".format(user=os.getlogin()))

for root, dirs, files in os.walk('.'):
    print(files)
    for filename in files:
        filepath = path.join(root, filename)

        with open(filepath, 'rb') as f:
            data = f.read()

        with open(filepath, 'w') as f:
            print(len(data))
            f.write(fer.encrypt(data).decode())
            print('done')


2022-05-22 09:52

If you have any answers or tips


© 2022 pinfo. All rights reserved.