Криптография Python - данные слишком длинные для размера ключа - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь зашифровать свое сообщение, используя асимметричное шифрование. Я использую алгоритм SHA256. Размер ключа 2048. Это мой код: -

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization, hashes

private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)

public_key = private_key.public_key()

# saving public key
pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

with open('public_key.pem', 'wb') as f:
    f.write(pem)


# reading public key
with open("public_key.pem", "rb") as key_file:
        public_key = serialization.load_pem_public_key(
            key_file.read(),
            backend=default_backend()
        )


message = {
    '504201': '504346',
    '504293': '504306',
    '504299': '504273',
    'B.O': 'B.O',
    'Non-Delivery': 'Delivery',
    'regionname': 'Hyderabad',
    'Sirpur (t)': 'Asifabad',
    'ANDHRA PRADESH\nAnnaram B.O': 'ANDHRA PRADESH\nChichdhari Khanapur B.O',
    'officeType': 'S.O',
    'Nirmal': 'Adilabad',
    'circlename': 'Andhra Pradesh',
    'Districtname': 'Adilabad',
    'ANDHRA PRADESH\nBansapalli B.O': 'ANDHRA PRADESH\nDeepaiguda B.O',
    'pincode': '504103',
    'ANDHRA PRADESH\nAndugulpet B.O': 'ANDHRA PRADESH\nBurguda B.O',
    '504202': '504313',
    '504231': '504293',
    'Hyderabad': 'Hyderabad',
    'Khanapur': 'Utnoor',
    'Luxettipet': 'Asifabad',
    'officename': 'dilabad)',
    'ANDHRA PRADESH\nBellalbadi B.O': 'ANDHRA PRADESH\nDhaboli B.O',
    'Taluk': 'Mudhole',
    'ANDHRA PRADESH\nBambara B.O': 'ANDHRA PRADESH\nCoal Chemical Complex S.O',
    'ANDHRA PRADESH\nBangalpet B.O': 'ANDHRA PRADESH\nDantanpalli B.O',
    'salt': 1,
    'divisionname': 'Adilabad',
    'statename\nAda B.O': 'ANDHRA PRADESH\nBirvelli B.O',
    'Delivery': 'Delivery',
    'ANDHRA PRADESH\nBhainsa S.O (A': 'ANDHRA PRADESH\nDhann',
    '504106': '504311',
    'Andhra Pradesh': 'Andhra Pradesh',
    'ANDHRA PRADESH\nArli (T) B.O': 'ANDHRA PRADESH\nChintaguda B.O',
    '504295': '504302',
    'Asifabad': 'Mancherial',
    'ANDHRA PRADESH\nBejjur B.O': 'ANDHRA PRADESH\nDehgaon B.O',
    '504306': '504309',
    '504312': '504296',
    'Adilabad': 'Adilabad',
    'Deliverystatus': 'Delivery',
    'Chennur': 'Utnoor'
}

message = json.dumps(message).encode('utf-8')


encrypted = self.public_key.encrypt(
                message,
                padding.OAEP(
                    mgf=padding.MGF1(algorithm=hashes.SHA256()),
                    algorithm=hashes.SHA256(),
                    label=None
                )
            )

Приведенный выше код вызывает исключение ValueError: Data too long for key size. Encrypt less data or use a larger key size. Если я увеличу key_size до 4096, это сработает. Однако, если у моих данных будет больше ключей, даже 4096 завершится неудачей.

В качестве обходного пути я прочитал несколько похожих вопросов SO, где было рекомендовано сократить (зашифровать) данные с использованием симметричного шифрования, а затем использовать асимметричный.

Я попробовал тот же подход, что и следующий: -

from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher_suite = Fernet(key)
cipher_text = cipher_suite.encrypt(MY_ABOVE_JSON_DUMPS_MESSAGE)
encrypted = self.public_key.encrypt(
                cipher_text,
                padding.OAEP(
                    mgf=padding.MGF1(algorithm=hashes.SHA256()),
                    algorithm=hashes.SHA256(),
                    label=None
                )
            )

Это также приводит к той же ошибке, поскольку cipher_text снова слишком длинный.

Как я правильно понял?

Ответы [ 3 ]

3 голосов
/ 15 марта 2019

Природа криптосистемы RSA такова, что вы не можете зашифровать значение, превышающее модуль (и, фактически, оно должно быть короче, чтобы иметь возможность шифровать его безопасно, поскольку безопасность RSA частично основана на заполнении).

Если вы хотите зашифровать большую полезную нагрузку, вам нужно вместо этого построить систему так, чтобы вы шифровали свою полезную нагрузку с использованием симметричного шифра (убедитесь, что это аутентифицированное шифрование! cryptography предоставляет конструкцию, называемую Fernet, которая может это делать), изатем зашифруйте симметричный ключ, используя ваш открытый ключ RSA.Затем вы можете отправить оба зашифрованных текста получателю.Получатель может расшифровать зашифрованный ключ RSA с помощью закрытого ключа, который он держит, и расшифровать больший зашифрованный текст с помощью полученного ключа.

Если вы строите эту систему с нуля, рассмотрите возможность использования PyNaCl 's Box, но если вам нужны более популярные криптографические примитивы, то такая концепция, как ECIES , также может достичь такой способности без использования RSA.

0 голосов
/ 15 марта 2019

Асимметричная криптография - это медленный криптографический метод. Вы должны использовать AES или эквивалентный для этого метод, если вы все еще хотите добиться криптографии с открытым ключом. Зашифруйте данные с помощью AES: создайте объект с заголовком в качестве ключа AES и зашифрованными данными AES в качестве полезной нагрузки ... Зашифруйте только ключ AES с помощью PKC.

0 голосов
/ 14 марта 2019

Попробуйте сократить ваше сообщение, используя хэш-алгоритм. как sha256. Затем попробуйте зашифровать сообщение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...