Как использовать расшифровку с закрытым ключом RSA и SHA256 на Python - PullRequest
1 голос
/ 01 октября 2019

Я учусь в школе шифровать и дешифровать файл с использованием открытого и закрытого ключей в кодировке.

Я использовал этот код для кодирования сообщения. (который генерирует открытый ключ ≠ не ошибка закрытого ключа)

from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA



def signing():
    #open file = message als binary
    message = open('C:/Users/Gebruiker/Desktop/message.txt', "rb").read()
    #open public key -> key     
    key = RSA.import_key(open('C:/Users/Gebruiker/Desktop/public.pem').read())
    #message becomes a hash
    h = SHA256.new(message)  
    #f = open file as write binary
    f = open('C:/Users/Gebruiker/Desktop/message.signature', 'wb')
    # sign hash message with private key  
    signature = pkcs1_15.new(key).sign(h) 
    #write signed hash to file 
    f.write(signature)
    f.close()

Но сейчас я пытаюсь декодировать это сообщение, и я нашел всех этих людей, которые делают это по-разному и работают с разными типами кодирования и шифрования,И я не могу найти четкий ответ.

, что у меня сейчас есть, это

Сначала я должен прочитать сообщение, чтобы

def decrypt():
    f = open('C:/Users/Gebruiker/Desktop/message.signature', 'rb').read()

, затем я открыл свой личныйключ

    key = RSA.import_key(open('C:/Users/Gebruiker/Desktop/private.pem').read())

Поскольку я пишу и читаю в двоичном виде, я должен превратить его обратно в хеш

    h = SHA256.new(f)

А затем мне нужно расшифровать хеш с помощью моего закрытого ключа. ?? ?

Вместо этого я вижу много людей, использующих что-то вроде этого.

    h = pkcs1_15.new(key).sign(h)  # sign hash message with private key

, которое я не получаю. Вы должны расшифровать это правильно? не подписывайте это снова. эта часть не имеет смысла для меня.

Теперь у меня 2 проблемы.

  1. Я получаю ошибку кодирования, говорящую, что мой открытый ключ не является закрытым ключом. Что является своего рода точкой публичного доступа. так что только закрытый ключ можно расшифровать? Почему я получаю ошибку?
  2. Я не знаю, как приступить к расшифровке моего сообщения

Кто-нибудь может мне помочь с этим?

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

В вашем вопросе путаница. Генерация подписи для RSA требует модульного возведения в степень с использованием значений закрытого ключа , а не открытого ключа. Модульное возведение в степень также используется для шифрования с открытым ключом. Но хотя используется та же математическая формула - по крайней мере, на первый взгляд - это не означает, что генерация подписи - это шифрование с закрытым ключом , потому что такой вещи не существует . Текущие стандарты PKCS # 1 делают все возможное, чтобы объяснить этот факт, хотя ранее PKCS # 1 стандарты, используемые для идентификации генерации подписи с шифрованием RSA.

То, что вы пытаетесь сделать, это подтвердите сообщение. Эту функцию вы ожидаете, а не знак . Проверка выполняется с помощью доверенного открытого ключа , а не с помощью закрытого ключа. Вы не пытаетесь декодировать сообщение, вы пытаетесь проверить, действительно ли байты сообщения подписаны закрытым ключом, принадлежащим той же паре ключей, что и доверенный открытый ключ. Как правило, сообщение не восстановлено, даже частично. PKCS # 1 называется генерацией подписи с приложением, которое отличается от других схем, называемых генерацией подписи , дающей восстановление сообщения . Приложение - это значение подписи , оно должно быть добавлено (включено) в сообщение для любого использования.

На самом деле, тот факт, что вы можете по крайней мере восстановить хэш свыше сообщение относится к некоторым схемам, таким как генерация подписи PKCS # 1 (официально называется RSASSA-PKCS1-v1_5 в стандарте ). Другие схемы, такие как PSS в том же стандарте, могут даже не восстанавливать хэш. Это нормально, пока проверка (которая может иметь место с учетом данных и, следовательно, хэша) может быть успешной или неудачной. Другими словами, проверка должна, по крайней мере, привести к логическому значению true / false, но для этого не нужно генерировать какую-либо другую информацию.

Или в упрощенном псевдокоде:

ciphertext = encrypt(publicKey, plaintext)
(recovered) plaintext = decrypt(privateKey, ciphertext)

и

signature = sign(privateKey, data)
verificationResult = verify(publicKey, data, signature)

где алгоритм хеширования данных равен параметр конфигурации для алгоритма генерации и проверки подписи. Если вы хотите включить его, вы можете, например, включить его в качестве начального параметра:

signature = sign(SHA256alg, privateKey, data)
verificationResult = verify(SHA256alg, publicKey, data, signature)

Наконец, вы говорите о «декодировании». Вы декодируете сообщения, которые были кодированы , используя схему кодирования. Кодирование / декодирование не предполагает наличие ключа. Вместо этого мы говорим о шифровании / дешифровании и генерации / проверке подписи. Примерами кодирования являются шестнадцатеричные числа / основание 64, которые преобразуют двоичный код в текст. Кодировка символов , например UTF-8, предназначена для преобразования текста в двоичный файл.

1 голос
/ 01 октября 2019

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

Также условно, вы должны использовать ваш личный ключ RSA для создания подписи , которую могут проверить все остальные с соответствующим открытым ключом

В принципе, вы можете использовать открытый ключ для создания подписи, но это будет ошибочный случай использования ключа, и это часто предотвращается в библиотеках, реализующих RSA. В вашем случае вы получаете "public key ≠ not private key error" при попытке использовать открытый ключ в вызове sign(..).

При подписании вы не используете полное сообщение в качестве ввода для RSA , но вместо этого вычисляет хеш (вы используете SHA256). Этот хэш не нужно было бы «расшифровывать» при проверке подписи, а вместо этого пересчитывать исходное сообщение, которое вы хотите проверить.

...