Цитировать по имени
цитировать ответ
|
Re: Pbwhatkey - детерминированный генератор закрытого ключа (PBKDF2 pywallet.py основе)
Вам понадобится немного измененный мной модуль PBKDF2 Python. Сохранить код ниже, как "pbkdf2_rmd.py" в той же директории с размещена выше "PB3" скрипт. #! / USR / бен / питон # - * - кодирование: ASCII - * - ################################################## ######################### # PBKDF2 - PKCS # 5 v2.0 Password-Based Key Выведение # # Copyright (C) 2007-2011 Дуэйн С. Litzenberger # # Разрешать Настоящим предоставляется бесплатно, любому лицу, приобретающему # Копию этого программного обеспечения и связанных с ними файлов документации ( # "Программного обеспечения"), Чтобы иметь дело в Программное обеспечение без ограничений, в том числе # Без ограничения права на использование, копирование, изменение, объединение, публикацию, # Распространять, лицензировать, и / или продавать копии программного обеспечения, и # Разрешение лица, которым Программное обеспечение поставляется сделать это, при условии # следующие условия: # # Приведенное выше уведомление об авторских правах и данное разрешение должно быть # Включены во все копии или существенные части Программного обеспечения. # # ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ, # ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ # КОММЕРЧЕСКОЙ ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И # НЕПОСЯГАТЕЛЬСТВА. НИ ПРИ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ BE # НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГИХ ОТВЕТСТВЕННОСТИ, В РЕЗУЛЬТАТЕ # Договора, ДЕЛИКТА ИЛИ ИНАЧЕ, ВОЗНИКАЮЩИЕ ИЗ, ИЛИ В СВЯЗИ # С SOFTWARE ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. # # Страна происхождения: Канада # ################################################## ######################### # Пример PBKDF2 использование: # От Crypto.Cipher импорта AES # От PBKDF2 импорта PBKDF2 # Импорт ОС # # Соль = os.urandom (8) # 64-битная соль # Ключ = PBKDF2 ("Это ключевая фраза является секретом.", Соль) .read (32) # 256-битный ключ # IV = os.urandom (16) # 128-битный И.В. # Шифра = AES.new (ключ, AES.MODE_CBC, внутривенно) # ... # # Пример склепа () использование: # Из PBKDF2 импорта склепа # Pwhash = крипты ("секрет") # Alleged_pw = raw_input ("Введите пароль: ") # Если pwhash == крипты (alleged_pw, pwhash): # Распечатать "Пароль хорошо" # Еще: # Распечатать "Неверный пароль" # ################################################## #########################
__version__ = "0,1" __all__ = [ 'PBKDF2_RMD', 'крипты']
от структуры импорта пакета от случайного импорта randint импорт строка импорт SYS
пытаться: # Используйте PyCrypto (если таковые имеются). от Crypto.Hash импорта HMAC, SHA как SHA1, RIPEMD как RMD кроме ImportError: Распечатать "Ошибка импорта: PyCrypto не установлен!" Выход (0) # PyCrypto не доступно. Используйте стандартную библиотеку Python. # Импорт HMAC, как HMAC # пытаться: # От hashlib импорта sha1 как SHA1 # Кроме ImportError: # Hashlib не доступно. Используйте старый модуль ша. # Импорт ша, как SHA1
# # Python 2.1 через 3.2 совместимость #
если sys.version_info [0] == 2: _0xffffffffL = длинный (1) << 32 Защиту isunicode (ы): Возвращение isinstance (с, Unicode) Защиту isbytes (ы): Возвращение isinstance (с, ул) Защиту isinteger (п): Возвращение isinstance (п, (интермедиат, долго)) Защиту б (ы): возвращение s Защиту binxor (а, б): вернуть "".join ([CHR (ORD (х) ^ Ord (у)) для (х, у) в почтовый индекс (а, б)]) Защиту b64encode (данные, си ="+ /"): TT = string.maketrans ("+ /", Символы) вернуться data.encode ( 'base64'). заменить ("\ п", "") .translate (тт) от binascii импорта b2a_hex еще: _0xffffffffL = 0xffffffff Защиту isunicode (ы): Возвращение isinstance (с, ул) Защиту isbytes (ы): Возвращение isinstance (s, байт) Защиту isinteger (п): Возвращение isinstance (п целое) Защиту отозваны (объект): вернуть hasattr (объект, '__call__') Защиту б (ы): вернуться s.encode ("латино-1") Защиту binxor (а, б): вернуть байты ([х ^ у для (х, у) в почтовый индекс (а, б)]) из base64 импорта b64encode как _b64encode Защиту b64encode (данные, си ="+ /"): если isunicode (символы): Возвращение _b64encode (данные, chars.encode ( 'UTF-8')). декодировать ( 'UTF-8') еще: Возвращение _b64encode (данные, символы) от binascii импорта b2a_hex как _b2a_hex Защиту b2a_hex (ы): вернуться _b2a_hex (s) .decode ( 'US-ASCII') xrange = диапазон
Класс PBKDF2_RMD (объект): """PBKDF2.py: PKCS # 5 v2.0 Password-Based Key Выведение
Эта реализация занимает ключевую фразу и соль (и необязательно счетчик цикла, модуль дайджеста и модуль MAC), и обеспечивает файл-подобный объект, из которого ключ произвольно размера может быть прочитан.
Если ключевая фраза и / или соли являются Юникодом объектов, они кодируются как UTF-8, прежде чем они будут обработаны.
Идея PBKDF2 заключается в получении криптографического ключа от ключевая фраза и соль.
PBKDF2 также может быть использован в качестве сильного соленого хэша пароля. «Крипта» функция предусмотрена для этой цели.
Помните: ключи, сгенерированные с помощью PBKDF2 только так сильны, как ключевые фразы они получены из. """
Защиту __init __ (самоповреждения, PassPhrase, соль, итераций = 1000, digestmodule = ДУЗ, macmodule = HMAC): само .__ macmodule = macmodule само .__ digestmodule = digestmodule self._setup (ключевая фраза, соль, Итерация, self._pseudorandom)
Защиту _pseudorandom (я, ключ, сбщ): """Псевдослучайной функции. например HMAC-SHA1""" Самовозврат .__ macmodule.new (ключ = ключ, сообщ = тзд, digestmod = само .__ digestmodule) .digest ()
Защита чтения (я, байты): """Прочитайте заданное число байтов ключа.""" если self.closed: поднять ValueError ("файл-подобный объект закрыт")
Размер = Len (само .__ ЬиЕ) блоки = [само .__ ЬиЕ] я = само .__ blockNum в то время как размер < байт: I + 1 = Если я > _0xffffffffL или я < 1: # Мы могли бы вернуться "" здесь, но поднять OverflowError ("выведенный ключ слишком долго") Блок = Автономный .__ F (я) blocks.append (блок) площадь + = Len (блок) ЬиЕ = B ("") .join (блоки) RetVal = ЬиЕ [: байт] само .__ ЬиЙ = ЬиЙ [байты:] само .__ blockNum = я возвращение RetVal
Защиту __f (я, я): # Я должен вписываться в 32 бит утверждать 1 <= я <= _0xffffffffL U = само .__ ч.р.ф. (само .__ ключевой фразы, само .__ соли + упаковка ("! L", Я)) Результат = U для J в xrange (2, 1 + я) .__ итераций: U = само .__ ч.р.ф. (само .__ ключевой фразы, U) Результат = binxor (результат, U) возвращаемый результат
Защиту hexread (самость, октет): """Прочитайте заданное число октетов. Верните их в шестнадцатеричном формате.
Обратите внимание, что Len (obj.hexread (п)) == 2 * N. """ вернуться b2a_hex (self.read (октетов))
Защиту _setup (самость, ключевая фраза, соль, Итерация, PRF): # Sanity проверки:
# Ключевая фраза и соль должны быть Обл или юникода (в последнем # Случай, мы преобразуем в UTF-8) если isunicode (ключевая фраза): ключевая фраза = passphrase.encode ("UTF-8,") Элиф не isbytes (фраза): поднять TypeError ("ключевая фраза должна быть Обл или юникода") если isunicode (соль): соль = salt.encode ("UTF-8,") ELIF не isbytes (соль): поднять TypeError ("соль должны быть ул или Юникода")
# итерации должны быть целым числом >= 1 если не isinteger (итераций): поднять TypeError ("Итерации должны быть целым числом") если итераций < 1: поднять ValueError ("Итерации должны быть по крайней мере 1")
# Ч.р.ф. должны быть отозваны если не отозван (PRF): поднять TypeError ("ч.р.ф. должен быть отозван")
самостоятельно .__ ключевая фраза = ключевая фраза Селф .__ соль = соль само .__ итерации = итерации само .__ ч.р.ф. = ч.р.ф. самостоятельно .__ blockNum = 0 самостоятельно .__ BUF = B ("") self.closed = False
Защита близко (Я): """Закройте поток.""" если не self.closed: дель самостоятельная .__ ключевой фразы дель Селф .__ соль дель самоуправления .__ Итерации дель самоуправления .__ ч.р.ф. дель самоуправления .__ blockNum дель самоуправления .__ ЬиЕ self.closed = True
Защита склеп (слово, соль = None, Итерации = None): """PBKDF2 на основе Unix крипта (3) замены.
Число итераций, указанных в соли перекрывает «» итераций параметр.
Эффективная длина хэша составляет 192 бит. """
# Генерация (псевдо-) случайная соль, если пользователь не предоставил. если соль не None: соль = _makesalt ()
# Соль должна быть строка или US-ASCII подмножество Юникода если isunicode (соль): соль = salt.encode ( 'US-ASCII'). декодировать ( 'US-ASCII') Элиф isbytes (соль): соль = salt.decode ( 'US-ASCII') еще: поднять TypeError ("соль должна быть строка")
# Слово должно быть строкой или юникода (в последнем случае, мы преобразуем в UTF-8) если isunicode (слово): слово = word.encode ("UTF-8,") Элиф не isbytes (слово): поднять TypeError ("Слово должно быть строкой или юникода")
# Попробуйте извлечь реальную соль и итерационное количество из соли если salt.startswith ("$ P5k2 $"): (Итерации, соль, фиктивные) = salt.split ("$") [2: 5] если итерации == "": Итерации = 400 еще: Преобразованные = INT (итерации, 16) если итерации! = "%Икс" % Конвертировано: # строчных шестигранные, минимальные цифры поднять ValueError ("Invalid соль") Итерации = конвертированы если нет (итераций >= 1): поднять ValueError ("Invalid соль")
# Убедитесь, что соль соответствует разрешенному набору символов разрешено = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./" для ч в соли: если ч не допускается: поднять ValueError ("Недопустимый символ% г соли" % (Ч))
если итерации None или итерация == 400: Итерации = 400 соль = "$ P5k2 $$" + соль еще: соль = "$ P5k2 $% х $% s" % (Итерации, соль) rawhash = PBKDF2_RMD (слово, соль, Итерация) .read (24) обратная соль + "$" + B64encode (rawhash, "./")
# Добавить крипту как статический метод класса PBKDF2 # Это делает его легче сделать "от PBKDF2 импорта PBKDF2" и до сих пор используют # Крипты. PBKDF2_RMD.crypt = STATICMETHOD (крипты)
Защиту _makesalt (): """Возвращение 48-битную псевдослучайную соли в течение крипты ().
Эта функция не подходит для генерации криптографических секретов. """ binarysalt = Ь ("") .join ([упаковка ("@ЧАС", Randint (0, 0xFFFF)) для г в диапазоне (3)]) вернуться b64encode (binarysalt, "./")
# ВИМ: установить TS = 4 SW = 4 петли = 4 expandtab: #
Этот модуль реализует алгоритм HMAC-ripemd160. Вероятно, безопаснее, чем HMAC-SHA1 в очень хорошем PBKDF2 Модуль по Дуэйн Litzenberger.
|