PyCrypto: расшифровывать только с открытым ключом в файле (без личного + открытого ключа) - PullRequest
3 голосов
/ 27 марта 2012

Привет всем.

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

Вот в чем дело: у меня есть сервер и клиент. Я хочу, чтобы сервер «распознал» и зарегистрировал клиента и показал его в списке «известных устройств». У клиента будет открытый ключ сервера, а у сервера будет открытый ключ клиента, поэтому, когда клиент связывается с сервером, он шифрует свои данные с помощью личного ключа своего клиента и открытого ключа сервера. Делая это, только надлежащий сервер сможет открыть данные (с помощью своего закрытого ключа) и сможет проверить, что отправитель на самом деле является клиентом, который утверждает, что ... ну ... или, по крайней мере, это что я думаю, потому что я довольно новичок в этом асимметричном шифровании. Идея состоит в том, что, когда один из этих клиентов просыпается, он отправляет свой открытый ключ (конечно, зашифрованный с помощью открытого ключа сервера, но это, вероятно, пока не актуально ... пока), говоря " Эй, я Я новый клиент, и это мой открытый ключ. Зарегистрируйте этот ключ с моим UUID", и сервер выполнит его, связав этот открытый ключ с UUID клиента и используя этот ключ для расшифровки данных, поступающих с этого клиента. Я просто хочу передать открытый ключ клиента, сохраняя его личный ключ секретным, секретным, секретным (это личное, верно?)

Я делаю некоторые тесты с openssl и очень простыми скриптами Python, которые используют PyCrypto (на самом деле, даже не в архитектуре сервер / клиент или что-то в этом роде ... просто пытаюсь что-то зашифровать с помощью закрытого ключа и расшифровать его с помощью открытого ключа)

Прежде всего, я создал открытый / закрытый ключ с:

openssl genrsa -out ~/myTestKey.pem -passout pass:"f00bar" -des3 2048

Хорошо, первое, что меня немного озадачивает ... Он генерирует только один файл, как с закрытым, так и с открытым ключами ... Ну ... ладно ... что угодно. Я могу извлечь открытый ключ с помощью:

openssl rsa -pubout -in ~/myTestKey.pem -passin pass:"f00bar" -out ~/myTestKey.pub

Поэтому я подумал, что у меня есть пара личных ( private + public, фактически ) и открытых ключей в ~/myTestKey.pem и ~/myTestKey.pub соответственно. Ну ... видимо я что-то не так делаю, потому что PyCrypto не нравится эта сборка. И я не знаю почему.

У меня есть два очень простых тестовых сценария, "encryptor.py" и "decryptor.py". «encryptor.py» должен шифровать что-то с помощью закрытого ключа, а «decryptor.py» расшифровывать это с помощью открытого ключа. Я знаю ... Я парангон оригинальности ...

Итак, я шифрую строку " Loren ipsum " с помощью моего "encryptor.py" (с закрытым ключом):

----------- encryptor.py ----------------

#!/usr/bin/python

from Crypto.PublicKey import RSA

def encrypt(message):
    externKey="/home/borrajax/myTestKey.pem"
    privatekey = open(externKey, "r")
    encryptor = RSA.importKey(privatekey, passphrase="f00bar")
    encriptedData=encryptor.encrypt(message, 0)
    file = open("/tmp/cryptThingy.txt", "wb")
    file.write(encriptedData[0])
    file.close()

if __name__ == "__main__":
    encryptedThingy=encrypt("Loren ipsum")

И все работает отлично. Ну ... я так полагаю, потому что в файле "/tmp/cryptThingy.txt" я получаю много толку. Это выглядит действительно, действительно зашифровано для меня.

Но когда я пытаюсь расшифровать его, используя только файл, содержащий только открытый ключ ...

----------- decryptor.py ---------------

#!/usr/bin/python

from Crypto.PublicKey import RSA

def decrypt():
    externKey="/home/borrajax/myTestKey.pub"
    publickey = open(externKey, "r")
    decryptor = RSA.importKey(publickey, passphrase="f00bar")
    retval=None

    file = open("/tmp/cryptThingy.txt", "rb")
    retval = decryptor.decrypt(file.read())
    file.close()
    return retval


if __name__ == "__main__":
    decryptedThingy=decrypt()   
    print "Decrypted: %s" % decryptedThingy

... PyCrypto кричит на меня с:

  File "/usr/local/lib/python2.7/dist-packages/pycrypto-2.5-py2.7-linux-i686.egg/Crypto/PublicKey/RSA.py", line 107, in _decrypt
    mp = self.key._decrypt(cp)
TypeError: Private key not available in this object

Да, конечно, он недоступен! Я извлек открытый ключ! Мне потребовалось 2 часа, чтобы найти, как это сделать правильно !!

Чего мне не хватает? Как я уже сказал, я довольно новичок в этом шифровании с открытым / частным асимметричным ключом, поэтому у меня может быть основная «концептуальная ошибка» ... Любая подсказка будет оценена.

¡Заранее спасибо!

1 Ответ

2 голосов
/ 27 марта 2012

Вы ошибаетесь, вы шифруете открытым ключом и дешифруете закрытым ключом.

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

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

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

...