Как добавить / изменить пароль для секретного ключа RSA с помощью PyCrypto - PullRequest
6 голосов
/ 01 августа 2011

Может быть, кто-нибудь сможет мне помочь.Я использую PyCrypto для генерации пары ключей RSA.Открытый ключ и закрытый ключ.Я пытаюсь добавить / изменить пароль к закрытому ключу, и я не знаю, как это сделать.

Это часть моего кода.

#encoding:utf-8
from Crypto.PublicKey import RSA

pass_alice='ala'
private_alice_key = RSA.generate(1024)
public_alice_key  = private_alice_key.publickey()

str_priv = private_alice_key.exportKey()
str_pub  = public_alice_key.exportKey()

print str_priv
print str_pub

# HOW ADD OR CHANGE PASSWORD FOR private_alice_key

В M2Crypt функциясгенерировать ключ пары RSA.gen_key принять аргумент обратного вызова функции, и я смогу вернуть свой пароль.

#example in M2Crypt:
from M2Crypto import RSA
key = RSA.gen_key(1024, 6528, lambda pass:'my_password')

Как это сделать в PyCrypto.Спасибо за ответ

Ответы [ 2 ]

2 голосов
/ 06 августа 2011

PyCrypto не имеет функции, которая может управлять парольной фразой RSA.

Вместо этого вы можете использовать модуль ezPyCrypto ( homepage ), который построен поверх модуля PyCrypto. Он имеет более простой интерфейс и позволяет:

  • Генерация, экспорт и импорт открытых и закрытых ключей
  • Шифрование и дешифрование строк с легкостью
  • При желании можно создавать зашифрованные данные в виде текста, удобного для электронной почты
  • Подпишите и проверьте строки (включая документы)
  • Защитите свой закрытый ключ парольной фразой
  • Создание «потоков» для отправки данных через защищенные сокеты
  • Выберите любой размер открытого ключа (2048 бит рекомендуется)
  • Выберите между RSA и ElGamal для открытого ключа и IDEA, DES3, Blowfish, ARC4, IDEA для сеансового ключа
  • Отдыхайте в комфорте безопасности благодаря 256-битным сеансовым ключам и защите от обычных атак RSA и ElGamal, которые будут мучительно расстраивать любого, кто пытается нарушить вашу конфиденциальность.

Использование:

"""
example7.py
Demonstrate the use of passphrases with private keys
"""
import ezPyCrypto

mysecret = "Don't look at this!!!"
raw = "Here is a string to encrypt"

# Create a key object
k = ezPyCrypto.key(passphrase=mysecret)

# Export public/private key
publicAndPrivateKey = k.exportKeyPrivate()

# Encrypt against this keypair
enc = k.encString(raw)

# Create a new key object, and import keys (with passphrase)
k1 = ezPyCrypto.key(publicAndPrivateKey, passphrase=mysecret)

# Decrypt text
dec = k.decString(enc)

# test
if dec == raw:
    print "Successful decryption using correct passphrase"
else:
    print "Failed somewhere"

print "Trying now with a bad passphrase"
try:
    k2 = ezPyCrypto.key(publicAndPrivateKey, passphrase="cracking attempt")
except ezPyCrypto.CryptoKeyError:
    print "Oops - our feeble cracking attempt failed (which is a good thing)."
else:
    print "Cracking attempt succeeded - we're not safe"
    # We're in - let's plunder
    dec2 = k2.decString(enc)

Построить

Если вы посмотрите на источник ezCryptoPy, то увидите, что ключ фактически зашифрован / расшифрован с использованием алгоритма BlueFish:

   # decrypt against passphrase
        blksiz = 8 # lazy of me

        # create temporary symmetric cipher object for passphrase - 
        #hardwire to Blowfish
        ppCipher = Blowfish.new(passphrase,
                                Blowfish.MODE_CFB,
                                self._passIV[0:blksiz])
        enclen = len(keyobj)
        decpriv = ''
        i = 0
        while i < enclen:
            decbit = ppCipher.decrypt(keyobj[i:i+blksiz])
            decpriv += decbit
            i += blksiz
        keyobj = decpriv[0:size]

