1. Отправка открытого ключа клиенту
Клиенту нужен только открытый ключ, чтобы зашифровать что-то, что сервер может затем расшифровать. Открытый ключ RSA состоит из модуля n и открытого показателя степени e. Простым способом было бы отправить обе части в виде строк в шестнадцатеричном кодировании.
modulus = hex(key.publickey().n)[2:-1]
exponent = hex(key.publickey().e)[2:-1]
2. Использование открытого ключа для шифрования
CryptoJS не предоставляет реализацию RSA, но jsbn (GitHub). Хорошо, что мы отправили общедоступные компоненты в шестнадцатеричном формате, потому что jsbn ожидает, что модуль и общедоступная экспонента будут строками в шестнадцатеричном коде:
var rsa = new RSA();
rsa.setPublic(n_string, e_string);
var res = rsa.encrypt(plaintext);
Имейте в виду, что RSA может шифровать только данные, которые не больше модуля. Если вы сгенерируете 1024-битные ключи, вы не сможете зашифровать данные размером более 1024 бит. Если вы хотите зашифровать большие данные, вам понадобится гибридное шифрование, например, с AES.
jsbn также использует только дополнение PKCS#1 v1.5, которое поддерживает pycrypto. Вы можете попробовать еще не объединенный pull request #3, чтобы получить PKCS#1 v2 OAEP. что более безопасно, чем дополнение v1.5.
3. Расшифровка на питоне
jsbn возвращает зашифрованный текст в шестнадцатеричном формате. Вы можете смело отправлять его как хотите, но вам нужно декодировать (не показано) его в байты перед расшифровкой в питоне.
sentinel = Random.new().read(32) # denotes the error result of the decryption
cipher = PKCS1_v1_5.new(key) # private key
message = cipher.decrypt(ciphertext, sentinel)
if sentinel != message:
print("success: " + str(message))
else:
print("failure")
person
Artjom B.
schedule
27.07.2015