Создание секрета AES 256 GCM с использованием заданного ключа в python - PullRequest
2 голосов
/ 06 августа 2020

Я пытаюсь реализовать шифрование AES в python. Я ссылаюсь на образец кода java, чтобы выполнить sh это. В Java 256-битный секрет (с использованием данного ключа) создается с использованием

Key secretKey = new SecretKeySpec(Base64.decodeBase64(GIVEN_KEY), "AES");

Я пытаюсь сделать то же самое в python, используя следующий фрагмент

secret = hashlib.sha256(GIVEN_KEY.encode()).digest()

Но строка, закодированная с помощью python, не может быть расшифрована. Сходны ли приведенные выше фрагменты или что-то мне не хватает?

1 Ответ

2 голосов
/ 06 августа 2020

В Java в качестве ключа используется декодированное в Base64 значение GIVEN_KEY, в Python SHA256 ha sh из GIVEN_KEY. Оба они не одинаковы.

Аналог в Python будет выглядеть примерно так:

import base64
...
secret = base64.b64decode(GIVEN_KEY.encode()) # by default UTF8 encoded

EDIT : в связанном коде (стр. 31) ключ: Base64url закодированный без заполнения:

QOahfcdo98NLjYJuhP4-VKigx51NkUETsKlIu9uXZFY

, который можно распознать по символу - и длине, которая не делится на 4.

Это соответствует Base64url, декодированному в последовательность байтов

40e6a17dc768f7c34b8d826e84fe3e54a8a0c79d4d914113b0a948bbdb976456

, которая представляет 32-байтовый ключ (AES-256) и может быть протестирована, например, здесь .

В Python вы можете декодировать Base64url с помощью urlsafe_b64decode. Однако ожидается заполненное значение в кодировке Base64url, поэтому сначала необходимо добавить заполнение, например, с помощью метода repad из здесь .

import base64

# from https://stackoverflow.com/a/9024884/9014097
def repad(data):
    return data + "=" * (-len(data)%4)

GIVEN_KEY = 'QOahfcdo98NLjYJuhP4-VKigx51NkUETsKlIu9uXZFY'

secret = base64.urlsafe_b64decode(repad(GIVEN_KEY).encode()) 
print(secret.hex()) # 40e6a17dc768f7c34b8d826e84fe3e54a8a0c79d4d914113b0a948bbdb976456
...