Как зашифровать строку с помощью ключа - PullRequest
2 голосов
/ 24 августа 2009

У меня есть «открытый ключ» в переменной с именем varkey, для получения открытого ключа я использовал urllib и сохранил этот открытый ключ в переменной. Теперь я хочу зашифровать сообщение / строку, используя открытый ключ.

Это нормально, если кто-нибудь может привести меня в какую-то библиотеку.

Ответы [ 6 ]

7 голосов
/ 26 сентября 2009

В моем сообщении в блоге (ссылка passcuriosity.com в ответе Джона Бокера) используется алгоритм симметричного шифрования AES с использованием библиотеки M2Crypto. M2Crypto - это оболочка Python для OpenSSL. API в значительной степени является прямым переводом OpenSSL на Python, так что несколько отрывочная документация не должна быть слишком большой проблемой. Если алгоритм шифрования с открытым ключом, который вам нужно использовать, поддерживается M2Crypto, то вы вполне можете использовать его для криптографии с открытым ключом.

Я нашел набор тестов M2Crypto как полезный пример использования его API. В частности, тесты RSA (в test_rsa.py), PGP (в test_pgp.py) и EVP (в test_evp.py) помогут вам понять, как настроить и использовать библиотеку. Имейте в виду, что они являются юнит-тестами, поэтому может быть немного сложно выяснить, какой именно код необходим и что является артефактом теста.

PS: Поскольку я новичок, мои сообщения могут содержать только одну ссылку, поэтому мне пришлось удалить большинство из них. К сожалению.

Пример

from M2Crypto import RSA

rsa = RSA.load_pub_key('rsa.pub.pem')
encrypted = rsa.public_encrypt('your message', RSA.pkcs1_oaep_padding)
print encrypted.encode('base64')

Выход

X3iTasRwRdW0qPRQBXiKN5zvPa3LBiCDnA3HLH172wXTEr4LNq2Kl32PCcXpIMxh7j9CmysLyWu5
GLQ18rUNqi9ydG4ihwz3v3xeNMG9O3/Oc1XsHqqIRI8MrCWTTEbAWaXFX1YVulVLaVy0elODECKV
4e9gCN+5dx/aG9LtPOE=
3 голосов
/ 26 сентября 2009

Вот скрипт, который демонстрирует, как зашифровать сообщение, используя M2Crypto ($ easy_install m2crypto), если открытый ключ находится в переменной varkey:

#!/usr/bin/env python
import urllib2
from M2Crypto import BIO, RSA

def readkey(filename):
    try:
        key = open(filename).read()
    except IOError:
        key = urllib2.urlopen(
            'http://svn.osafoundation.org/m2crypto/trunk/tests/' + filename
            ).read()
        open(filename, 'w').write(key)
    return key

def test():
    message = 'disregard the -man- (I mean file) behind curtain'
    varkey = readkey('rsa.pub.pem')
    # demonstrate how to load key from a string
    bio = BIO.MemoryBuffer(varkey)
    rsa = RSA.load_pub_key_bio(bio)
    # encrypt
    encrypted = rsa.public_encrypt(message, RSA.pkcs1_oaep_padding)
    print encrypted.encode('base64')
    del rsa, bio    
    # decrypt
    read_password = lambda *args: 'qwerty'
    rsa = RSA.load_key_string(readkey('rsa.priv2.pem'), read_password)
    decrypted = rsa.private_decrypt(encrypted, RSA.pkcs1_oaep_padding)
    print decrypted
    assert message == decrypted

if __name__ == "__main__":
    test()

выход

gyLD3B6jXspHu+o7M/TGLAqALihw7183E2effp9ALYfu8azYEPwMpjbw9nVSwJ4VvX3TBa4V0HAU
n6x3xslvOnegv8dv3MestEcTH9b3r2U1rsKJc1buouuc+MR77Powj9JOdizQPT22HQ2VpEAKFMK+
8zHbkJkgh4K5XUejmIk=

disregard the -man- (I mean file) behind curtain
1 голос
/ 24 августа 2009

Из моего недавнего опыта работы с Python Python не выполняет шифрование изначально. Вам необходимо использовать внешний (сторонний) пакет. Каждый из них, очевидно, предлагает свой опыт. Что вы используете? Это, вероятно, определит, как будет меняться ваш синтаксис.

0 голосов
/ 26 июня 2010

Вы когда-нибудь слышали о "RSAError: данные слишком велики для размера ключа"?

Попробуйте ваш образец с более длинным сообщением:

encrypted = rsa.public_encrypt('My blog post (the passingcuriosity.com link in John Boker's answer) does AES -- a symmetric encryption algorithm -- using the M2Crypto library', RSA.pkcs1_oaep_padding)
0 голосов
/ 24 августа 2009

Вы можете использовать хеширование MD5 или SHA1 вместе с вашим ключом ...

0 голосов
/ 24 августа 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...