#python #криптография #rsa
Как зашифровать методом RSA сообщение своим ключом? import rsa (pubkey, privkey) = rsa.newkeys(512) message = b'Hello world!' # шифруем crypto = rsa.encrypt(message, pubkey) print(crypto)
Ответы
Ответ 1
Шифрование с публичным ключом Если Алиса хочет послать Бобу сообщение, зашифрованное его открытым ключом, не подписывая сообщение, то нужен только публичный ключ Боба: >>> # Generate keys on Bob's computer >>> import nacl.encoding # $ pip install pynacl >>> import nacl.public >>> skbob = nacl.public.PrivateKey.generate() >>> skbob.public_key.encode(encoder=nacl.encoding.Base64Encoder) b'eVNxqEZ1/cbiu8G+aep6OR+ccf2kZLKqDYGhtZPLnRg=' Получив этот ключ, Алиса может зашифровать своё сообщение для Боба: >>> # Encrypt message on Alice's computer >>> import nacl.encoding >>> import nacl.public >>> pkbob = nacl.public.PublicKey(b'eVNxqEZ1/cbiu8G+aep6OR+ccf2kZLKqDYGhtZPLnRg=', encoder=nacl.encoding.Base64Encoder) >>> sealed_box = nacl.public.SealedBox(pkbob) >>> message = b'hello world' >>> sealed_box.encrypt(message, encoder=nacl.encoding.Base64Encoder) b'jhh9bnv5boORCrnEVzKYxh6tMr7iJ9npzLRSpUXGAXXUuFUZQS9Y7UCSBVuyfGvA9suZ4rMDbRfBy0c=' Получив зашифрованное сообщение, Бобу легко его расшифровать: >>> # Decrypt message on Bob's computer >>> encrypted = b'jhh9bnv5boORCrnEVzKYxh6tMr7iJ9npzLRSpUXGAXXUuFUZQS9Y7UCSBVuyfGvA9suZ4rMDbRfBy0c=' >>> unseal_box = nacl.public.SealedBox(skbob) >>> unseal_box.decrypt(encrypted, encoder=nacl.encoding.Base64Encoder) b'hello world' Приведённый код реализован на Curve25519 примитивах на эллиптических кривых. Обратите внимание: в коде явно не упоминается ни один криптографический примитив. Чем меньше движущихся частей, которые нужно понимать, тем меньше шансов сломать что-то ненароком. См. If You’re Typing the Letters A-E-S Into Your Code You’re Doing It Wrong. PyNaCl это Питон-обёртка для современной переносимой libsodium крипто-библиотеки. RSA шифрование Чтобы зашифровать сообщение именно RSA алгоритмом, используя публичный ключ из файла, можно M2Crypto обёртку над OpenSSL использовать: #!/usr/bin/env python import base64 from M2Crypto import RSA # $ pip install m2crypto # ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8 >id_rsa.pub.pem rsa = RSA.load_pub_key('id_rsa.pub.pem') # load public key encrypted = rsa.public_encrypt(b'hello world', RSA.pkcs1_oaep_padding) # encrypt print(base64.b64encode(encrypted).decode()) # print as base64 Обратите внимание: здесь используетcя требуемая для новых приложений RSAES-OAEP схема. Чтобы расшифровать encrypted_base64 сообщение, используя частный ключ из файла: #!/usr/bin/env python import base64 import os from M2Crypto import RSA # $ pip install m2crypto rsa = RSA.load_key(os.path.expanduser('~/.ssh/id_rsa')) # load private key encrypted = base64.b64decode(encrypted_base64) # get raw bytes print(rsa.private_decrypt(encrypted, RSA.pkcs1_oaep_padding).decode()) # decrypt # -> hello worldОтвет 2
Вот пример, используещий модуль PyCrypto: In [2]: from Crypto.PublicKey import RSA ...: ...: fn_priv = r'D:\temp\id_rsa' ...: fn_pub = r'D:\temp\id_rsa.pub' ...: ...: with open(fn_pub, 'rb') as pub, open(fn_priv, 'rb') as priv: ...: key_pub = RSA.importKey(pub.read()) ...: key_priv = RSA.importKey(priv.read()) ...: ...: encrypted = key_pub.encrypt(b'Hello world!', 111) ...: ...: decrypted = key_priv.decrypt(encrypted) ...: ...: print(encrypted) ...: print('=' * 60) ...: print(decrypted) ...: (b'\xa7\xf1\x8b0\xe8\xcb|\xda\xb9F\\o_\xd5r\x07&\x92/S\x93\xb9\x91\xe9s({\x00\x93U\'\xe6_=M\x07PBI\xab!\xb2 |Fi\xca\xdf\x9d\xb9\x8fJ\x0f\xe6 \xc6\x14\xac\x15?)u\x15\xf6\xb8\xe2\xe8\xef\x8e$1\xe3\xa5v\xa0G\xa3\x 80y\xec\xf1c\x16\x15&u\x85O\xc5i\xcfCY\x17\x0fq\tI\x9f\x1e\x94_\x81\xb6\x1f\x0f\xc7\xa3\x8bL\xee\xf0_jA\xeea\x15\xa2{ )\xb9\x0c\x96\xaa\xea* \x8c\xb4g\xd0&\xd1\x9b\x9d\xe3\xe4\xe1d\xa9zi\xe2\x8c\x93\xc8\'V#\xf24tEoXo\xc7\x01\xa2\x92\xb1\x9c\x1a\x0f\x10,\x99r)m\x85F\xcdO\xa3\xe1\x8 b\xc6\xd7\x0e\xc7l\x97u\x94&\x17\xd7\x18\x88\x9c9\xc0\x86\xcf\x1f\xf3yd\xfd=-BF\xdc\xeaj\xf7\xee\xf6$\x8e\xc4\x9c\xb6YCF+\x03\xcb\xe2',) ============================================================ b'Hello world!' PS для данного примера я специально сгенерировал ключи без пароля, с длиной 4096 бит
Комментариев нет:
Отправить комментарий