(python) Как я могу зашифровать AES-128 бит или выше - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу зашифровать файл конфиденциальных данных на моем компьютере, используя python. файл будет состоять из паролей, поэтому он должен быть защищен. да, я знаю, что не существует такого неразрывного шифрования, но я хочу сделать очень тяжелую жизнь для хакера (если он взломает мой компьютер)

, поэтому я написал код python со следующими строками: зашифровать и расшифровать файл:

import base64
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
from Crypto import Random

def encrypt(key, source, encode=True):
    key = SHA256.new(key).digest()
    IV = Random.new().read(AES.block_size)
    encryptor = AES.new(key, AES.MODE_CBC, IV)
    padding = AES.block_size - len(source) % AES.block_size
    source += bytes([padding]) * padding
    data = IV + encryptor.encrypt(source)
    return base64.b64encode(data).decode("latin-1") if encode else data


def decrypt(key, source,  decode=True):
    if decode:
        source = base64.b64decode(source.decode("latin-1"))
    key = SHA256.new(key).digest()
    IV = source[:AES.block_size]
    decryptor = AES.new(key, AES.MODE_CBC, IV)
    data = decryptor.decrypt(source[AES.block_size:])
    padding = data[-1]
    if data[-padding:] != bytes([padding]) * padding:
        return "invalid"
    else:
        return data[:-padding]    # remove the padding

Я не могу найти в Интернете, как написать AES-128-битное шифрование или выше, даже 192-битный или 256-битный. на самом деле, это вопрос - как написать хотя бы AES-128 бит (или лучше - 192/256 бит)?

1 Ответ

0 голосов
/ 06 апреля 2020

AES по определению использует как минимум 128-битный ключ. Таким образом, используя AES, вы уже используете как минимум 128-битное шифрование.

do c для AES.new указывает, что аргумент ключа используется как есть (то есть Передав 16-битный / 128-битный ключ, вы получите AES-128, 24 байта - AES-192, а 32 байта - AES-256), за исключением MODE_SIV, где вам нужно передать удвоенную длину.

На самом деле вы передаете дайджест SHA256 и используете MODE_CB C. Это означает, что вы уже передаете 256-битный ключ и получаете шифрование AES-256.

Однако do c также дает пример для использования AES

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

key = get_random_bytes(16)
cipher = AES.new(key, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(data)

file_out = open("encrypted.bin", "wb")
[ file_out.write(x) for x in (cipher.nonce, tag, ciphertext) ]

Как видите, уже есть метод encrypt_and_digest, вам не нужно копировать свой код (с потенциальной ошибкой). Кроме того, ключ вместо этого генерируется из get_random_bytes. Использование одного вызова SHA256 может быть лучше, чем ничего, но гораздо лучше просто генерировать ключ случайным образом и надежно хранить его. Если вам действительно нужно, есть пара функций получения ключа , если вам нужно разрешить пользователю вводить свой пароль.

...