Это означает, что вы можете написать свой собственный обработчик парольной фразы, используя предыдущий пример кода без установки ezPyCrypto. Здесь вы можете найти много примеров кода, как сделать это самостоятельно: Поиск кода Nullege

Мое первое и альтернативное решение:

Вы можете использовать функцию python exec () и функцию командной строки "ssh-keygen" ( doc ):

ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile].

1 голос
/ 21 октября 2013

Для загрузки ключа с фразой смотрите описание модуля RSA

Описание importKey

importKey(externKey, passphrase=None)

Импорт ключа RSA (открытого или частного), закодированного в стандартной форме.

См. RSAImplementation.importKey.

Параметры:

  • externKey (строка) - ключ RSA для импорта, закодированный в виде строки.

    Открытый ключ RSA может иметь любой из следующих форматов:

    • X.509 subjectPublicKeyInfo DER SEQUENCE (двоичное или PEM-кодирование)
    • PKCS # 1 RSAPublicKey DER SEQUENCE (двоичное или PEM-кодирование)
    • OpenSSH (только текстовый открытый ключ)

    Закрытый ключ RSA может быть в любом из следующих форматов:

    • PKCS # 1 RSAPrivateKey DER SEQUENCE (двоичное или PEM-кодирование)
    • PKCS # 8 PrivateKeyInfo DER SEQUENCE (двоичное или PEM-кодирование)
    • OpenSSH (только текстовый открытый ключ)

    Подробнее о кодировке PEM см. RFC1421 / RFC1423.

    В случае кодирования PEM закрытый ключ может быть зашифрован с помощью DES или 3TDES в соответствии с определенной парольной фразой. Поддерживаются только парольные фразы, совместимые с OpenSSL.

  • ключевая фраза (строка) - в случае зашифрованного ключа PEM это пароль, из которого получен ключ шифрования.

Возвращает:

Ключевой объект RSA (_RSAobj).

Поднимает:

  • ValueError / IndexError / TypeError - Когда данный ключ не может быть проанализирован (возможно, из-за неправильной парольной фразы).

Пример:

from Crypto import RSA

key = RSA.generate(1024)
exportedKey = key.exportKey('PEM', 'my secret', pkcs=1)

Для сохранения ключа с фразой посмотрите на описание объекта _RSAobj .

Описание exportKey

exportKey(self, format='PEM', passphrase=None, pkcs=1)

Экспорт этого ключа RSA.

Параметры:

  • format (string) - формат, используемый для переноса ключа.
    • 'DER'. Двоичное кодирование, всегда незашифрованное.
    • 'PEM'. Текстовое кодирование, выполненное в соответствии с RFC1421 / RFC1423. Незашифрованный (по умолчанию) или> зашифрованный.
    • 'OpenSSH'. Текстовое кодирование, выполненное согласно спецификации OpenSSH. Подходит только для открытых ключей (не закрытых ключей).
  • кодовая фраза (строка) - В случае PEM - кодовая фраза для получения ключа шифрования.
  • pkcs (целое число) - стандарт PKCS, который следует соблюдать при сборке ключа. У вас есть два варианта:

    • с 1, открытый ключ встраивается в X.509 SubjectPublicKeyInfo DER SEQUENCE. Закрытый ключ встраивается в PKCS # 1 RSAPrivateKey DER SEQUENCE. Этот режим используется по умолчанию.
    • при 8 закрытый ключ встраивается в PKCS # 8 PrivateKeyInfo DER SEQUENCE. Этот режим недоступен для открытых ключей. Стандарты PKCS не имеют отношения к формату OpenSSH.

Возвращает:

Строка байтов с закодированной общедоступной или частной половиной.

Поднимает:

  • ValueError - Когда формат неизвестен.

Пример:

from Crypto.PublicKey import RSA

with open("key.pem", "r") as privatekey:
    encryptor = RSA.importKey(privatekey, passphrase="my secret")
...