Привет всем.
Я пытаюсь немного поиграть с открытыми и закрытыми ключами 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 часа, чтобы найти, как это сделать правильно !!
Чего мне не хватает? Как я уже сказал, я довольно новичок в этом шифровании с открытым / частным асимметричным ключом, поэтому у меня может быть основная «концептуальная ошибка» ... Любая подсказка будет оценена.
¡Заранее спасибо!