2015-07-03 2 views
0

Перво-наперво,
БЕЗОПАСНОСТИ ПРЕДУПРЕЖДЕНИЕ:
Я прекрасно понимаю, что если я использую частно-шифрование -> общественно-дешифровке «зашифрованы» сообщение является читаемый для всех, кто имеет доступ к так называемому «открытому ключу».
В нормальном случае использования rsa это было бы фатально!
Но в моем случае «открытый ключ» также должен быть закрытым.
Я пытаюсь установить зашифрованное соединение, где полный контроль остается на одной стороне.
Один из партнеров не доверен, и если он подвергнется риску, я хочу быть уверенным, что никто другой не сможет использовать интерфейс (чтобы предотвратить эскалацию привилегий).
Как вы можете видеть в этом случае, шифрование само по себе не является основной причиной асимметричного «шифрования».
Фактически вы получаете зашифрованный поток данных, который нельзя манипулировать со стороны третьей стороны, даже если ключ просочился.

Мое фактическое сообщение должно выполняться между узлом node.js и средой python.
URSA Узел lib уже имеет функцию для частного шифрования.
К сожалению pyCrypto не поддерживает это по причинам, упомянутым выше ранее.
Я уже пытался сыром lib и использовал частный экспонент для создания объекта открытого ключа, но nodejs не может расшифровать результат (не большой сюрприз).
Кто-нибудь знает, как решить эту проблему?
Есть ли другой способ заставить python делать фактическое шифрование секретного ключа?
Может быть, есть еще один python lib, способный сделать это, я не мог найти?
Или, возможно, его можно получить, чтобы nodejs lib расшифровывал мое шифрование секретного ключа cheesie?питон RSA частного шифровать общаются с node.js

ответ

2

Я нашел для меня рабочее решение.
Я просто взломал дополнительный метод в объекте подписи pyCrypto, который делает именно то, что я хочу.
Это работает с python 2.7.9 и 3.4, насколько я его протестировал.
В файле "[...]/Crypto/Signature/PKCS1_v1_5.py" класс "PKCS115_SigScheme"
Я просто добавил следующий метод:

def private_encrypt(self, msg): 
    modBits = Crypto.Util.number.size(self._key.n) 
    k = ceil_div(modBits,8) # Convert from bits to bytes 
    PS = bchr(0xFF) * (k - len(msg) - 3) 
    m = self._key.decrypt(b("\x00\x01") + PS + bchr(0x00) + msg) 
    S = bchr(0x00)*(k-len(m)) + m 
    return S 

Это просто манипулируют копия функции «знак».

Использование выглядит следующим образом:

from Crypto.Signature import PKCS1_v1_5 
from Crypto.PublicKey import RSA 
plain_message="Hi, I'm going to be encrypted with a private key." 
key = RSA.generate(4096) 
signer = PKCS1_v1_5.new(key) 
bin_enc_msg = signer.private_encrypt(plain_message.encode()) 

дешифрования после base64 кодированные передачи в nodejs с URSA publicDecrypt работает отлично.
Это должно быть ясно из импорта, но я хочу упомянуть об этом, тем не менее:
Это фактически шифруется с помощью PKCS1.5 padded rsa.

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

+0

Как вы оценили реализацию 'private_encrypt'? – Kedar

+0

Я посмотрел, как должно работать подпись. Я в основном просто подписываю данные, но вместо хэша я использую свои фактические данные. И для некоторых подробностей я рассмотрел, как ursa node.js lib расшифровывает данные и что они ожидают. –

0

Если ваша цель - подключить среду python и Node.js с шифрованием и не требует использования сторонней проверки, вам нужно использовать шифрование с открытым ключом RSA? Это действительно похоже на то, что вы пытаетесь выполнить, это Symmetric-key Encryption, и вы можете использовать AES. Библиотека pyCrypto уже поддерживает это, и некоторые поисковые системы предоставляют this библиотеку для Node.js на git-хабе.

+0

Прошу прощения, но это именно то, чего я не хочу. Если кто-то получит пароль симметричного шифрования, он может расшифровать и обработать и переконфигурировать сообщение. Это то, что я пытаюсь предотвратить. –

+0

Вы можете посмотреть [pyOpenSSL] (https://pypi.python.org/pypi/pyOpenSSL), в котором есть инструменты для шифрования открытого ключа PKI/private. Я бы сказал, если вы настроите свою среду на каждом сервере, который делает PKI, например, установку для двухсторонней связи, и не используйте сторонние сертификаты, вы открыты для атак MITM, а управление сертификатами - это боль. –

+0

У меня такое чувство, что никто не понимает, что я пытаюсь описать. вероятно, моя вина. Обмен открытым ключом безопасно осуществляется над защищенным каналом и постоянно сохраняется в файл на клиенте. После этого я использую эту технику именно потому, что она не уязвима для MITM. И btw pyopenssl вообще не поддерживает шифрование privatekey. –

Смежные вопросы