Binascii error non base32 digit found

im facing problem while running code below always give "Error: Non-base32 digit found" i did searched online and fix it by using utf-8 for secret = base64.b32decode(bytes(secret, 'utf-8')...

im facing problem while running code below always give «Error: Non-base32 digit found»
i did searched online and fix it by using utf-8 for secret = base64.b32decode(bytes(secret, 'utf-8')) but its not working giving me same error. Any suggestion? i’m using python 3.8

import hmac
import base64
import hashlib
import datetime
import time


#totp
interval=30 #seconds


#otp
digest=hashlib.sha1
digits=6 #number of integers supported?
secret='123456789abcdefg'



#totp
now=datetime.datetime.now()
i=time.mktime(now.timetuple())
timecode=int(i/interval)


#otp
base64_secret = base64.b32decode(secret,casefold=True)
res = []
while timecode != 0:
    res.append(chr(timecode & 0xFF))
    timecode = timecode >> 8
bytestring=''.join(reversed(res)).rjust(8,'') #padding=8
hmac_hash = hmac.new(
    base64_secret,
    bytestring,
    digest
).digest()

offset=ord(hmac_hash[19]) & 0xf
code = ((ord(hmac_hash[offset]) & 0x7f) << 24 |
    (ord(hmac_hash[offset + 1]) & 0xff) << 16 |
    (ord(hmac_hash[offset + 2]) & 0xff) << 8  |
    (ord(hmac_hash[offset + 3]) & 0xff))

code = code % 10 ** digits

print (code)

asked Jan 18, 2022 at 21:41

Jessa's user avatar

JessaJessa

313 bronze badges

The Wikipedia article on base32 says that the most common version of base32 uses as digits the 26 letters in the standard alphabet, together with the digits in the range 2-7. Your code was trying to use as digits the numbers 1,8,9. Those are not base 32 digits, hence the error.

To solve that bug, swap out those 3 digits with letters something like:

secret='234567abcdefghij'

With that change, this bug disappears. Unfortunately, other bugs in your code appear, but that is a separate question.

answered Jan 19, 2022 at 1:17

John Coleman's user avatar

John ColemanJohn Coleman

51.1k7 gold badges51 silver badges116 bronze badges

1

Содержание

  1. Error Non-base32 digit found #1328
  2. Comments
  3. spaces in key raise Non-base32 digit found #7
  4. Comments
  5. Footer
  6. FTX API withdrawal Code. Error message. Non-base32 digit found. Help me, please #14559
  7. Comments
  8. Type 1
  9. Type 2
  10. Русские Блоги
  11. Модуль бинарной последовательности и шифрования Python
  12. Каталог статьи
  13. Модуль UU
  14. Метод модуля
  15. Пример
  16. Модуль Base64.
  17. Метод модуля
  18. Модуль бинаско
  19. Функция модуля
  20. Бислект модуль
  21. Функция модуля
  22. Случайный модуль
  23. Вступление
  24. Функция закладки
  25. Метод целочисленного
  26. Метод последовательности
  27. Реальное распределение стоимости
  28. Альтернативный генератор
  29. Hashlib модуль
  30. Хэш алгоритм
  31. Метод модуля и атрибут
  32. Резюме переменной длины алгоритма встряхивания
  33. Экспорт ключей
  34. HMAC модуль
  35. Метод модуля
  36. Метод экземпляра объекта HMAC
  37. Секреты модуль
  38. случайное число
  39. Генерировать токен
  40. Сколько байтов следует использовать?
  41. Другие функции
  42. Лучшие практики

Error Non-base32 digit found #1328

Describe the bug
I am using alexa_media_player integration since months without issues, but today, at the startup of HA, it started providing the error message «alexapy.errors.AlexapyPyotpInvalidKey: Non-base32 digit found».
The integration (Configuration-Integrations page) shows «Failed to set up».
The service notify.alexa is not created.
The HA log shows:
Traceback (most recent call last):

File «/srv/homeassistant/lib/python3.9/site-packages/alexapy/alexalogin.py», line 235, in set_totp
self.get_totp_token()
File «/srv/homeassistant/lib/python3.9/site-packages/alexapy/alexalogin.py», line 259, in get_totp_token
token: Text = self._totp.now()
File «/srv/homeassistant/lib/python3.9/site-packages/pyotp/totp.py», line 44, in now
return self.generate_otp(self.timecode(datetime.datetime.now()))
File «/srv/homeassistant/lib/python3.9/site-packages/pyotp/otp.py», line 33, in generate_otp
hasher = hmac.new(self.byte_secret(), self.int_to_bytestring(input), self.digest)
File «/srv/homeassistant/lib/python3.9/site-packages/pyotp/otp.py», line 50, in byte_secret
return base64.b32decode(self.secret, casefold=True)
File «/usr/local/lib/python3.9/base64.py», line 231, in b32decode
raise binascii.Error(‘Non-base32 digit found’) from None
binascii.Error: Non-base32 digit found

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File «/srv/homeassistant/lib/python3.9/site-packages/homeassistant/config_entries.py», line 293, in async_setup
result = await component.async_setup_entry(hass, self) # type: ignore
File «/home/homeassistant/.homeassistant/custom_components/alexa_media/init.py», line 303, in async_setup_entry
AlexaLogin(
File «/srv/homeassistant/lib/python3.9/site-packages/alexapy/alexalogin.py», line 119, in init
self.set_totp(otp_secret.replace(» «, «»))
File «/srv/homeassistant/lib/python3.9/site-packages/alexapy/alexalogin.py», line 241, in set_totp
raise AlexapyPyotpInvalidKey(ex) from ex
alexapy.errors.AlexapyPyotpInvalidKey: Non-base32 digit found

To Reproduce
Steps to reproduce the behavior:
Restart Home Assistant Core or rebooting the Raspberry, the error is there.

Expected behavior
I just don’t expect the error, the integration to come up and the service to be created normally.

Screenshots

System details

  • Home-assistant (version): 2021.6.5
  • Hassio (Yes/No): No.
  • alexa_media (version from const.py or HA startup): 3.10.6
  • alexapy (version from pip show alexapy or HA startup): unknown
  • Amazon 2FA is enabled (y/n). We will not debug login issues if unanswered: yes

Logs
Traceback (most recent call last):
File «/srv/homeassistant/lib/python3.9/site-packages/alexapy/alexalogin.py», line 235, in set_totp
self.get_totp_token()
File «/srv/homeassistant/lib/python3.9/site-packages/alexapy/alexalogin.py», line 259, in get_totp_token
token: Text = self._totp.now()
File «/srv/homeassistant/lib/python3.9/site-packages/pyotp/totp.py», line 44, in now
return self.generate_otp(self.timecode(datetime.datetime.now()))
File «/srv/homeassistant/lib/python3.9/site-packages/pyotp/otp.py», line 33, in generate_otp
hasher = hmac.new(self.byte_secret(), self.int_to_bytestring(input), self.digest)
File «/srv/homeassistant/lib/python3.9/site-packages/pyotp/otp.py», line 50, in byte_secret
return base64.b32decode(self.secret, casefold=True)
File «/usr/local/lib/python3.9/base64.py», line 231, in b32decode
raise binascii.Error(‘Non-base32 digit found’) from None
binascii.Error: Non-base32 digit found

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File «/srv/homeassistant/lib/python3.9/site-packages/homeassistant/config_entries.py», line 293, in async_setup
result = await component.async_setup_entry(hass, self) # type: ignore
File «/home/homeassistant/.homeassistant/custom_components/alexa_media/init.py», line 303, in async_setup_entry
AlexaLogin(
File «/srv/homeassistant/lib/python3.9/site-packages/alexapy/alexalogin.py», line 119, in init
self.set_totp(otp_secret.replace(» «, «»))
File «/srv/homeassistant/lib/python3.9/site-packages/alexapy/alexalogin.py», line 241, in set_totp
raise AlexapyPyotpInvalidKey(ex) from ex
alexapy.errors.AlexapyPyotpInvalidKey: Non-base32 digit found

Additional context
Add any other context about the problem here.

The text was updated successfully, but these errors were encountered:

Источник

spaces in key raise Non-base32 digit found #7

it’s not a real issue but users can call functions with separated keys.

$ echo «ZYTY YE5F OAGW 5ML7 LRWU L4WT ZLNJ AMZS» | python3 mintotp.py
Traceback (most recent call last):
File «mintotp.py», line 30, in
main()
File «mintotp.py», line 26, in main
print(totp(key.strip(), *args))
File «mintotp.py», line 20, in totp
return hotp(key, int(time.time() / time_step), digits, digest)
File «mintotp.py», line 11, in hotp
key = base64.b32decode(key.upper() + ‘=’ * ((8 — len(key)) % 8))
File «/usr/lib/python3.6/base64.py», line 231, in b32decode
raise binascii.Error(‘Non-base32 digit found’) from None
binascii.Error: Non-base32 digit found
$ echo «ZYTYYE5FOAGW5ML7LRWUL4WTZLNJAMZS» | python3 mintotp.py
246648

you were right at the first two issues i was using python2.7 sorry for that.
Spaces in the keys broke the script it’s not a real issue but i think it’s worth to know

key = base64.b32decode(key.upper().replace(» «,»») + ‘=’ * ((8 — len(key) + key.count(» «)) % 8))

The text was updated successfully, but these errors were encountered:

There is no plan to support spaces in the key.

© 2023 GitHub, Inc.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

FTX API withdrawal Code. Error message. Non-base32 digit found. Help me, please #14559

  • OS : Windows 10 Pro
  • Programming Language version : Python 3.9.12 (main, Apr 4 2022, 05:22:27) [MSC v.1916 64 bit (AMD64)]
  • Jupyter notebook : The version of the notebook server is: 6.4.12
  • CCXT version : CCXT Version: 1.91.52

Hello, I have a concern. I haven’t been able to solve this problem for days.
If you take the time to help me, I’m very grateful.

I want to withdraw from FTX. There’s a problem I can’t solve.
I searched ccxt github and stackoverflow to solve this problem. I can’t solve.

Then I’d appreciate it if you could read my error code.

Type 1

anaconda3libsite-packagesccxtbaseexchange.py:2759, in Exchange.oath(self) 2757 def oath(self): 2758 if self.twofa is not None: -> 2759 return self.totp(self.twofa) 2760 else: 2761 raise ExchangeError(self.id + ‘ exchange.twofa has not been set for 2FA Two-Factor Authentication’) File

anaconda3libsite-packagesccxtbaseexchange.py:1652, in Exchange.totp(key) 1649 return base64.b32decode(padded) # throws an error if the key is invalid 1651 epoch = int(time.time()) // 30 -> 1652 hmac_res = Exchange.hmac(epoch.to_bytes(8, ‘big’), base32_to_bytes(key.replace(‘ ‘, »)), hashlib.sha1, ‘hex’) 1653 offset = hex_to_dec(hmac_res[-1]) * 2 1654 otp = str(hex_to_dec(hmac_res[offset: offset + 8]) & 0x7fffffff) File

anaconda3libsite-packagesccxtbaseexchange.py:1649, in Exchange.totp. .base32_to_bytes(n) 1647 padding = 8 — missing_padding if missing_padding > 0 else 0 1648 padded = n.upper() + (‘=’ * padding) -> 1649 return base64.b32decode(padded) File

anaconda3libbase64.py:231, in b32decode(s, casefold, map01) 229 acc = (acc 231 raise binascii.Error(‘Non-base32 digit found’) from None 232 decoded += acc.to_bytes(5, ‘big’) 233 # Process the last, partial quanta Error: Non-base32 digit found»>

Type 2

anaconda3libsite-packagesccxtbaseexchange.py:1652, in Exchange.totp(key) 1649 return base64.b32decode(padded) # throws an error if the key is invalid 1651 epoch = int(time.time()) // 30 -> 1652 hmac_res = Exchange.hmac(epoch.to_bytes(8, ‘big’), base32_to_bytes(key.replace(‘ ‘, »)), hashlib.sha1, ‘hex’) 1653 offset = hex_to_dec(hmac_res[-1]) * 2 1654 otp = str(hex_to_dec(hmac_res[offset: offset + 8]) & 0x7fffffff) File

anaconda3libsite-packagesccxtbaseexchange.py:1649, in Exchange.totp. .base32_to_bytes(n) 1647 padding = 8 — missing_padding if missing_padding > 0 else 0 1648 padded = n.upper() + (‘=’ * padding) -> 1649 return base64.b32decode(padded) File

anaconda3libbase64.py:231, in b32decode(s, casefold, map01) 229 acc = (acc 231 raise binascii.Error(‘Non-base32 digit found’) from None 232 decoded += acc.to_bytes(5, ‘big’) 233 # Process the last, partial quanta Error: Non-base32 digit found»>

To solve this problem, I created a virtual environment and installed a 32-bit Python version. But it hasn’t been fixed at all. The same error message still occurred.

I did this, but it didn’t solve the problem at all.

So I tried the code supported by FTX API GitHub, not the ccxt Python code, but when I do that, I get a message asking for 2nd OTP certification.

Anyway, I think I need to solve the base32 error to solve the OTP problem.

The text was updated successfully, but these errors were encountered:

Источник

Русские Блоги

Модуль бинарной последовательности и шифрования Python

Каталог статьи

Модуль UU

Метод модуля

Этот модуль есть uuencode Формат кодов и файлов декодирования, что позволяет только использовать только ascii Передача подключения произвольные двоичные данные. Метод кодирования и декодирования модулей и декодирования принимает файловые объекты в качестве параметров, но также могут принимать объекты подобных файлов в качестве параметров. Чтобы быть отсталым, вы также принимаете строку, содержащую имя пути, и откройте соответствующий файл для чтения и записи; имя пути — Представляет стандартный ввод или вывод. Однако этот интерфейс был отбран; вызывающий абонент лучше всего открыть сам файл и убедиться, что он используется в Windows при необходимости. rb или wb Режим открывает файл.

Этот модуль содержит два основных метода:

uu.encode(in_file, out_file, name=None, mode=None, *, backtick=False)

Поставить файлыin_file Содержимое кодируется с использованием UUENCODE, а затем записывает кодированный контентout_file документ.

name Параметр используется для указанияout_file Поле имя файла в начале файла имя файла имени файла — это имя файла для повторного создания двоичных данных. Если этот параметр не указан,out_file Имя файла в начале файла по умолчаниюin_file Имя файла.

mode Параметр используется для указанияout_file Поле узора в начале файла. Этот параметр предпочтительно определяется как 3-битное 8-битное число. Если не указаноmode Параметры тогдаout_file Значение поля режима в файле в файле по умолчанию644

backtick Параметр решает, использовать ли пространство замены для замены места для представления новой линии. Это значение параметра является значением по умолчаниюFalse При использовании пробелов используйте пробелы, этот параметрTrue При использовании анти-квоты выразили новую строку.

uu.decode(in_file, out_file, mode=None, quiet=False)

буду in_file Декодирование данных в закодированном uuencode и записывает декодированные данныеout_file документ.

если out_file Параметр — это строка пути файла, когдаout_file Когда файл точек на параметр должен быть создан,mode Параметр используется для настроекout_file Разрешение разрешений файла, указывающего на файл. дефолт out_file и mode из in_file Чтение в стартовой линии. Если файл, указанный в исходной строке, уже существует, он будет запущен.uu.Error аномальный.

Если вход генерируется ошибкой UUENCODER, метод может выводить предупреждение к стандартной ошибке, и Python может восстановиться по ошибке. буду quiet Настройки параметровTrue Это предупреждение может быть недействительным.

Пример

Выполните файл uuencode кодировки:

Декодирование файлов uuencode encoded:

Модуль Base64.

Этот модуль обеспечивает функцию кодирования двоичных данных в печатный ASCII и функцию декодирования этих кодировков к двоичным данным. этоRFC 3548 Указанная базовая, кодировка BASE32 и BASE64 и широко принятая кодировка ASCII85 и BASE85 обеспечивает функции кодирования и декодирования.

RFC 3548 Целью кодирования является создание двоичных данных может быть отправлена ​​правильно в качестве электронного письма в качестве части URL или в рамках запроса HTTP Post. Где алгоритм кодирования иuuencode Это отличается.

Этот модуль предоставляет два интерфейса. Новый интерфейс предоставляет от объекта класса байта к байту ASCII bytes Код и декодирование объекта класса байта или строки ASCII для bytes Операция. Этот модуль поддерживает определениеRFC 3548 Все ALLPABETS BASE-64 (обычная, безопасность URL-безопасности и файловая система).

Старый интерфейс не обеспечивает операцию декодирования из строки, но обеспечивает функцию кодирования и декодирования объекта файла операций. Старый интерфейс поддерживает только стандартные алфавиты Base64 и следуетRFC 2045 Спецификация добавляет новую строку каждые 76 символов. Примечание: если вам нужно поддержатьRFC 2045Так использоватьemail Модули могут быть более подходящими.

Метод модуля

base64.b64encode(s, altchars=None)

буду bytesbytearray или bytes-like Объектs Кодироватьbytes Объект.

Еслиaltchars Параметры должны быть 2bytes-like Объект, используемый для замены стандартного алфавита Base64 + и / 。

base64.b64decode(s, altchars=None, validate=False)

Декодирование Base64 кодируетсяbytes-like Объект или ascii строкаs

Еслиaltchars Параметры должны быть 2bytes-like Объект для замены + и / персонаж.

если s Не может быть декодирован, будет вызванbinascii.Error аномальный.

если validate СтоимостьFalse (По умолчанию), отбрасывание не находится в режиме ожидания в режиме ожидания в режиме ожидания, прежде чем проверка заполнения не находится в стандартном алфавите Base64. если validate для TrueЭти немазонные64 символов приведут кbinascii.Error аномальный.

Возвращаемое значениеbytes Объект.

base64.standard_b64encode(s)

Используйте стандартный базовый64 алфавитный код кодировкиbytesbytearray или bytes-like Объектs Отказ Возвращаемое значениеbytes Объект.

base64.standard_b64decode(s)

Используйте стандартный базовый64 алфавит декодированияbytes-like Объект или ascii строкаsОтказ Возвращаемое значениеbytes Объект.

base64.urlsafe_b64encode(s)

буду bytesbytearray или bytes-like Объектs Кодироватьbytes Объект.

Используйте URL-адрес безопасности и файловую систему Безопасный алфавит, — и _ Заменять + и / 。

Возвращаемое значениеbytes Объект.

base64.urlsafe_b64decode(s)

Декодироватьbytes-like Объект или ascii строкаsИспользуйте URL-адрес безопасности и файловую систему безопасного алфавита, — и _ Заменять + и / 。

Возвращаемое значениеbytes Объект.

base64.b32encode(s)

Код с базой32.bytes-like ОбъектsОтказ Возвращаемое значениеbytes Объект.

base64.b32decode(s, casefold=False, map01=None)

Декодированная база32 закодированаbytes-like Объект или ascii строкаs

как casefold СтоимостьFalseЕсли вход может содержать только заглавные буквы. как casefold СтоимостьTrueЕсли вход может содержать строчные буквы.

RFC 3548 Позволяет сопоставить номер 0 (ноль) на прописные буквы o, и вы можете выбрать, следует ли сопоставить номер 1 (один) в прописные буквы i или заглавную букву L. Дополнительные параметрыmap01 нет None Когда число 0 всегда отображается на прописные буквы O,map01 Значение параметра указывает сопоставление цели № 1 (заглавная буква I или строчная буква L). По соображениям безопасности значение по умолчанию установлено значениеNoneВ этом случае 0 и 1 не могут быть введены.

Возвращаемое значениеbytes Виды.

base64.b16encode(s)

Используйте кодировку BASE16bytes-like ОбъектsОтказ Возвращаемое значениеbytes Объект.

base64.b16encode(s, casefold=False)

Декодирование базы16 закодированоbytes-like Объект или ascii строкаs

как casefold СтоимостьFalseЕсли вход может содержать только заглавные буквы. как casefold СтоимостьTrueЕсли вход может содержать строчные буквы.

base64.encode(input, output)

Из бинарного файла объектаinput Прочитайте данные для выполнения кодировки Base64, напишите закодированный результат в объект файлаoutput середина. Новый перерыв будет вставлен каждые 76 байтов b’n’ И добавить новенький символ в конце b’n’ 。

base64.decode(input, output)

Из бинарного файла объектаinput Прочитайте данные и декодируйте, напишите результат объекта декодированного файлаoutput середина.

base64.encodebytes(s)

Будет содержать любые двоичные данныеbytes-like Объектs Выполните кодировку Base64 и вернули закодированные данные. Новый перерыв будет вставлен каждые 76 байтов b’n’ И добавить новенький символ в конце b’n’ 。

base64.decodebytes(s)

Декодироватьbytes-like ОбъектsИ вернуть декодированный байт.s Должна быть линию или многострочная базовая 64 закодированных данных.

Модуль бинаско

Модуль включает в себя множество методов преобразования между различными кодами ASCII, представленными двоичными и двоичными. Обычно эти функции не будут использоваться напрямую, ноuubase64binhex Такой пакет модуль. Чтобы иметь высокую эффективность выполнения, модуль содержит множество базовых функций, написанных с C, которые используются некоторыми расширенными модулями.

a2b_* Функция принимает строку Unicode, содержащую только код ASCII. Другие функции принимаются толькоbytes-like Объект (например,bytesbytearray И другие объекты, которые поддерживают буферные протоколы)

Функция модуля

binascii.a2b_uu(string)

Преобразуйте одну строку UU закодированы данные в двоичные данные и возврат. Данные кодирования UU каждая строка обычно содержат 45 (двоичных) байтов, кроме последней строки. Там могут быть пробелы для каждой строки данных.

binascii.b2a_uu(data, *, backtick=False)

Двоичные данные преобразуются в кодированный символ ASCII, а возвращаемое значение — это данные линии преобразования, включая новую строку.data Длина до 45. если backtick для TureЕсли нуль выражен вместо пробела.

binascii.a2b_base64(string)

Преобразовать блоки данных Base64 в двоичные и возврат в двоичных данных. Многопровольные данные могут быть переданы одновременно.

binascii.b2a_base64(data, *, newline=True)

Двоичные данные преобразуются в ряд base64 кодировали строки ASCII. Возвращаемое значение — это данные линии преобразования, еслиnewline для TrueВозвращаемое значение включает в себя новую строку. Выход этой функции состоит из RFC3548.

binascii.a2b_qp(data, header=False)

Преобразуйте кавычку и данные для печати в двоичные данные и возврат. Вы можете конвертировать несколько строк за раз. Если дополнительные параметрыheader СуществоватьTrueЗатем подчеркивание данных в данных будет декодирована в пространстве.

binascii.b2a_qp(data, quotetabs=False, istext=True, header=False)

Двоичные данные преобразуются в строку или многострочное расценка полосы и могут распечатать кодированный символ ASCII и возврат. Если дополнительные параметрыquotetabs СуществоватьTrueАльтернативно, все вкладки и пробелы кодируются. Если дополнительные параметрыistext СуществоватьTrueЗатем новая строка не закодирована, но конец конца кодируется. Если дополнительные параметрыheader СуществоватьTrueЗатем пространство будет закодировано как подчеркивание. Если дополнительные параметрыheader СуществоватьFalseЗатем обертка будет кодирована; в противном случае преобразование обертывания может повредить двоичный поток данных.

binascii.a2b_hqx(string)

Данные ASCII формата Binhex4 не выполняют декомпрессию RLE непосредственно в двоичные данные. Строка должна содержать полное количество двоичных байтов, или (в последней части данных Binhex4), оставаясь, оставаясь ноль.

binascii.rledecode_hqx(string)

Данные выполнены в соответствии со стандартами Binhex4. Этот алгоритм используется после данных одного байта 0x90 Как индикатор повторения, то сосчитать. Считать 0 Указанное байтовое значение 0x90 Отказ Эта процедура возвращается в распакованные данные, и входные данные будут запущены с окончанием индикатора изолированного повторения.Incomplete аномальный.

binascii.rlecode_hqx(string)

Выполните BINHEX4 стиль сжатия и результаты возврата и возврата.

binascii.b2a_hqx(string)

Выполните бинарный тип Hexbin4 к преобразованию кода ASCII и верните строку результатов. Входные данные должны быть закодированы RLE, а длина данных может быть 3 (за исключением последнего сегмента).

binascii.crc_hqx(data, value)

по value Как первоначальный расчет CRCdata 16-битное значение CRC возвращает результат. Используйте CRC-CCITT для генерации многочленов здесьx 16 + x 12 + x 5 + 1, обычно выражается как 0x1021 Отказ CRC используется в формате Binhex4.

binascii.crc32(data[, value])

Рассчитайте CRC-32, отvalue Исходный расчет начать CRCdata 32-битная контрольная сумма. Начальный CRC по умолчанию равен нулю. Этот алгоритм согласуется с Zip-файлами. Поскольку этот алгоритм предназначен для использования в качестве алгоритма контрольной суммы, он не подходит для использования в качестве универсального хэш-алгоритма. Метод выглядит следующим образом:

binascii.b2a_hex(data)

Вернуть двоичные данныеdata Шестнадцатеричное представление.data Каждый байт преобразуется в соответствующее 2-битное шестнадцатеричное представление. Таким образом, длина возвращаемого объекта байтаdata Дважды двойной.

использовать: bytes.hex() Методы также могут быть легко достигнуты (но только возвращая только текстовые строки).

binascii.hexlify(data)

Функцияb2a_hex() Функция одинакова.

binascii.a2b_hex(hexstr)

Возвращение из шестигранной строкиhexstr Двоичные данные указаны. Эта функция функцииb2a_hex() Напротив.hexstr Вы должны включать даже количество шестнадцатеричных чисел (могут быть прописными или строчными буквами), в противном случае он будет вызванError аномальный.

использовать: bytes.fromhex() Метод класса также реализует аналогичную функцию (только параметр Text String получен, а пустой символ не ограничен).

binascii.unhexlify(hexstr)

Функцияa2b_hex() Функция одинакова.

Бислект модуль

Модуль поддерживает список последовательных обслуживаний без необходимости отсортировать список после каждой вставки. Для относительно длинного списка операция элементов в списке сравнения дороги, и метод в этом модуле является улучшением общего метода. Этот модуль называетсяbisectЭто потому, что метод используется во втором алгоритме. Исходный код этого модуля можно использовать в качестве примера второго алгоритма (граничные условия уже правильные!)

Функция модуля

bisect.bisect_left(a, x, lo=0, hi=len(a))

Вернуться к вставкеa Элементарный элементx Индекс точки вставки, предполагаяa Это уже отсортировано.a Может бытьlist,tuple,array Элементы могут быть отсортированы или итеративный объект.

Параметрlo и hi Может использоваться для указания подмножества, который необходимо учитывать в списке; весь список используется по умолчанию. если x В появленииa В середине точка вставки будет вa Все вx Спереди (слева). Этот метод предполагаетa Уже отсортировано, возвращаемое значение подходит для использованияlist.insert() Первый параметр.

Возвращенная точка вставкиi Множествоa Разделен на две половинки, чтобы все элементы слеваval Удовлетворять ( val ) И все элементы справаval Удовлетворять ( val >= x for val in a[i:hi] )。

bisect.bisect_right(a, x, lo=0, hi=len(a))

Аналогичныйbisect_left()Тем не менее, индекс точки возврата всегда вa Все существующиеx Спина (справа).

Возвращенная точка вставкиi Множествоa Разделен на две половинки, чтобы все элементы слеваval Удовлетворять ( val ) И все элементы справаval Удовлетворять ( val >= x for val in a[i:hi] )。

Возвращенная точка вставкиi Множествоa Разделен на две половинки, чтобы все элементы слеваval Удовлетворять ( val ) И все элементы справаval Удовлетворять ( val > x for val in a[i:hi] )。

bisect.bisect(a, x, lo=0, hi=len(a))

и bisect_right Функция функции точно так же

bisect.insort_left(a, x, lo=0, hi=len(a))

буду x Вставлятьa В середине и держатьсяa По-прежнему заказ. Это эквивалентно a.insert(bisect.bisect_left(a, x, lo, hi), x) Предполагатьa Уже отсортирован. Помните, o (log n) поиск контролируется медленным этапом вставки o (n).

bisect.insort_right(a, x, lo=0, hi=len(a))

и insort_left Похоже, но будетx Вставлятьa Всеx Задняя сторона (справа).

bisect.insort(a, x, lo=0, hi=len(a))

и insort_right Функция функции точно такая же.

Случайный модуль

Вступление

Случайный модуль Python реализует различные распределенные генераторы псевдослучайных чисел.

Для целых чисел существуют функции, которые объединяются из определенного диапазона. Для последовательностей существует функция объединения случайных элементов, используемых для генерации функции случайного расположения списка и функций для случайной выборки без замены.

На настоящем валу существует функция расчета равномерного, нормального (гауссова), логарифма, отрицательного указателя, гамма и распределения Betum. Чтобы генерировать распределение угла, вы можете использовать распределение VON MISE.

Почти все функции в этом модуле зависит от основных функций random Он генерирует случайный номер плавающей точки в полуоткрытом интервале [0,0, 1,0). Python использует Mersenne Twister в качестве основного генератора. Он создает номер с плавающей запятой номер 53-разрядной точности, и цикл 2 ** 19937-1, что реализует быструю безопасность и потоков в основе под C. Mersenne Twister является одним из наиболее распространенных генераторов случайных номеров. Однако из-за его полного детерминизма он не применяется ко всем целям и не подходит для целей шифрования.

Функция, предоставленная этим модулем на самом деле random.Random Метод связывания скрытого экземпляра класса. Вы можете мститься к себе Random Класс для получения генератора, который не обменивается государством.

Если вы хотите использовать генератор фонда, вы также можете подкласс Random Класс: В этом случае перегрузка random() 、 seed() 、 getstate() а также setstate() метод. Новые генераторы также могут обеспечить getrandbits() Метод — это позволяет randrange() Создайте выбор в любом диапазоне.

Этот модуль также обеспечивает SystemRandom Класс, он использует системные функции os.urandom() Источник, поставляемый из операционной системы, генерирует случайное число.

предупреждать : Псевдослучайный генератор этого модуля не должен использоваться в целях безопасности. Для целей безопасности или шифрования см.secrets Модуль.

Функция закладки

random.seed(a=None, version=2)

Инициализируйте генератор случайных номеров.

если a для None Текущее системное время используется. Если операционная система предоставляет случайным источником, используйте случайное источник, предоставляемый операционной системой вместо системы (для получения дополнительной информации о доступности, см. os.urandom() Функция).

если a Это INT типа и используется напрямую.

когда version В 2 (по умолчанию), str 、 bytes или bytearray Объекты будут преобразованы в int Объекты и все биты этого.

когда version В 1:00 (используется для случайной последовательности из старой версии Python) для str и bytes Алгоритм будет генерировать более узкий диапазон семян.

Обратите внимание, что при одинаковом значении семявания приведена последовательность сгенерированного случайного числа и случайное число, и ее можно увидеть следующим примером:

random.getstate()

Возвращает объект, указывающий внутреннее состояние текущего генератора. Возвращаемое значение этого метода можно передавать setstate() Метод используется для восстановления состояния генератора.

random.setstate(state)

state Это должно называться getstate() Объект, полученный методом. Этот метод используется для восстановления внутреннего состояния генератора к вызова. getstate() Состояние метода.

random.getrandbits(k)

возвращение k Бит случайное целое число.K бит случайных целых чисел означает Каждый бит — десятичное целое число, представленное количеством k-бита 2 количества случайных чисел.

random.getrandbits(5) Случайное целое число в каждом бите является случайным числом 5 битов двоичных чисел, а именно [0, 32).

random.getrandbits(8) Случайное целое число в каждом из случайном количестве 8 бит 2, то есть [0, 256) — все случайные числа.

Этот метод предусмотрен вместе с генератором MersennetWister, а некоторые другие генераторы также могут предоставлять им дополнительную часть API. Если доступно, getrandbits() Будет включен randrange() Иметь дело с любым диапазоном.

Метод целочисленного

random.randrange(stop)

random.randrange(start, stop[, step])

из range(start, stop, step) Возвращает элемент случайного выбора. Эквивалентно choice(range(start, stop,step)) Но на самом деле не построил объект диапазона.

Режим параметра положения range() Функция одинакова. Параметры ключевых слов не должны использоваться, поскольку функция может использовать их неожиданным образом.

random.randint(a, b)

Вернуть случайные целые числаN Удовлетворять a Отказ Эквивалентно randrange(a, b+1) 。

Метод последовательности

random.choice(seq)

От непустой последовательностиseq Возвращает случайный элемент. если seq Когда он пуст, IndexError 。

random.choices(population, weights=None, *, cum_weights=None, k=1)

из population Радио Выборk Элемент, возвращение из этогоk Список элементов, состоящих.

Параметрpopulationweights и cum_weights Это должен быть итеративный объект. Если указаноweights или cum_weightsТогда его длина должна бытьpopulation То же самое и не может быть указано одновременноweights и cum_weights параметр.

Если не указаноweight Никтоcum_weights Затем выберите одинаковую вероятность.

Если указаноweight Параметры, в зависимости от относительного весаpopulaiton Выбирать. Или, если даноcum_weights Последовательность, по совокупным весам (может быть использовано itertools.accumulate() Рассчитать) Например, относительный вес [10, 5, 30, 5] Эквивалентно кумулятивному весу [10, 15, 45, 50] Отказ Внутри относительный вес преобразуется в массу накопления перед тем, как сделать выбор, поэтому вес накопления может сохранять рабочую нагрузку.

weights или cum_weights Элементы в середине могут использовать любой random() возвращение float Тип значения (включая целые числа, числа плавающих точек и оценку, но не включают десятичную десятичную десятичную десятичную.

Для данного семени имеет равный взвешивание choices() Функция обычно генерирует и повторяется choice() Разные последовательности. choices() Используемый алгоритм использует операции с плавающей точкой для реализации внутренней консистенции и скорости. choice() Используемый алгоритм используется для повторения целочисленных операций, чтобы избежать небольших отклонений, вызванных ошибками округления.

random.shuffle(x[, random])

Последовательностьx Случайное неупорядоченное положение.

Дополнительные параметрыrandom Является функцией параметра 0, которая возвращает случайную плавающую точку в [0,0, 1,0); использование по умолчанию random.random() функция.

Чтобы изменить последовательность без переменной и вернуть новый хаос, пожалуйста, используйте sample(x, k=len(x)) 。

Обратите внимание, что даже относительно небольшая последовательность длиныxx Общее количество договоренностей также может быстро расти больше, чем цикл большинства генераторов случайных чисел. Это означает, что большинство последовательностей длинных последовательностей никогда не будут генерироваться. Например, последовательность, имеющая длину 2080, представляет собой максимальную последовательность, которая может быть установлена ​​в течение периода генератора случайного числа чисел Mersenne Twister.

random.sample(population, k)

От итеративного объектаpopulation Радио Выборk Элементы, каждый элемент может выбрать только один раз, а затем вернуть из этогоk Список элементов, состоящих. Используется для случайной выборки без повторения.

Назад, чтобы содержать отpopulation Новый список элементов, пока осталсяpopulation постоянный. Список результатов располагается в выборе, поэтому все подрезки также будут действительными случайными образцами. Это позволяет поделиться победителям лотереи (образцы) на награду и второй победитель (подшут).

population Элемент не обязательно является уникальным или кошкой. если population Повторяющийся элемент включен, и каждый внешний вид повторяющегося элемента возможен в образце.

Выбрать образец из серии целых чисел, используйте range() Объект действует как параметр. Этот метод особенно быстрый и бездельник для отбора проб из большого количества людей. sample(range(10000000), k=60) 。

Если размер выборки больше, чемpopulation Размер, затем срабатывает ValueError 。

Реальное распределение стоимости

Следующие функции генерируют определенное распределение реального значения. Используемый в общей математической практике, параметры функции называются в соответствующей переменной в уравнении распределения; большинство из этих уравнений можно найти в любом статистическом учебнике.

random.random()

Возвращает следующую случайную плавающую точку в [0,0, 1.0).

random.uniform(a, b)

Возвращает случайный номер с плавающей запятойN ,когда a Время a ,когда b Время b Отказ согласно с a + (b-a) * random() Плавающая точка раунд, конечная точка b Может включать или не включать в этот диапазон.

random.triangular(low, high, mode)

Возвращает случайный номер с плавающей запятойN Делать low И указан между этими границамиmodelow и high Границы по умолчанию на 0 и 1.mode Параметр по умолчанию на средней точке между границей дает симметричное распределение.

random.betavariate(alpha, beta)

Бета-распределение. Условие параметров alpha > 0 и beta > 0 Отказ Диапазон возвратов составляет от 0 до 1.

random.expovariate(lambd)

Распределение индекса.lambd Это 1,0, разделенное на среднее значение необходимого значения, оно должно быть ненулевым. (Этот параметр должен быть названlambda Но из-заlambda Уже ключевое слово в Python, поэтому изменитьlamdb)если lambd Для положительного, диапазон значения возврата составляет от 0 до бесконечности; еслиlambd Для отрицательного, возвращаемое значение от негативного до 0.

random.gammavariate(alpha, beta)

Гамма-распределение. (нет Гамма-функция! ) Состояние параметра alpha > 0 и beta > 0 。

Функция распределения вероятностей:

random.gauss(mu, sigma)

Гауссовое распределение.mu Это среднее,sigma Это стандартное отклонение. Это более определено ниже normalvariate() Функция немного быстро.

random.lognormvariate(mu, sigma)

Номер журнала распределен. Если вы используете это распределение натуральных серверов, вы получите нормальное распределение, среднееmu И стандартное отклонениеsigmamu Может быть любое значение,sigma Это должно быть больше нуля.

random.normalvariate(mu, sigma)

Нормальное распределение.mu Это среднее,sigma Это стандартное отклонение.

random.vonmisesvariate(mu, kappa)

mu Это средний угол, выраженный в дуге, от 0 до 2 *pi между,kappa Это параметр концентрации, который должен быть больше или равен нулю. если kappaБыть равным нулю, распределение сводится к равномерному случайный угол в пределах от 0 до 2 ** PI *.

random.paretovariate(alpha)

Распределение Парето.alpha Является параметром формы.

random.weibullvariate(alpha, beta)

Распределение Weibull.alpha Это пропорциональные параметры,beta Является параметром формы.

Альтернативный генератор

class random.Random([seed])

Этот класс реализует генератор псевдослучайного номера по умолчанию, используемый модулем.

class random.SystemRandom([seed])

использовать os.urandom() Класс функций генерирует случайное число с источником, предоставляемым из операционной системы. Это не подходит для всех систем. Он не зависит от состояния программного обеспечения, а последовательность не воспроизводится. следовательно, seed() Способ не фактически игнорируется. getstate() и setstate() Метод, если вы называетесь, NotImplementedError аномальный.

Hashlib модуль

Этот модуль реализует общедоступный интерфейс для многих различных хэшей и алгоритмов а также алгоритмов сообщений. Алгоритм хешистого хеша FIPS SHA1, SHA224, SHA256, SHA384 и SHA512 (определен в FIPS 180-2) и алгоритмом RSA MD5 (определено в интернет-RFC 1321). Термин «безопасное хеширование» и «сводка сообщения» взаимозаменяемы. Старый алгоритм называется сводным сообщением. Современные условия являются безопасными хэшами.

Хэш алгоритм

Каждый хеш-тип имеет конструктор. Все возвращенные объекты хэши имеют тот же простой интерфейс. Например: используйтеsha256()Создайте объект HASH SHA-256, теперь вы можете использовать метод Update () * для предоставления этого объектаbytes-like Объект (обычноbytes). Вы можете использовать в любое времяdigest() или hexdigest() Метод запрашивает резюме подключения к данным.

Конструктор хеш-алгоритма в этом модуле всегда доступен.sha1()、sha224()、sha256()、sha384()、sha512()、blake2b() иblake2s()md5() Обычно доступны, но если вы используете редкий Python «FIPS совместимые», — может отсутствоватьmd5()Отказ Другие алгоритмы также могут быть предусмотрены на основе библиотеки OpenSSL, используемой на платформе на платформе. На большинстве платформ,sha3_224()、sha3_256()、sha3_384()、sha3_512()、shake_128() и shake_256() Это также доступно.

Метод модуля и атрибут

Этот модуль предоставляет следующие постоянные атрибуты:

hashlib.algorithms_guaranteed

Этот модуль содержит коллекцию хэш-алгоритмов, поддерживаемых на всех платформах. Обратите внимание, что хотя некоторые поставщики выше по потоку предоставляют странные «FIPS» Python Build, его исключено, ноmd5 Все еще содержатся в этом списке.

hashlib.algorithms_available

Коллекция имен хеш-алгоритма доступных в бегущем интерпретатере Python. Эти имена будут доставленыnew() Быть идентифицированным.

algorithms_guaranteed Также подмножество этого атрибута. Этот же алгоритм может появиться несколько раз в этой коллекции (благодаря OpenSSL).

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

  • MD5 () хеш MD5 (128-бит)
  • Sha1 () Ша1 хеш (160)
  • SHA224 () SHA224 хеш (224-битный)
  • Sha256 () Ша256 хеш (256-битный)
  • SHA384 () SHA384 хэш (384-бит)
  • SHA512 () SHA512 половина (512)

Резюме экземпляров объектов, возвращенные этими функциямиd Существуют следующие методы и свойства:

Используйте новые данные для обновления хэша.data должно быть bytes-likes Объект. Повторные вызовы такие же, как эффект односмысления с данными, используемыми последовательно.

d.digest()

Верните сводку как оригинальную байтовую строку.

d.hexdigest()

Возвращает текстовую строку, сводный код представляет собой серию шестнадцатеричных чисел.

Возвращает сводную копию, копия сохраняет внутреннее состояние исходного резюме.

d.digest_size

Возвращает размер байта хеш.

d.block_size

Внутренний блочный байт размер хеш-алгоритма.

d.name

Возвращает стандартное имя хеш-алгоритма, используемого текущим сводным объектом. Всегда пишите, и всегда действуйте какnew() Параметры метода используются для генерации нового сводного объекта.

Этот модуль также предоставляет дополнительный конструктор:

hashlib.new(name[, data])

Это универсальный конструктор,name Это строка, указывающая имя алгоритма стойки, необязательноdata Параметр используется для указания данных, используемых для обновления хэши, должно бытьbytes-like Объект. Это также позволяет доступ к любым другим алгоритмам, которые, перечисленные выше хеша, и библиотека OpenSSL может быть доступна. Название конструктивной функции намного лучше, чем этот конструктор, следует использовать в качестве предпочтительной.

Резюме переменной длины алгоритма встряхивания

shake_128 и shake_256 Предоставить переменную суммарную информацию, поэтомуdigest() и hex_digest() Метод требует параметра, используемого для указания длиныlengthИ максимальная длина не ограничивается алгоритмом встряхивания.

Экспорт ключей

Полученный ключ и алгоритм расширения ключей предназначен для защищенного пароля HASHH. Такие как sha1(password) Такой простой алгоритм не может противостоять насилию атаки. Хороший пароль имеет высокую скорость, медленно, включая одинsalt。

hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)

Эта функция основана на PKCS#5 Функция распределения ключа пароля 2. Оно используетHMAC Как псевдослучайная функция.

Нитьhash_name Да HMAC Например, желаемое имя хеш-абстрактного алгоритма.sha1 или sha256

password и salt должно бытьbytes или bytearray Объект. Приложения и библиотеки должныpassword Ограничен разумной длиной (например, 1024).salt Должен быть из подходящего источника, напримерos.urandom()Около 16 или более байтов.

iterations Он должен быть выбран в соответствии с хеш-алгоритмом и вычислительной мощностью. По состоянию на 2013 год рекомендуется делать по крайней мере 100000 Верховная Итерация SHA-256.

dklen Это длина полученного ключа. если dklen для NoneИспользовать хеш-алгоритмhash_name Сводный размер, такой как SHA-512, 64.

hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)

Эта функция предоставляет функцию на основе Scrypt на основе Scrypt, определенную в RFC 7914.

password и salt должно быть bytes-like Объект. Приложения и библиотеки должны ограничивать пароль до разумной длины (например, 1024).salt Должен быть из подходящего источника, напримерos.urandom()Около 16 или более байтов.

n Это коэффициент затрат CPU / памяти,r Это размер блока.p Это фактор параллелизации.maxmem Ограничьте память (OpenSSL 1.1.0 по умолчанию до 32 Mib).dklen Это длина полученного ключа.

HMAC модуль

Этот модуль реализованRFC 2104 Описан алгоритм HMAC, описанный в нем.

Метод модуля

Этот модуль содержит два метода:

hmac.new(key, msg=None, digestmod=None)

Возвращая новоеhmac Объект.key должно быть bytes или bytearray Объекты используются для обеспечения ключа. Если указаноmsg Параметр, то вызовитеupdate(msg) метод.digestmod Это сводное название объекта HMAC для использования, сводный конструктор или модуль. Он поддерживает любой подходящий дляhashlib.new() Имя, по умолчаниюhashlib.md5() Конструктор.

Примечание: MD5 какdigestmod Сводка по умолчанию не рекомендуется из версии 3.4, а версия 3.8 будет удалена.

hmac.digest(key, msg, digest)

Возвращает сводку сообщения, указывающего данный ключ и сводныйbytes Объект. Эта функция эквивалентна HMAC(key, msg, digest).digest() Однако используется оптимизированная реализация C или Inline, что быстрее, чем память, подходящая для памяти. Параметрkeymsg и digest и new() Значение в середине.

CPYPHON Реализация деталей, оптимизированная реализация C используется только при суммировании строки и сводного алгоритма, который поддерживается OpenSSL.

Метод экземпляра объекта HMAC

Объект HMAC содержит следующий экземпляр и свойства экземпляра:

HMAC.update(msg)

использовать msg Обновите объект HMAC. Дублирующие вызовы такие же, как эффект односмысления с использованием параметров серии, а именно:

m.update(a);m.update(b) и m.update(a + b) эквивалентность.

HMAC.digest()

Вернуться к текущей доставкеupdate() Байтовое резюме метода. это bytes Длина объекта будет обобщена с данным конструкторомdigest_sizeтакой же. Он может содержать не-ASCII байты, включая пустые байты.

предупреждать : В процедуре проверкиdigest() Когда вывод сравнивается с внешним резюме, рекомендуется использоватьcompare_digest() Функция == Операторы уменьшают уязвимость временных атак.

HMAC.hexdigest()

и digest() Аналогичным образом, резюме возвращается как строка, а длина всего в два раза длины шестнадцатеричного числа. Это может быть использовано для надежных значений переключения в электронной почте или других нечевных средах.

предупреждать : В процедуре проверкиhexdigest() Когда вывод сравнивается с внешним резюме, рекомендуется использоватьcompare_digest() Функция == Операторы уменьшают уязвимость временных атак.

HMAC.copy()

Возвращает копию объекта HMAC (клон). Это может быть использовано для эффективного вычисления строки Summary для совместного использования общего начальной подковы.

HMAC.compare_digest(a, b)

Используется для сравнения двух резюме. Возвращает, если то же самое верноTrueЕсли разница отличается, она возвращаетсяFalseОтказ Эта функция использует метод проектирования для предотвращения анализа синхронизации, избегая поведения короткого замыкания на основе содержимого, что делает его подходящим для криптографии.a и b Должен иметь тот же тип: либоstr(Только ASCII, например HMAC.hexdigest() Возврат) илиbytes-like Объект.

Примечание: еслиa и b Различные длины или ошибки, атака синхронизации может раскрыть оa и b Тип и длина длины, но не может раскрыть их значение.

HMAC.digest_size

Байтовая длина сводки экземпляра объекта HMAC.

HMAC.block_size

Размер байта внутреннего блока хеш-алгоритма.

HMAC.name

Нормативное имя HMAC. Обычно строчные буквы. Вооруженныйhmac-md5

Секреты модуль

Этот модуль используется для генерации зашифрованного случайного числа, подходящего для управления паролями, аутентификацией учетных записей, токенов безопасности и связанной с ней конфиденциальность.

В частности, в случайном модуле следует предпочтительнее.secretНе генератор псевдового номера по умолчанию, он предназначен для моделирования и моделирования, не безопасности или криптографии.

случайное число

Секретный модуль обеспечивает доступ к безопасному случаю случайного источника, предоставленного операционной системой.

class secrets.SystemRandom

Создайте класс случайных чисел, используя высочайший источник качества, предоставляемый операционной системой. пожалуйста, проверьте random.SystemRandom Узнайте больше деталей.

secrets.choice(sequence)

Возвращает элемент случайного выбора из непустой последовательности.

secrets.randbelow(n)

Вернулся range(0, n) Случайное целое число в пределах диапазона.

secrets.randbits(k)

возвращение k Бит случайное целое число.K бит случайных целых чисел означает Каждый бит — десятичное целое число, представленное количеством k-бита 2 количества случайных чисел.

Генерировать токен

Этот модуль обеспечивает функцию генерации токена безопасности. Приложения для сброса пароля, сложно угадать URL и другие приложения.

secrets.token_bytes([nbytes=None])

Вернуть длинуnbytes Случайная байтовая строка. Если не предоставленоnbytes Значение параметра или параметраNoneЗначение по умолчанию будет использоваться.

secrets.token_hex([nbytes=None])

Возвращает случайную текстовую строку, представленную с использованием шестнадцатеричных чисел, строка содержитnbytes Случайный байт, каждый байт преобразуется в два шестнадцатеричных числа. Если не указаноnbytes Значение параметра или параметраNoneЗатем используйте разумное значение по умолчанию.

secrets.token_urlsafe([nbytes=None])

Возвращает случайную текстовую строку безопасности URL, содержащуюnbytes Случайный байт. Текст является Base64 кодирован, поэтому в среднем около 1,3 символа на байт. Если не указаноnbytes Значение параметра или параметраNoneЗатем используйте разумное значение по умолчанию.

Сколько байтов следует использовать?

Чтобы предотвратить насильственные атаки, токены должны иметь достаточную случайность. К сожалению, поскольку производительность компьютера становится более мощным, и может сделать больше догадаться в более короткое время, считается достаточным. По состоянию на 2015 год люди считают, что 32 байты (256-битная) случайность достаточно для удовлетворения типичных случаев использования секретных модулей.

Для тех, кто хочет управлять своим собственным токеном, они могут пройти для различныхtoken_* Функцияnbytes Параметр явно указывает случайность токена. Этот параметр считается количеством случайных байтов для использования.

В противном случае, если параметры не указаны, или параметрыNone,но token_* Функция будет использовать разумное значение по умолчанию.

Примечание. По умолчанию по умолчанию может измениться в любое время, в том числе во время выпуска технического обслуживания.

Другие функции

secrets.compare_digest(a, b)

Если строкаa и b Равный, то вернитесьTrueВ противном случае возвращаетсяFalse

Использование этого метода может снизить риск возникновения временных атак. Для более подробной информации см.hmac.compare_digest()。

Лучшие практики

Этот раздел будет введенsecrets Методы и лучшие практики для модулей управления основными уровнями безопасности.

Создайте буквенно-цифровой пароль в течение 8 символов:

Примечание. Приложение не должно хранить пароли в восстановленном формате, будь то простой текст или зашифрован. Они должны быть использованы для добавления соли и кожи.

Создание алфавитных паролей, содержащих, по меньшей мере, один заглавный символ, по меньшей мере, один заглавный символ, и, по меньшей мере, три числа:

Создайте временный URL-адрес, который трудно догадаться, что содержит токены безопасности, которые подходят для приложений для восстановления пароля:

Источник

Add Answer
|
View In TPC Matrix

Technical Problem Cluster First Answered On
February 24, 2022

Popularity
5/10

Helpfulness
2/10


Contributions From The Grepper Developer Community

Contents

Code Examples

  • Non-base32 digit found
  • Related Problems

  • binascii.error: non-base32 digit found
  • Invalid base64 sqs
  • TPC Matrix View Full Screen

    Non-base32 digit found

    Comment

    0


    Popularity

    5/10 Helpfulness
    2/10
    Language
    shell

    Source: stackoverflow.com

    Tags: digit
    shell

    Victorious Vendace

    Contributed on Feb 24 2022

    Victorious Vendace

    5 Answers  Avg Quality 7/10


    Recommend Projects

    • React photo

      React

      A declarative, efficient, and flexible JavaScript library for building user interfaces.

    • Vue.js photo

      Vue.js

      🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

    • Typescript photo

      Typescript

      TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

    • TensorFlow photo

      TensorFlow

      An Open Source Machine Learning Framework for Everyone

    • Django photo

      Django

      The Web framework for perfectionists with deadlines.

    • Laravel photo

      Laravel

      A PHP framework for web artisans

    • D3 photo

      D3

      Bring data to life with SVG, Canvas and HTML. 📊📈🎉

    Recommend Topics

    • javascript

      JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

    • web

      Some thing interesting about web. New door for the world.

    • server

      A server is a program made to process requests and deliver data to clients.

    • Machine learning

      Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

    • Visualization

      Some thing interesting about visualization, use data art

    • Game

      Some thing interesting about game, make everyone happy.

    Recommend Org

    • Facebook photo

      Facebook

      We are working to build community through open source technology. NB: members must have two-factor auth.

    • Microsoft photo

      Microsoft

      Open source projects and samples from Microsoft.

    • Google photo

      Google

      Google ❤️ Open Source for everyone.

    • Alibaba photo

      Alibaba

      Alibaba Open Source for everyone

    • D3 photo

      D3

      Data-Driven Documents codes.

    • Tencent photo

      Tencent

      China tencent open source team.

    Каталог статьи

    • Модуль UU
      • Метод модуля
      • Пример
    • Модуль Base64.
      • Метод модуля
    • Модуль бинаско
      • Функция модуля
    • Бислект модуль
      • Функция модуля
    • Случайный модуль
      • Вступление
      • Функция закладки
      • Метод целочисленного
      • Метод последовательности
      • Реальное распределение стоимости
      • Альтернативный генератор
    • Hashlib модуль
      • Хэш алгоритм
      • Метод модуля и атрибут
      • Резюме переменной длины алгоритма встряхивания
      • Экспорт ключей
    • HMAC модуль
      • Метод модуля
      • Метод экземпляра объекта HMAC
    • Секреты модуль
      • случайное число
      • Генерировать токен
        • Сколько байтов следует использовать?
        • Другие функции
      • Лучшие практики

    Модуль UU

    Метод модуля

    Этот модуль естьuuencode Формат кодов и файлов декодирования, что позволяет только использовать толькоascii Передача подключения произвольные двоичные данные. Метод кодирования и декодирования модулей и декодирования принимает файловые объекты в качестве параметров, но также могут принимать объекты подобных файлов в качестве параметров. Чтобы быть отсталым, вы также принимаете строку, содержащую имя пути, и откройте соответствующий файл для чтения и записи; имя пути- Представляет стандартный ввод или вывод. Однако этот интерфейс был отбран; вызывающий абонент лучше всего открыть сам файл и убедиться, что он используется в Windows при необходимости.rb или wb Режим открывает файл.

    Этот модуль содержит два основных метода:

    • uu.encode(in_file, out_file, name=None, mode=None, *, backtick=False)

      Поставить файлыin_file Содержимое кодируется с использованием UUENCODE, а затем записывает кодированный контентout_file документ.

      name Параметр используется для указанияout_file Поле имя файла в начале файла имя файла имени файла — это имя файла для повторного создания двоичных данных. Если этот параметр не указан,out_file Имя файла в начале файла по умолчаниюin_file Имя файла.

      mode Параметр используется для указанияout_file Поле узора в начале файла. Этот параметр предпочтительно определяется как 3-битное 8-битное число. Если не указаноmode Параметры тогдаout_file Значение поля режима в файле в файле по умолчанию644

      backtick Параметр решает, использовать ли пространство замены для замены места для представления новой линии. Это значение параметра является значением по умолчаниюFalse При использовании пробелов используйте пробелы, этот параметрTrue При использовании анти-квоты выразили новую строку.

    • uu.decode(in_file, out_file, mode=None, quiet=False)

      буду in_file Декодирование данных в закодированном uuencode и записывает декодированные данныеout_file документ.

      если out_file Параметр — это строка пути файла, когдаout_file Когда файл точек на параметр должен быть создан,mode Параметр используется для настроекout_file Разрешение разрешений файла, указывающего на файл. дефолт out_file и mode из in_file Чтение в стартовой линии. Если файл, указанный в исходной строке, уже существует, он будет запущен.uu.Error аномальный.

      Если вход генерируется ошибкой UUENCODER, метод может выводить предупреждение к стандартной ошибке, и Python может восстановиться по ошибке. буду quiet Настройки параметровTrue Это предупреждение может быть недействительным.

    Пример

    Выполните файл uuencode кодировки:

    >>> import uu
    >>> with open('example.txt', 'w') as f:
            f.writelines('this is an uuencode example.ndo you understand the uuencode?')
    >>> uu.encode('example.txt', 'uu_file.txt', 'uu.txt', 0o777, backtick=True)
    >>> with open('uu_file.txt') as f:
    ...     print(f.read())
    ... 
    begin 777 uu.txt
    M=&AI<R!I<R!A;B!U=65N8V]D92!E>&%M<&QE+@ID;R!Y;[email protected]=6YD97)S=&%N
    /9"!T:&4@=75E;F-O9&4_
    `
    end
    

    Декодирование файлов uuencode encoded:

    >>> uu.decode('uu_file.txt', 'text.txt')
    >>> with open('text.txt') as f:
    ...     print(f.read())
    ... 
    this is an uuencode example.
    do you understand the uuencode?
    

    Модуль Base64.

    Этот модуль обеспечивает функцию кодирования двоичных данных в печатный ASCII и функцию декодирования этих кодировков к двоичным данным. этоRFC 3548 Указанная базовая, кодировка BASE32 и BASE64 и широко принятая кодировка ASCII85 и BASE85 обеспечивает функции кодирования и декодирования.

    RFC 3548 Целью кодирования является создание двоичных данных может быть отправлена ​​правильно в качестве электронного письма в качестве части URL или в рамках запроса HTTP Post. Где алгоритм кодирования иuuencode Это отличается.

    Этот модуль предоставляет два интерфейса. Новый интерфейс предоставляет от объекта класса байта к байту ASCIIbytes Код и декодирование объекта класса байта или строки ASCII дляbytes Операция. Этот модуль поддерживает определениеRFC 3548 Все ALLPABETS BASE-64 (обычная, безопасность URL-безопасности и файловая система).

    Старый интерфейс не обеспечивает операцию декодирования из строки, но обеспечивает функцию кодирования и декодирования объекта файла операций. Старый интерфейс поддерживает только стандартные алфавиты Base64 и следуетRFC 2045 Спецификация добавляет новую строку каждые 76 символов. Примечание: если вам нужно поддержатьRFC 2045Так использоватьemail Модули могут быть более подходящими.

    Метод модуля

    • base64.b64encode(s, altchars=None)

      буду bytesbytearray или bytes-like Объектs Кодироватьbytes Объект.

      Еслиaltchars Параметры должны быть 2bytes-like Объект, используемый для замены стандартного алфавита Base64+ и /

      >>> base64.b64encode(b'talk is cheap, show me the code', b'-_')
      b'dGFsayBpcyBjaGVhcCwgc2hvdyBtZSB0aGUgY29kZQ=='
      
    • base64.b64decode(s, altchars=None, validate=False)

      Декодирование Base64 кодируетсяbytes-like Объект или ascii строкаs

      Еслиaltchars Параметры должны быть 2bytes-like Объект для замены+ и / персонаж.

      если s Не может быть декодирован, будет вызванbinascii.Error аномальный.

      если validate СтоимостьFalse (По умолчанию), отбрасывание не находится в режиме ожидания в режиме ожидания в режиме ожидания, прежде чем проверка заполнения не находится в стандартном алфавите Base64. если validate для TrueЭти немазонные64 символов приведут кbinascii.Error аномальный.

      Возвращаемое значениеbytes Объект.

      >>> base64.b64decode(b'dGFsayBpcyBjaGVhcCwgc2hvdyBtZSB0aGUgY29kZQ==')
      b'talk is cheap, show me the code'
      >>> # BYTES Объект содержит символы «*» в алфавите без базового64, и проверку будет вызвать исключение, когда true.
      ... base64.b64decode(b'dGFsayBpcyBjaGVhcCwgc2hvdyBtZSB0aGUgY29kZQ==*', validate=True)
      Traceback (most recent call last):
        File "<stdin>", line 2, in <module>
        File "/Users/neochen/.virtualenvs/Test/lib/python3.7/base64.py", line 86, in b64decode
          raise binascii.Error('Non-base64 digit found')
      binascii.Error: Non-base64 digit found
      >>> # BYTES Объект содержит символы «*» в алфавите Non-Base64, и Validate является значением по умолчанию false, вы можете декодировать нормально
      ... base64.b64decode(b'dGFsayBpcyBjaGVhcCwgc2hvdyBtZSB0aGUgY29kZQ==*')
      b'talk is cheap, show me the code'
      
    • base64.standard_b64encode(s)

      Используйте стандартный базовый64 алфавитный код кодировкиbytesbytearray или bytes-like Объектs Отказ Возвращаемое значениеbytes Объект.

    • base64.standard_b64decode(s)

      Используйте стандартный базовый64 алфавит декодированияbytes-like Объект или ascii строкаsОтказ Возвращаемое значениеbytes Объект.

    • base64.urlsafe_b64encode(s)

      буду bytesbytearray или bytes-like Объектs Кодироватьbytes Объект.

      Используйте URL-адрес безопасности и файловую систему Безопасный алфавит,- и _ Заменять+ и /

      Возвращаемое значениеbytes Объект.

    • base64.urlsafe_b64decode(s)

      Декодироватьbytes-like Объект или ascii строкаsИспользуйте URL-адрес безопасности и файловую систему безопасного алфавита,- и _ Заменять+ и /

      Возвращаемое значениеbytes Объект.

    • base64.b32encode(s)

      Код с базой32.bytes-like ОбъектsОтказ Возвращаемое значениеbytes Объект.

      >>> base64.b32encode(b'talk is cheap, show me the code')
      b'ORQWY2ZANFZSAY3IMVQXALBAONUG65ZANVSSA5DIMUQGG33EMU======'
      
    • base64.b32decode(s, casefold=False, map01=None)

      Декодированная база32 закодированаbytes-like Объект или ascii строкаs

      как casefold СтоимостьFalseЕсли вход может содержать только заглавные буквы. как casefold СтоимостьTrueЕсли вход может содержать строчные буквы.

      RFC 3548 Позволяет сопоставить номер 0 (ноль) на прописные буквы o, и вы можете выбрать, следует ли сопоставить номер 1 (один) в прописные буквы i или заглавную букву L. Дополнительные параметрыmap01 нет None Когда число 0 всегда отображается на прописные буквы O,map01 Значение параметра указывает сопоставление цели № 1 (заглавная буква I или строчная буква L). По соображениям безопасности значение по умолчанию установлено значениеNoneВ этом случае 0 и 1 не могут быть введены.

      Возвращаемое значениеbytes Виды.

      >>> base64.b32decode(b'ORQWY2ZANFZSAY3IMVQXALBAONUG65ZANVSSA5DIMUQGG33EMU======')
      b'talk is cheap, show me the code'
      >>> # "Casefold" значение "Когда значение по умолчанию" false ", вы не можете содержать строчные буквы.
      ... base64.b32decode(b'ORQWY2ZANFZSAY3IMVQXALBAONUG65ZANVSSA5DIMUQGG33EMU======'.lower())
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        File "/Users/neochen/.virtualenvs/Test/lib/python3.7/base64.py", line 231, in b32decode
          raise binascii.Error('Non-base32 digit found') from None
      binascii.Error: Non-base32 digit found
      >>> # «Casefold» значение «TRUE», вход может содержать строчные буквы
      ... base64.b32decode(b'ORQWY2ZANFZSAY3IMVQXALBAONUG65ZANVSSA5DIMUQGG33EMU======'.lower(), True)
      b'talk is cheap, show me the code'
      
    • base64.b16encode(s)

      Используйте кодировку BASE16bytes-like ОбъектsОтказ Возвращаемое значениеbytes Объект.

      >>> base64.b16encode(b'talk is cheap, show me the code')
      b'74616C6B2069732063686561702C2073686F77206D652074686520636F6465'
      
    • base64.b16encode(s, casefold=False)

      Декодирование базы16 закодированоbytes-like Объект или ascii строкаs

      как casefold СтоимостьFalseЕсли вход может содержать только заглавные буквы. как casefold СтоимостьTrueЕсли вход может содержать строчные буквы.

      >>> base64.b16decode(b'74616C6B2069732063686561702C2073686F77206D652074686520636F6465')
      b'talk is cheap, show me the code'
      >>> base64.b16decode(b'74616C6B2069732063686561702C2073686F77206D652074686520636F6465'.lower())
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        File "/Users/neochen/.virtualenvs/Test/lib/python3.7/base64.py", line 267, in b16decode
          raise binascii.Error('Non-base16 digit found')
      binascii.Error: Non-base16 digit found
      >>> base64.b16decode(b'74616C6B2069732063686561702C2073686F77206D652074686520636F6465'.lower(), True)
      b'talk is cheap, show me the code'
      
    • base64.encode(input, output)

      Из бинарного файла объектаinput Прочитайте данные для выполнения кодировки Base64, напишите закодированный результат в объект файлаoutput середина. Новый перерыв будет вставлен каждые 76 байтовb'n’И добавить новенький символ в концеb'n’

    • base64.decode(input, output)

      Из бинарного файла объектаinput Прочитайте данные и декодируйте, напишите результат объекта декодированного файлаoutput середина.

    • base64.encodebytes(s)

      Будет содержать любые двоичные данныеbytes-like Объектs Выполните кодировку Base64 и вернули закодированные данные. Новый перерыв будет вставлен каждые 76 байтовb'n’И добавить новенький символ в концеb'n’

    • base64.decodebytes(s)

      Декодироватьbytes-like ОбъектsИ вернуть декодированный байт.s Должна быть линию или многострочная базовая 64 закодированных данных.

    Модуль бинаско

    Модуль включает в себя множество методов преобразования между различными кодами ASCII, представленными двоичными и двоичными. Обычно эти функции не будут использоваться напрямую, ноuubase64binhex Такой пакет модуль. Чтобы иметь высокую эффективность выполнения, модуль содержит множество базовых функций, написанных с C, которые используются некоторыми расширенными модулями.

    a2b_* Функция принимает строку Unicode, содержащую только код ASCII. Другие функции принимаются толькоbytes-like Объект (например,bytesbytearray И другие объекты, которые поддерживают буферные протоколы)

    Функция модуля

    • binascii.a2b_uu(string)

      Преобразуйте одну строку UU закодированы данные в двоичные данные и возврат. Данные кодирования UU каждая строка обычно содержат 45 (двоичных) байтов, кроме последней строки. Там могут быть пробелы для каждой строки данных.

    • binascii.b2a_uu(data, *, backtick=False)

      Двоичные данные преобразуются в кодированный символ ASCII, а возвращаемое значение — это данные линии преобразования, включая новую строку.data Длина до 45. если backtick для TureЕсли нуль выражен вместо пробела.

    • binascii.a2b_base64(string)

      Преобразовать блоки данных Base64 в двоичные и возврат в двоичных данных. Многопровольные данные могут быть переданы одновременно.

    • binascii.b2a_base64(data, *, newline=True)

      Двоичные данные преобразуются в ряд base64 кодировали строки ASCII. Возвращаемое значение — это данные линии преобразования, еслиnewline для TrueВозвращаемое значение включает в себя новую строку. Выход этой функции состоит из RFC3548.

    • binascii.a2b_qp(data, header=False)

      Преобразуйте кавычку и данные для печати в двоичные данные и возврат. Вы можете конвертировать несколько строк за раз. Если дополнительные параметрыheader СуществоватьTrueЗатем подчеркивание данных в данных будет декодирована в пространстве.

    • binascii.b2a_qp(data, quotetabs=False, istext=True, header=False)

      Двоичные данные преобразуются в строку или многострочное расценка полосы и могут распечатать кодированный символ ASCII и возврат. Если дополнительные параметрыquotetabs СуществоватьTrueАльтернативно, все вкладки и пробелы кодируются. Если дополнительные параметрыistext СуществоватьTrueЗатем новая строка не закодирована, но конец конца кодируется. Если дополнительные параметрыheader СуществоватьTrueЗатем пространство будет закодировано как подчеркивание. Если дополнительные параметрыheader СуществоватьFalseЗатем обертка будет кодирована; в противном случае преобразование обертывания может повредить двоичный поток данных.

    • binascii.a2b_hqx(string)

      Данные ASCII формата Binhex4 не выполняют декомпрессию RLE непосредственно в двоичные данные. Строка должна содержать полное количество двоичных байтов, или (в последней части данных Binhex4), оставаясь, оставаясь ноль.

    • binascii.rledecode_hqx(string)

      Данные выполнены в соответствии со стандартами Binhex4. Этот алгоритм используется после данных одного байта0x90 Как индикатор повторения, то сосчитать. Считать0 Указанное байтовое значение0x90 Отказ Эта процедура возвращается в распакованные данные, и входные данные будут запущены с окончанием индикатора изолированного повторения.Incomplete аномальный.

    • binascii.rlecode_hqx(string)

      Выполните BINHEX4 стиль сжатия и результаты возврата и возврата.

    • binascii.b2a_hqx(string)

      Выполните бинарный тип Hexbin4 к преобразованию кода ASCII и верните строку результатов. Входные данные должны быть закодированы RLE, а длина данных может быть 3 (за исключением последнего сегмента).

    • binascii.crc_hqx(data, value)

      по value Как первоначальный расчет CRCdata 16-битное значение CRC возвращает результат. Используйте CRC-CCITT для генерации многочленов здесьx16 + x12 + x5 + 1, обычно выражается как0x1021Отказ CRC используется в формате Binhex4.

    • binascii.crc32(data[, value])

      Рассчитайте CRC-32, отvalue Исходный расчет начать CRCdata 32-битная контрольная сумма. Начальный CRC по умолчанию равен нулю. Этот алгоритм согласуется с Zip-файлами. Поскольку этот алгоритм предназначен для использования в качестве алгоритма контрольной суммы, он не подходит для использования в качестве универсального хэш-алгоритма. Метод выглядит следующим образом:

      print(binascii.crc32(b"hello world"))
      # Or, in two pieces:
      crc = binascii.crc32(b"hello")
      crc = binascii.crc32(b" world", crc)
      print('crc32 = {:#010x}'.format(crc))
      
    • binascii.b2a_hex(data)

      Вернуть двоичные данныеdata Шестнадцатеричное представление.data Каждый байт преобразуется в соответствующее 2-битное шестнадцатеричное представление. Таким образом, длина возвращаемого объекта байтаdata Дважды двойной.

      использовать:bytes.hex() Методы также могут быть легко достигнуты (но только возвращая только текстовые строки).

    • binascii.hexlify(data)

      Функцияb2a_hex() Функция одинакова.

    • binascii.a2b_hex(hexstr)

      Возвращение из шестигранной строкиhexstr Двоичные данные указаны. Эта функция функцииb2a_hex() Напротив.hexstr Вы должны включать даже количество шестнадцатеричных чисел (могут быть прописными или строчными буквами), в противном случае он будет вызванError аномальный.

      использовать:bytes.fromhex() Метод класса также реализует аналогичную функцию (только параметр Text String получен, а пустой символ не ограничен).

    • binascii.unhexlify(hexstr)

      Функцияa2b_hex() Функция одинакова.

    Бислект модуль

    Модуль поддерживает список последовательных обслуживаний без необходимости отсортировать список после каждой вставки. Для относительно длинного списка операция элементов в списке сравнения дороги, и метод в этом модуле является улучшением общего метода. Этот модуль называетсяbisectЭто потому, что метод используется во втором алгоритме. Исходный код этого модуля можно использовать в качестве примера второго алгоритма (граничные условия уже правильные!)

    Функция модуля

    • bisect.bisect_left(a, x, lo=0, hi=len(a))

      Вернуться к вставкеa Элементарный элементx Индекс точки вставки, предполагаяa Это уже отсортировано.a Может бытьlist,tuple,array Элементы могут быть отсортированы или итеративный объект.

      Параметрlo и hi Может использоваться для указания подмножества, который необходимо учитывать в списке; весь список используется по умолчанию. если x В появленииa В середине точка вставки будет вa Все вx Спереди (слева). Этот метод предполагаетa Уже отсортировано, возвращаемое значение подходит для использованияlist.insert() Первый параметр.

      Возвращенная точка вставкиi Множествоa Разделен на две половинки, чтобы все элементы слеваval Удовлетворять (val < x for val in a[lo:i]) И все элементы справаval Удовлетворять (val >= x for val in a[i:hi])。

      >>> bisect.bisect_left(range(10), 7)
      7
      
    • bisect.bisect_right(a, x, lo=0, hi=len(a))

      Аналогичныйbisect_left()Тем не менее, индекс точки возврата всегда вa Все существующиеx Спина (справа).

      Возвращенная точка вставкиi Множествоa Разделен на две половинки, чтобы все элементы слеваval Удовлетворять (val < x for val in a[lo:i]) И все элементы справаval Удовлетворять (val >= x for val in a[i:hi])。

      Возвращенная точка вставкиi Множествоa Разделен на две половинки, чтобы все элементы слеваval Удовлетворять (val <= x for val in a[lo:i]) И все элементы справаval Удовлетворять (val > x for val in a[i:hi])。

      >>> bisect.bisect_right(range(10), 7)
      8
      
    • bisect.bisect(a, x, lo=0, hi=len(a))

      и bisect_right Функция функции точно так же

    • bisect.insort_left(a, x, lo=0, hi=len(a))

      буду x Вставлятьa В середине и держатьсяa По-прежнему заказ. Это эквивалентноa.insert(bisect.bisect_left(a, x, lo, hi), x)Предполагатьa Уже отсортирован. Помните, o (log n) поиск контролируется медленным этапом вставки o (n).

      >>> seq = list(range(10))
      >>> bisect.insort_left(seq, 7)
      >>> seq
      [0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9]
      
    • bisect.insort_right(a, x, lo=0, hi=len(a))

      и insort_left Похоже, но будетx Вставлятьa Всеx Задняя сторона (справа).

      >>> seq = list(range(1, 11))
      >>> seq
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      >>> bisect.insort_right(seq, 7)
      >>> seq
      [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10]
      
    • bisect.insort(a, x, lo=0, hi=len(a))

      и insort_right Функция функции точно такая же.

    Случайный модуль

    Вступление

    Случайный модуль Python реализует различные распределенные генераторы псевдослучайных чисел.

    Для целых чисел существуют функции, которые объединяются из определенного диапазона. Для последовательностей существует функция объединения случайных элементов, используемых для генерации функции случайного расположения списка и функций для случайной выборки без замены.

    На настоящем валу существует функция расчета равномерного, нормального (гауссова), логарифма, отрицательного указателя, гамма и распределения Betum. Чтобы генерировать распределение угла, вы можете использовать распределение VON MISE.

    Почти все функции в этом модуле зависит от основных функцийrandomОн генерирует случайный номер плавающей точки в полуоткрытом интервале [0,0, 1,0). Python использует Mersenne Twister в качестве основного генератора. Он создает номер с плавающей запятой номер 53-разрядной точности, и цикл 2 ** 19937-1, что реализует быструю безопасность и потоков в основе под C. Mersenne Twister является одним из наиболее распространенных генераторов случайных номеров. Однако из-за его полного детерминизма он не применяется ко всем целям и не подходит для целей шифрования.

    Функция, предоставленная этим модулем на самом делеrandom.Random Метод связывания скрытого экземпляра класса. Вы можете мститься к себеRandom Класс для получения генератора, который не обменивается государством.

    Если вы хотите использовать генератор фонда, вы также можете подклассRandom Класс: В этом случае перегрузкаrandom()seed()getstate() а также setstate() метод. Новые генераторы также могут обеспечитьgetrandbits() Метод — это позволяетrandrange() Создайте выбор в любом диапазоне.

    Этот модуль также обеспечиваетSystemRandom Класс, он использует системные функцииos.urandom() Источник, поставляемый из операционной системы, генерирует случайное число.

    предупреждать: Псевдослучайный генератор этого модуля не должен использоваться в целях безопасности. Для целей безопасности или шифрования см.secrets Модуль.

    Функция закладки

    • random.seed(a=None, version=2)

      Инициализируйте генератор случайных номеров.

      если a для None Текущее системное время используется. Если операционная система предоставляет случайным источником, используйте случайное источник, предоставляемый операционной системой вместо системы (для получения дополнительной информации о доступности, см.os.urandom() Функция).

      если a Это INT типа и используется напрямую.

      когда version В 2 (по умолчанию),strbytes или bytearray Объекты будут преобразованы вint Объекты и все биты этого.

      когда version В 1:00 (используется для случайной последовательности из старой версии Python) дляstr и bytes Алгоритм будет генерировать более узкий диапазон семян.

      Обратите внимание, что при одинаковом значении семявания приведена последовательность сгенерированного случайного числа и случайное число, и ее можно увидеть следующим примером:

      >>> import random
      >>> random.seed(100)
      >>> for _ in range(10):
      ...     print(random.randrange(10000))
      ... 
      2386
      7528
      7453
      2863
      6439
      5730
      7102
      8304
      1801
      8731
      >>> random.seed(100)
      >>> for _ in range(10):
      ...     print(random.randrange(10000))
      ... 
      2386
      7528
      7453
      2863
      6439
      5730
      7102
      8304
      1801
      8731
      >>> 
      
    • random.getstate()

      Возвращает объект, указывающий внутреннее состояние текущего генератора. Возвращаемое значение этого метода можно передаватьsetstate() Метод используется для восстановления состояния генератора.

    • random.setstate(state)

      state Это должно называтьсяgetstate() Объект, полученный методом. Этот метод используется для восстановления внутреннего состояния генератора к вызова.getstate() Состояние метода.

    • random.getrandbits(k)

      возвращение k Бит случайное целое число.K бит случайных целых чисел означает Каждый бит — десятичное целое число, представленное количеством k-бита 2 количества случайных чисел.

      Например:

      random.getrandbits(5) Случайное целое число в каждом бите является случайным числом 5 битов двоичных чисел, а именно [0, 32).

      random.getrandbits(8) Случайное целое число в каждом из случайном количестве 8 бит 2, то есть [0, 256) — все случайные числа.

      Этот метод предусмотрен вместе с генератором MersennetWister, а некоторые другие генераторы также могут предоставлять им дополнительную часть API. Если доступно,getrandbits() Будет включенrandrange() Иметь дело с любым диапазоном.

    Метод целочисленного

    • random.randrange(stop)

    • random.randrange(start, stop[, step])

      из range(start, stop, step) Возвращает элемент случайного выбора. Эквивалентноchoice(range(start, stop,step)) Но на самом деле не построил объект диапазона.

      Режим параметра положенияrange() Функция одинакова. Параметры ключевых слов не должны использоваться, поскольку функция может использовать их неожиданным образом.

    • random.randint(a, b)

      Вернуть случайные целые числаN Удовлетворятьa <= N <= bОтказ Эквивалентноrandrange(a, b+1)

    Метод последовательности

    • random.choice(seq)

      От непустой последовательностиseq Возвращает случайный элемент. если seq Когда он пуст,IndexError

    • random.choices(population, weights=None, *, cum_weights=None, k=1)

      из population Радио Выборk Элемент, возвращение из этогоk Список элементов, состоящих.

      Параметрpopulationweights и cum_weights Это должен быть итеративный объект. Если указаноweights или cum_weightsТогда его длина должна бытьpopulation То же самое и не может быть указано одновременноweights и cum_weights параметр.

      Если не указаноweight Никтоcum_weights Затем выберите одинаковую вероятность.

      Если указаноweight Параметры, в зависимости от относительного весаpopulaiton Выбирать. Или, если даноcum_weights Последовательность, по совокупным весам (может быть использованоitertools.accumulate() Рассчитать) Например, относительный вес[10, 5, 30, 5] Эквивалентно кумулятивному весу[10, 15, 45, 50]Отказ Внутри относительный вес преобразуется в массу накопления перед тем, как сделать выбор, поэтому вес накопления может сохранять рабочую нагрузку.

      weights или cum_weights Элементы в середине могут использовать любойrandom() возвращение float Тип значения (включая целые числа, числа плавающих точек и оценку, но не включают десятичную десятичную десятичную десятичную.

      Для данного семени имеет равный взвешиваниеchoices() Функция обычно генерирует и повторяетсяchoice() Разные последовательности.choices() Используемый алгоритм использует операции с плавающей точкой для реализации внутренней консистенции и скорости.choice() Используемый алгоритм используется для повторения целочисленных операций, чтобы избежать небольших отклонений, вызванных ошибками округления.

    • random.shuffle(x[, random])

      Последовательностьx Случайное неупорядоченное положение.

      Дополнительные параметрыrandom Является функцией параметра 0, которая возвращает случайную плавающую точку в [0,0, 1,0); использование по умолчаниюrandom.random() функция.

      Чтобы изменить последовательность без переменной и вернуть новый хаос, пожалуйста, используйтеsample(x, k=len(x))

      Обратите внимание, что даже относительно небольшая последовательность длиныxx Общее количество договоренностей также может быстро расти больше, чем цикл большинства генераторов случайных чисел. Это означает, что большинство последовательностей длинных последовательностей никогда не будут генерироваться. Например, последовательность, имеющая длину 2080, представляет собой максимальную последовательность, которая может быть установлена ​​в течение периода генератора случайного числа чисел Mersenne Twister.

    • random.sample(population, k)

      От итеративного объектаpopulation Радио Выборk Элементы, каждый элемент может выбрать только один раз, а затем вернуть из этогоk Список элементов, состоящих. Используется для случайной выборки без повторения.

      Назад, чтобы содержать отpopulation Новый список элементов, пока осталсяpopulation постоянный. Список результатов располагается в выборе, поэтому все подрезки также будут действительными случайными образцами. Это позволяет поделиться победителям лотереи (образцы) на награду и второй победитель (подшут).

      population Элемент не обязательно является уникальным или кошкой. если population Повторяющийся элемент включен, и каждый внешний вид повторяющегося элемента возможен в образце.

      Выбрать образец из серии целых чисел, используйтеrange() Объект действует как параметр. Этот метод особенно быстрый и бездельник для отбора проб из большого количества людей.sample(range(10000000), k=60)

      Если размер выборки больше, чемpopulation Размер, затем срабатываетValueError

    Реальное распределение стоимости

    Следующие функции генерируют определенное распределение реального значения. Используемый в общей математической практике, параметры функции называются в соответствующей переменной в уравнении распределения; большинство из этих уравнений можно найти в любом статистическом учебнике.

    • random.random()

      Возвращает следующую случайную плавающую точку в [0,0, 1.0).

    • random.uniform(a, b)

      Возвращает случайный номер с плавающей запятойN ,когда a <= b Время a <= N <= b ,когда b < a Время b <= N <= a Отказ согласно с a + (b-a) * random() Плавающая точка раунд, конечная точкаb Может включать или не включать в этот диапазон.

    • random.triangular(low, high, mode)

      Возвращает случайный номер с плавающей запятойN Делатьlow <= N <= high И указан между этими границамиmodelow и high Границы по умолчанию на 0 и 1.mode Параметр по умолчанию на средней точке между границей дает симметричное распределение.

    • random.betavariate(alpha, beta)

      Бета-распределение. Условие параметровalpha > 0 и beta > 0Отказ Диапазон возвратов составляет от 0 до 1.

    • random.expovariate(lambd)

      Распределение индекса.lambd Это 1,0, разделенное на среднее значение необходимого значения, оно должно быть ненулевым. (Этот параметр должен быть названlambda Но из-заlambda Уже ключевое слово в Python, поэтому изменитьlamdb)если lambd Для положительного, диапазон значения возврата составляет от 0 до бесконечности; еслиlambd Для отрицательного, возвращаемое значение от негативного до 0.

    • random.gammavariate(alpha, beta)

      Гамма-распределение. (нет Гамма-функция! ) Состояние параметраalpha > 0 и beta > 0

      Функция распределения вероятностей:

      pdf(x) = (x ** (alpha - 1) * math.exp(-x / beta)) / math.gamma(alpha) * beta ** alpha
      
    • random.gauss(mu, sigma)

      Гауссовое распределение.mu Это среднее,sigma Это стандартное отклонение. Это более определено нижеnormalvariate() Функция немного быстро.

    • random.lognormvariate(mu, sigma)

      Номер журнала распределен. Если вы используете это распределение натуральных серверов, вы получите нормальное распределение, среднееmu И стандартное отклонениеsigmamu Может быть любое значение,sigma Это должно быть больше нуля.

    • random.normalvariate(mu, sigma)

      Нормальное распределение.mu Это среднее,sigma Это стандартное отклонение.

    • random.vonmisesvariate(mu, kappa)

      mu Это средний угол, выраженный в дуге, от 0 до 2 *pi между,kappa Это параметр концентрации, который должен быть больше или равен нулю. если kappaБыть равным нулю, распределение сводится к равномерному случайный угол в пределах от 0 до 2 ** PI *.

    • random.paretovariate(alpha)

      Распределение Парето.alpha Является параметром формы.

    • random.weibullvariate(alpha, beta)

      Распределение Weibull.alpha Это пропорциональные параметры,beta Является параметром формы.

    Альтернативный генератор

    • class random.Random([seed])

      Этот класс реализует генератор псевдослучайного номера по умолчанию, используемый модулем.

    • class random.SystemRandom([seed])

      использовать os.urandom() Класс функций генерирует случайное число с источником, предоставляемым из операционной системы. Это не подходит для всех систем. Он не зависит от состояния программного обеспечения, а последовательность не воспроизводится. следовательно,seed() Способ не фактически игнорируется.getstate() и setstate() Метод, если вы называетесь,NotImplementedError аномальный.

    Hashlib модуль

    Этот модуль реализует общедоступный интерфейс для многих различных хэшей и алгоритмов а также алгоритмов сообщений. Алгоритм хешистого хеша FIPS SHA1, SHA224, SHA256, SHA384 и SHA512 (определен в FIPS 180-2) и алгоритмом RSA MD5 (определено в интернет-RFC 1321). Термин «безопасное хеширование» и «сводка сообщения» взаимозаменяемы. Старый алгоритм называется сводным сообщением. Современные условия являются безопасными хэшами.

    Хэш алгоритм

    Каждый хеш-тип имеет конструктор. Все возвращенные объекты хэши имеют тот же простой интерфейс. Например: используйтеsha256()Создайте объект HASH SHA-256, теперь вы можете использовать метод Update () * для предоставления этого объектаbytes-like Объект (обычноbytes). Вы можете использовать в любое времяdigest() или hexdigest() Метод запрашивает резюме подключения к данным.

    Конструктор хеш-алгоритма в этом модуле всегда доступен.sha1()、sha224()、sha256()、sha384()、sha512()、blake2b() иblake2s()md5() Обычно доступны, но если вы используете редкий Python «FIPS совместимые», — может отсутствоватьmd5()Отказ Другие алгоритмы также могут быть предусмотрены на основе библиотеки OpenSSL, используемой на платформе на платформе. На большинстве платформ,sha3_224()、sha3_256()、sha3_384()、sha3_512()、shake_128() и shake_256() Это также доступно.

    Метод модуля и атрибут

    Этот модуль предоставляет следующие постоянные атрибуты:

    • hashlib.algorithms_guaranteed

      Этот модуль содержит коллекцию хэш-алгоритмов, поддерживаемых на всех платформах. Обратите внимание, что хотя некоторые поставщики выше по потоку предоставляют странные «FIPS» Python Build, его исключено, ноmd5 Все еще содержатся в этом списке.

      >>> hashlib.algorithms_guaranteed
      {'sha3_384', 'sha384', 'sha3_512', 'sha3_256', 'sha3_224', 'blake2b', 'md5', 'shake_256', 'blake2s', 'sha1', 'sha224', 'sha256', 'sha512', 'shake_128'}
      
    • hashlib.algorithms_available

      Коллекция имен хеш-алгоритма доступных в бегущем интерпретатере Python. Эти имена будут доставленыnew() Быть идентифицированным.

      algorithms_guaranteed Также подмножество этого атрибута. Этот же алгоритм может появиться несколько раз в этой коллекции (благодаря OpenSSL).

      >>> hashlib.algorithms_available
      {'sha3_384', 'ecdsa-with-SHA1', 'blake2s', 'sha1', 'MD5', 'sha256', 'sha3_256', 'ripemd160', 'md4', 'blake2b', 'SHA384', 'shake_256', 'SHA512', 'dsaEncryption', 'sha224', 'SHA1', 'dsaWithSHA', 'sha', 'sha512', 'shake_128', 'sha3_224', 'md5', 'MD4', 'MDC2', 'SHA256', 'RIPEMD160', 'sha384', 'mdc2', 'DSA', 'SHA', 'DSA-SHA', 'whirlpool', 'SHA224', 'sha3_512'}
      >>> hashlib.algorithms_guaranteed.issubset(hashlib.algorithms_available)
      True
      

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

    • MD5 () хеш MD5 (128-бит)
    • Sha1 () Ша1 хеш (160)
    • SHA224 () SHA224 хеш (224-битный)
    • Sha256 () Ша256 хеш (256-битный)
    • SHA384 () SHA384 хэш (384-бит)
    • SHA512 () SHA512 половина (512)

    Резюме экземпляров объектов, возвращенные этими функциямиd Существуют следующие методы и свойства:

    • d.update(data)

      Используйте новые данные для обновления хэша.data должно быть bytes-likes Объект. Повторные вызовы такие же, как эффект односмысления с данными, используемыми последовательно.

    • d.digest()

      Верните сводку как оригинальную байтовую строку.

    • d.hexdigest()

      Возвращает текстовую строку, сводный код представляет собой серию шестнадцатеричных чисел.

    • d.copy()

      Возвращает сводную копию, копия сохраняет внутреннее состояние исходного резюме.

    • d.digest_size

      Возвращает размер байта хеш.

    • d.block_size

      Внутренний блочный байт размер хеш-алгоритма.

    • d.name

      Возвращает стандартное имя хеш-алгоритма, используемого текущим сводным объектом. Всегда пишите, и всегда действуйте какnew() Параметры метода используются для генерации нового сводного объекта.

    >>> d = hashlib.sha256()  # Используйте алгоритм «SHA256» для инициализации хеш-объекта
    >>> d
    <sha256 HASH object @ 0x10d5f9b98>
    >>> d.update(b'hello world')  # Рассчитать хеш-ценность «Hello World»
    >>> d.digest()  # Получить байтовые струны, указывающие краткое изложение «Hello World»
    b"xb9M'xb9x93M>x08xa5.Rxd7xda}xabxfaxc4x84xefxe3zSx80xeex90x88xf7xacxe2xefxcdxe9"
    >>> d.hexdigest()  # Получить строку сводки «Hello World» с использованием шестнадцатеричных чисел
    'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9'
    >>> d.digest_size  # Получить размер байта резюме
    32
    >>> d.block_size  # Получить размер внутреннего блока байта резюме
    64
    >>> d1 = hashlib.sha256()
    >>> d1.update(b'hello')
    >>> d1.update(b' world')
    >>> d1.hexdigest()
    'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9'
    >>> d.hexdigest() == d1.hexdigest()  # Вы можете увидеть, что используя метод «B» Hello «и« B »More« Repear Call », и использование« B »Hello World« Одиночный одноразовый вызов «Обновление ()« Обновление () », полученного« Обновление () «Полученный метод одинаков
    True
    

    Этот модуль также предоставляет дополнительный конструктор:

    • hashlib.new(name[, data])

      Это универсальный конструктор,name Это строка, указывающая имя алгоритма стойки, необязательноdata Параметр используется для указания данных, используемых для обновления хэши, должно бытьbytes-like Объект. Это также позволяет доступ к любым другим алгоритмам, которые, перечисленные выше хеша, и библиотека OpenSSL может быть доступна. Название конструктивной функции намного лучше, чем этот конструктор, следует использовать в качестве предпочтительной.

      >>> d2 = hashlib.new('sha256', b'hello world')
      >>> d2.hexdigest()
      'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9'
      

    Резюме переменной длины алгоритма встряхивания

    shake_128 и shake_256 Предоставить переменную суммарную информацию, поэтомуdigest() и hex_digest() Метод требует параметра, используемого для указания длиныlengthИ максимальная длина не ограничивается алгоритмом встряхивания.

    • d.digest(length)
    • d.hexdigest(length)
    >>> d3 = hashlib.new('shake_256', b'hello world')
    >>> d3
    <_sha3.shake_256 object at 0x10d451bd0>
    >>> d3.hexdigest(36)
    '369771bb2cb9d2b04c1d54cca487e372d9f187f73f7ba3f65b95c8ee7798c527f4f3c2d5'
    >>> d3.digest(36)
    b"6x97qxbb,xb9xd2xb0Lx1dTxccxa4x87xe3rxd9xf1x87xf7?{xa3xf6[x95xc8xeewx98xc5'xf4xf3xc2xd5"
    

    Экспорт ключей

    Полученный ключ и алгоритм расширения ключей предназначен для защищенного пароля HASHH. Такие какsha1(password) Такой простой алгоритм не может противостоять насилию атаки. Хороший пароль имеет высокую скорость, медленно, включая одинsalt。

    • hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)

      Эта функция основана наPKCS#5 Функция распределения ключа пароля 2. Оно используетHMAC Как псевдослучайная функция.

      Нитьhash_name Да HMAC Например, желаемое имя хеш-абстрактного алгоритма.sha1 или sha256

      password и salt должно бытьbytes или bytearray Объект. Приложения и библиотеки должныpassword Ограничен разумной длиной (например, 1024).salt Должен быть из подходящего источника, напримерos.urandom()Около 16 или более байтов.

      iterations Он должен быть выбран в соответствии с хеш-алгоритмом и вычислительной мощностью. По состоянию на 2013 год рекомендуется делать по крайней мере100000 Верховная Итерация SHA-256.

      dklen Это длина полученного ключа. если dklen для NoneИспользовать хеш-алгоритмhash_name Сводный размер, такой как SHA-512, 64.

      >>> import hashlib, binascii
      >>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
      >>> binascii.b2a_hex(dk)
      b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'
      
    • hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)

      Эта функция предоставляет функцию на основе Scrypt на основе Scrypt, определенную в RFC 7914.

      password и salt должно быть bytes-like Объект. Приложения и библиотеки должны ограничивать пароль до разумной длины (например, 1024).salt Должен быть из подходящего источника, напримерos.urandom()Около 16 или более байтов.

      n Это коэффициент затрат CPU / памяти,r Это размер блока.p Это фактор параллелизации.maxmem Ограничьте память (OpenSSL 1.1.0 по умолчанию до 32 Mib).dklen Это длина полученного ключа.

    HMAC модуль

    Этот модуль реализованRFC 2104 Описан алгоритм HMAC, описанный в нем.

    Метод модуля

    Этот модуль содержит два метода:

    • hmac.new(key, msg=None, digestmod=None)

      Возвращая новоеhmac Объект.key должно быть bytes или bytearray Объекты используются для обеспечения ключа. Если указаноmsg Параметр, то вызовитеupdate(msg) метод.digestmod Это сводное название объекта HMAC для использования, сводный конструктор или модуль. Он поддерживает любой подходящий дляhashlib.new() Имя, по умолчаниюhashlib.md5() Конструктор.

      Примечание: MD5 какdigestmod Сводка по умолчанию не рекомендуется из версии 3.4, а версия 3.8 будет удалена.

      >>> d = hmac.new(hashlib.new('md5', b'password').digest(), b'hello world', 'sha256')
      >>> d
      <hmac.HMAC object at 0x10d906c18>
      >>> d.hexdigest()
      '09b75fd147dd72e4618366e530034ca57f97a2158e0b439af9a26f7008a3e6fe'
      
    • hmac.digest(key, msg, digest)

      Возвращает сводку сообщения, указывающего данный ключ и сводныйbytes Объект. Эта функция эквивалентнаHMAC(key, msg, digest).digest()Однако используется оптимизированная реализация C или Inline, что быстрее, чем память, подходящая для памяти. Параметрkeymsg и digest и new() Значение в середине.

      CPYPHON Реализация деталей, оптимизированная реализация C используется только при суммировании строки и сводного алгоритма, который поддерживается OpenSSL.

      >>> digest = hmac.digest(hashlib.new('md5', b'password').digest(), b'hello world', 'sha256')
      >>> digest
      b'txb7_xd1Gxddrxe4ax83fxe50x03Lxa5x7fx97xa2x15x8ex0bCx9axf9xa2opx08xa3xe6xfe'
      

    Метод экземпляра объекта HMAC

    Объект HMAC содержит следующий экземпляр и свойства экземпляра:

    • HMAC.update(msg)

      использовать msg Обновите объект HMAC. Дублирующие вызовы такие же, как эффект односмысления с использованием параметров серии, а именно:

      m.update(a);m.update(b) и m.update(a + b) эквивалентность.

    • HMAC.digest()

      Вернуться к текущей доставкеupdate() Байтовое резюме метода. это bytes Длина объекта будет обобщена с данным конструкторомdigest_sizeтакой же. Он может содержать не-ASCII байты, включая пустые байты.

      предупреждать: В процедуре проверкиdigest() Когда вывод сравнивается с внешним резюме, рекомендуется использоватьcompare_digest() Функция== Операторы уменьшают уязвимость временных атак.

    • HMAC.hexdigest()

      и digest() Аналогичным образом, резюме возвращается как строка, а длина всего в два раза длины шестнадцатеричного числа. Это может быть использовано для надежных значений переключения в электронной почте или других нечевных средах.

      предупреждать: В процедуре проверкиhexdigest() Когда вывод сравнивается с внешним резюме, рекомендуется использоватьcompare_digest() Функция== Операторы уменьшают уязвимость временных атак.

    • HMAC.copy()

      Возвращает копию объекта HMAC (клон). Это может быть использовано для эффективного вычисления строки Summary для совместного использования общего начальной подковы.

    • HMAC.compare_digest(a, b)

      Используется для сравнения двух резюме. Возвращает, если то же самое верноTrueЕсли разница отличается, она возвращаетсяFalseОтказ Эта функция использует метод проектирования для предотвращения анализа синхронизации, избегая поведения короткого замыкания на основе содержимого, что делает его подходящим для криптографии.a и b Должен иметь тот же тип: либоstr(Только ASCII, напримерHMAC.hexdigest() Возврат) илиbytes-like Объект.

      Примечание: еслиa и b Различные длины или ошибки, атака синхронизации может раскрыть оa и b Тип и длина длины, но не может раскрыть их значение.

      >>> digest1 = hmac.digest(hashlib.new('md5', b'password').digest(), b'hello world1', 'sha256')
      >>> digest2 = hmac.digest(hashlib.new('md5', b'password').digest(), b'hello world2', 'sha256')
      >>> hmac.compare_digest(digest1, digest2)
      False
      
    • HMAC.digest_size

      Байтовая длина сводки экземпляра объекта HMAC.

    • HMAC.block_size

      Размер байта внутреннего блока хеш-алгоритма.

    • HMAC.name

      Нормативное имя HMAC. Обычно строчные буквы. Вооруженныйhmac-md5

    Секреты модуль

    Этот модуль используется для генерации зашифрованного случайного числа, подходящего для управления паролями, аутентификацией учетных записей, токенов безопасности и связанной с ней конфиденциальность.

    В частности, в случайном модуле следует предпочтительнее.secretНе генератор псевдового номера по умолчанию, он предназначен для моделирования и моделирования, не безопасности или криптографии.

    случайное число

    Секретный модуль обеспечивает доступ к безопасному случаю случайного источника, предоставленного операционной системой.

    • class secrets.SystemRandom

      Создайте класс случайных чисел, используя высочайший источник качества, предоставляемый операционной системой. пожалуйста, проверьте random.SystemRandom Узнайте больше деталей.

    • secrets.choice(sequence)

      Возвращает элемент случайного выбора из непустой последовательности.

    • secrets.randbelow(n)

      Вернулсяrange(0, n) Случайное целое число в пределах диапазона.

    • secrets.randbits(k)

      возвращение k Бит случайное целое число.K бит случайных целых чисел означает Каждый бит — десятичное целое число, представленное количеством k-бита 2 количества случайных чисел.

    Генерировать токен

    Этот модуль обеспечивает функцию генерации токена безопасности. Приложения для сброса пароля, сложно угадать URL и другие приложения.

    • secrets.token_bytes([nbytes=None])

      Вернуть длинуnbytes Случайная байтовая строка. Если не предоставленоnbytes Значение параметра или параметраNoneЗначение по умолчанию будет использоваться.

      >>> secrets.token_bytes(16)
      b'Gdxf0q+4x7fxbd.xa1xfex80rxbdx95xa0'
      
    • secrets.token_hex([nbytes=None])

      Возвращает случайную текстовую строку, представленную с использованием шестнадцатеричных чисел, строка содержитnbytes Случайный байт, каждый байт преобразуется в два шестнадцатеричных числа. Если не указаноnbytes Значение параметра или параметраNoneЗатем используйте разумное значение по умолчанию.

      >>> secrets.token_hex(16)
      'a261cdadc2469a7383a21f325ab26f21'
      
    • secrets.token_urlsafe([nbytes=None])

      Возвращает случайную текстовую строку безопасности URL, содержащуюnbytes Случайный байт. Текст является Base64 кодирован, поэтому в среднем около 1,3 символа на байт. Если не указаноnbytes Значение параметра или параметраNoneЗатем используйте разумное значение по умолчанию.

      >>> token_urlsafe(16)  
      'Drmhze6EPcv0fN_81Bj-nA'
      

    Сколько байтов следует использовать?

    Чтобы предотвратить насильственные атаки, токены должны иметь достаточную случайность. К сожалению, поскольку производительность компьютера становится более мощным, и может сделать больше догадаться в более короткое время, считается достаточным. По состоянию на 2015 год люди считают, что 32 байты (256-битная) случайность достаточно для удовлетворения типичных случаев использования секретных модулей.

    Для тех, кто хочет управлять своим собственным токеном, они могут пройти для различныхtoken_* Функцияnbytes Параметр явно указывает случайность токена. Этот параметр считается количеством случайных байтов для использования.

    В противном случае, если параметры не указаны, или параметрыNone,но token_* Функция будет использовать разумное значение по умолчанию.

    Примечание. По умолчанию по умолчанию может измениться в любое время, в том числе во время выпуска технического обслуживания.

    Другие функции

    • secrets.compare_digest(a, b)

      Если строкаa и b Равный, то вернитесьTrueВ противном случае возвращаетсяFalse

      Использование этого метода может снизить риск возникновения временных атак. Для более подробной информации см.hmac.compare_digest()。

    Лучшие практики

    Этот раздел будет введенsecrets Методы и лучшие практики для модулей управления основными уровнями безопасности.

    Создайте буквенно-цифровой пароль в течение 8 символов:

    import string
    alphabet = string.ascii_letters + string.digits
    password = ''.join(choice(alphabet) for i in range(8))
    

    Примечание. Приложение не должно хранить пароли в восстановленном формате, будь то простой текст или зашифрован. Они должны быть использованы для добавления соли и кожи.

    Создание алфавитных паролей, содержащих, по меньшей мере, один заглавный символ, по меньшей мере, один заглавный символ, и, по меньшей мере, три числа:

    >>> import string
    >>> from secrets import choice
    >>> def get_token():
    ...     alphabet = string.ascii_letters + string.digits
    ...     while True:
    ...         password = ''.join(choice(alphabet) for _ in range(10))
    ...         if (any(c.islower() for c in password)
    ...                 and any(c.isupper() for c in password)
    ...                 and sum(c.isdigit() for c in password) >= 3):
    ...             return password
    ... 
    >>> print(get_token())
    7xca361JhZ
    

    Генерировать одинСтиль XKCD пароль:

    >>> from secrets import choice
    >>> # В стандартных системах Linux используйте удобный словарь. Другие платформы могут потребоваться предоставить свой собственный список слов.
    ... with open('/usr/share/dict/words') as f:
    ...     words = [word.strip() for word in f]
    ...     password = ' '.join(choice(words) for i in range(4))
    ... 
    >>> password
    'Macaranga moveability underwrought trimesinic'
    

    Создайте временный URL-адрес, который трудно догадаться, что содержит токены безопасности, которые подходят для приложений для восстановления пароля:

    >>> url = 'https://mydomain.com/reset=' + secrets.token_urlsafe()
    >>> url
    'https://mydomain.com/reset=2VzXzxF6fYkw7VCmkZy2_r7PeLpQCqBzrrrhRvouOE8'
    

    Add Answer
    |
    View In TPC Matrix

    Technical Problem Cluster First Answered On
    February 24, 2022

    Popularity
    5/10

    Helpfulness
    2/10


    Contributions From The Grepper Developer Community

    Contents

    Code Examples

  • Non-base32 digit found
  • Related Problems

  • binascii.error: non-base32 digit found
  • Invalid base64 sqs
  • TPC Matrix View Full Screen

    Non-base32 digit found

    Comment

    0


    Popularity

    5/10 Helpfulness
    2/10
    Language
    shell

    Source: stackoverflow.com

    Tags: digit
    shell

    Victorious Vendace

    Contributed on Feb 24 2022

    Victorious Vendace

    5 Answers  Avg Quality 7/10


    Source code for base64

    #! /usr/bin/python3.9
    
    """Base16, Base32, Base64 (RFC 3548), Base85 and Ascii85 data encodings"""
    
    # Modified 04-Oct-1995 by Jack Jansen to use binascii module
    # Modified 30-Dec-2003 by Barry Warsaw to add full RFC 3548 support
    # Modified 22-May-2007 by Guido van Rossum to use bytes everywhere
    
    import re
    import struct
    import binascii
    
    
    __all__ = [
        # Legacy interface exports traditional RFC 2045 Base64 encodings
        'encode', 'decode', 'encodebytes', 'decodebytes',
        # Generalized interface for other encodings
        'b64encode', 'b64decode', 'b32encode', 'b32decode',
        'b16encode', 'b16decode',
        # Base85 and Ascii85 encodings
        'b85encode', 'b85decode', 'a85encode', 'a85decode',
        # Standard Base64 encoding
        'standard_b64encode', 'standard_b64decode',
        # Some common Base64 alternatives.  As referenced by RFC 3458, see thread
        # starting at:
        #
        # http://zgp.org/pipermail/p2p-hackers/2001-September/000316.html
        'urlsafe_b64encode', 'urlsafe_b64decode',
        ]
    
    
    bytes_types = (bytes, bytearray)  # Types acceptable as binary data
    
    def _bytes_from_decode_data(s):
        if isinstance(s, str):
            try:
                return s.encode('ascii')
            except UnicodeEncodeError:
                raise ValueError('string argument should contain only ASCII characters')
        if isinstance(s, bytes_types):
            return s
        try:
            return memoryview(s).tobytes()
        except TypeError:
            raise TypeError("argument should be a bytes-like object or ASCII "
                            "string, not %r" % s.__class__.__name__) from None
    
    
    # Base64 encoding/decoding uses binascii
    
    [docs]def b64encode(s, altchars=None):
        """Encode the bytes-like object s using Base64 and return a bytes object.
    
        Optional altchars should be a byte string of length 2 which specifies an
        alternative alphabet for the '+' and '/' characters.  This allows an
        application to e.g. generate url or filesystem safe Base64 strings.
        """
        encoded = binascii.b2a_base64(s, newline=False)
        if altchars is not None:
            assert len(altchars) == 2, repr(altchars)
            return encoded.translate(bytes.maketrans(b'+/', altchars))
        return encoded
    
    
    [docs]def b64decode(s, altchars=None, validate=False):
        """Decode the Base64 encoded bytes-like object or ASCII string s.
    
        Optional altchars must be a bytes-like object or ASCII string of length 2
        which specifies the alternative alphabet used instead of the '+' and '/'
        characters.
    
        The result is returned as a bytes object.  A binascii.Error is raised if
        s is incorrectly padded.
    
        If validate is False (the default), characters that are neither in the
        normal base-64 alphabet nor the alternative alphabet are discarded prior
        to the padding check.  If validate is True, these non-alphabet characters
        in the input result in a binascii.Error.
        """
        s = _bytes_from_decode_data(s)
        if altchars is not None:
            altchars = _bytes_from_decode_data(altchars)
            assert len(altchars) == 2, repr(altchars)
            s = s.translate(bytes.maketrans(altchars, b'+/'))
        if validate and not re.fullmatch(b'[A-Za-z0-9+/]*={0,2}', s):
            raise binascii.Error('Non-base64 digit found')
        return binascii.a2b_base64(s)
    
    
    [docs]def standard_b64encode(s):
        """Encode bytes-like object s using the standard Base64 alphabet.
    
        The result is returned as a bytes object.
        """
        return b64encode(s)
    
    [docs]def standard_b64decode(s):
        """Decode bytes encoded with the standard Base64 alphabet.
    
        Argument s is a bytes-like object or ASCII string to decode.  The result
        is returned as a bytes object.  A binascii.Error is raised if the input
        is incorrectly padded.  Characters that are not in the standard alphabet
        are discarded prior to the padding check.
        """
        return b64decode(s)
    
    
    _urlsafe_encode_translation = bytes.maketrans(b'+/', b'-_')
    _urlsafe_decode_translation = bytes.maketrans(b'-_', b'+/')
    
    [docs]def urlsafe_b64encode(s):
        """Encode bytes using the URL- and filesystem-safe Base64 alphabet.
    
        Argument s is a bytes-like object to encode.  The result is returned as a
        bytes object.  The alphabet uses '-' instead of '+' and '_' instead of
        '/'.
        """
        return b64encode(s).translate(_urlsafe_encode_translation)
    
    [docs]def urlsafe_b64decode(s):
        """Decode bytes using the URL- and filesystem-safe Base64 alphabet.
    
        Argument s is a bytes-like object or ASCII string to decode.  The result
        is returned as a bytes object.  A binascii.Error is raised if the input
        is incorrectly padded.  Characters that are not in the URL-safe base-64
        alphabet, and are not a plus '+' or slash '/', are discarded prior to the
        padding check.
    
        The alphabet uses '-' instead of '+' and '_' instead of '/'.
        """
        s = _bytes_from_decode_data(s)
        s = s.translate(_urlsafe_decode_translation)
        return b64decode(s)
    
    
    
    # Base32 encoding/decoding must be done in Python
    _b32alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
    _b32tab2 = None
    _b32rev = None
    
    [docs]def b32encode(s):
        """Encode the bytes-like object s using Base32 and return a bytes object.
        """
        global _b32tab2
        # Delay the initialization of the table to not waste memory
        # if the function is never called
        if _b32tab2 is None:
            b32tab = [bytes((i,)) for i in _b32alphabet]
            _b32tab2 = [a + b for a in b32tab for b in b32tab]
            b32tab = None
    
        if not isinstance(s, bytes_types):
            s = memoryview(s).tobytes()
        leftover = len(s) % 5
        # Pad the last quantum with zero bits if necessary
        if leftover:
            s = s + b'' * (5 - leftover)  # Don't use += !
        encoded = bytearray()
        from_bytes = int.from_bytes
        b32tab2 = _b32tab2
        for i in range(0, len(s), 5):
            c = from_bytes(s[i: i + 5], 'big')
            encoded += (b32tab2[c >> 30] +           # bits 1 - 10
                        b32tab2[(c >> 20) & 0x3ff] + # bits 11 - 20
                        b32tab2[(c >> 10) & 0x3ff] + # bits 21 - 30
                        b32tab2[c & 0x3ff]           # bits 31 - 40
                       )
        # Adjust for any leftover partial quanta
        if leftover == 1:
            encoded[-6:] = b'======'
        elif leftover == 2:
            encoded[-4:] = b'===='
        elif leftover == 3:
            encoded[-3:] = b'==='
        elif leftover == 4:
            encoded[-1:] = b'='
        return bytes(encoded)
    
    [docs]def b32decode(s, casefold=False, map01=None):
        """Decode the Base32 encoded bytes-like object or ASCII string s.
    
        Optional casefold is a flag specifying whether a lowercase alphabet is
        acceptable as input.  For security purposes, the default is False.
    
        RFC 3548 allows for optional mapping of the digit 0 (zero) to the
        letter O (oh), and for optional mapping of the digit 1 (one) to
        either the letter I (eye) or letter L (el).  The optional argument
        map01 when not None, specifies which letter the digit 1 should be
        mapped to (when map01 is not None, the digit 0 is always mapped to
        the letter O).  For security purposes the default is None, so that
        0 and 1 are not allowed in the input.
    
        The result is returned as a bytes object.  A binascii.Error is raised if
        the input is incorrectly padded or if there are non-alphabet
        characters present in the input.
        """
        global _b32rev
        # Delay the initialization of the table to not waste memory
        # if the function is never called
        if _b32rev is None:
            _b32rev = {v: k for k, v in enumerate(_b32alphabet)}
        s = _bytes_from_decode_data(s)
        if len(s) % 8:
            raise binascii.Error('Incorrect padding')
        # Handle section 2.4 zero and one mapping.  The flag map01 will be either
        # False, or the character to map the digit 1 (one) to.  It should be
        # either L (el) or I (eye).
        if map01 is not None:
            map01 = _bytes_from_decode_data(map01)
            assert len(map01) == 1, repr(map01)
            s = s.translate(bytes.maketrans(b'01', b'O' + map01))
        if casefold:
            s = s.upper()
        # Strip off pad characters from the right.  We need to count the pad
        # characters because this will tell us how many null bytes to remove from
        # the end of the decoded string.
        l = len(s)
        s = s.rstrip(b'=')
        padchars = l - len(s)
        # Now decode the full quanta
        decoded = bytearray()
        b32rev = _b32rev
        for i in range(0, len(s), 8):
            quanta = s[i: i + 8]
            acc = 0
            try:
                for c in quanta:
                    acc = (acc << 5) + b32rev[c]
            except KeyError:
                raise binascii.Error('Non-base32 digit found') from None
            decoded += acc.to_bytes(5, 'big')
        # Process the last, partial quanta
        if l % 8 or padchars not in {0, 1, 3, 4, 6}:
            raise binascii.Error('Incorrect padding')
        if padchars and decoded:
            acc <<= 5 * padchars
            last = acc.to_bytes(5, 'big')
            leftover = (43 - 5 * padchars) // 8  # 1: 4, 3: 3, 4: 2, 6: 1
            decoded[-5:] = last[:leftover]
        return bytes(decoded)
    
    
    # RFC 3548, Base 16 Alphabet specifies uppercase, but hexlify() returns
    # lowercase.  The RFC also recommends against accepting input case
    # insensitively.
    [docs]def b16encode(s):
        """Encode the bytes-like object s using Base16 and return a bytes object.
        """
        return binascii.hexlify(s).upper()
    
    
    [docs]def b16decode(s, casefold=False):
        """Decode the Base16 encoded bytes-like object or ASCII string s.
    
        Optional casefold is a flag specifying whether a lowercase alphabet is
        acceptable as input.  For security purposes, the default is False.
    
        The result is returned as a bytes object.  A binascii.Error is raised if
        s is incorrectly padded or if there are non-alphabet characters present
        in the input.
        """
        s = _bytes_from_decode_data(s)
        if casefold:
            s = s.upper()
        if re.search(b'[^0-9A-F]', s):
            raise binascii.Error('Non-base16 digit found')
        return binascii.unhexlify(s)
    
    #
    # Ascii85 encoding/decoding
    #
    
    _a85chars = None
    _a85chars2 = None
    _A85START = b"<~"
    _A85END = b"~>"
    
    def _85encode(b, chars, chars2, pad=False, foldnuls=False, foldspaces=False):
        # Helper function for a85encode and b85encode
        if not isinstance(b, bytes_types):
            b = memoryview(b).tobytes()
    
        padding = (-len(b)) % 4
        if padding:
            b = b + b'' * padding
        words = struct.Struct('!%dI' % (len(b) // 4)).unpack(b)
    
        chunks = [b'z' if foldnuls and not word else
                  b'y' if foldspaces and word == 0x20202020 else
                  (chars2[word // 614125] +
                   chars2[word // 85 % 7225] +
                   chars[word % 85])
                  for word in words]
    
        if padding and not pad:
            if chunks[-1] == b'z':
                chunks[-1] = chars[0] * 5
            chunks[-1] = chunks[-1][:-padding]
    
        return b''.join(chunks)
    
    def a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False):
        """Encode bytes-like object b using Ascii85 and return a bytes object.
    
        foldspaces is an optional flag that uses the special short sequence 'y'
        instead of 4 consecutive spaces (ASCII 0x20) as supported by 'btoa'. This
        feature is not supported by the "standard" Adobe encoding.
    
        wrapcol controls whether the output should have newline (b'\n') characters
        added to it. If this is non-zero, each output line will be at most this
        many characters long.
    
        pad controls whether the input is padded to a multiple of 4 before
        encoding. Note that the btoa implementation always pads.
    
        adobe controls whether the encoded byte sequence is framed with <~ and ~>,
        which is used by the Adobe implementation.
        """
        global _a85chars, _a85chars2
        # Delay the initialization of tables to not waste memory
        # if the function is never called
        if _a85chars2 is None:
            _a85chars = [bytes((i,)) for i in range(33, 118)]
            _a85chars2 = [(a + b) for a in _a85chars for b in _a85chars]
    
        result = _85encode(b, _a85chars, _a85chars2, pad, True, foldspaces)
    
        if adobe:
            result = _A85START + result
        if wrapcol:
            wrapcol = max(2 if adobe else 1, wrapcol)
            chunks = [result[i: i + wrapcol]
                      for i in range(0, len(result), wrapcol)]
            if adobe:
                if len(chunks[-1]) + 2 > wrapcol:
                    chunks.append(b'')
            result = b'n'.join(chunks)
        if adobe:
            result += _A85END
    
        return result
    
    def a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' tnrv'):
        """Decode the Ascii85 encoded bytes-like object or ASCII string b.
    
        foldspaces is a flag that specifies whether the 'y' short sequence should be
        accepted as shorthand for 4 consecutive spaces (ASCII 0x20). This feature is
        not supported by the "standard" Adobe encoding.
    
        adobe controls whether the input sequence is in Adobe Ascii85 format (i.e.
        is framed with <~ and ~>).
    
        ignorechars should be a byte string containing characters to ignore from the
        input. This should only contain whitespace characters, and by default
        contains all whitespace characters in ASCII.
    
        The result is returned as a bytes object.
        """
        b = _bytes_from_decode_data(b)
        if adobe:
            if not b.endswith(_A85END):
                raise ValueError(
                    "Ascii85 encoded byte sequences must end "
                    "with {!r}".format(_A85END)
                    )
            if b.startswith(_A85START):
                b = b[2:-2]  # Strip off start/end markers
            else:
                b = b[:-2]
        #
        # We have to go through this stepwise, so as to ignore spaces and handle
        # special short sequences
        #
        packI = struct.Struct('!I').pack
        decoded = []
        decoded_append = decoded.append
        curr = []
        curr_append = curr.append
        curr_clear = curr.clear
        for x in b + b'u' * 4:
            if b'!'[0] <= x <= b'u'[0]:
                curr_append(x)
                if len(curr) == 5:
                    acc = 0
                    for x in curr:
                        acc = 85 * acc + (x - 33)
                    try:
                        decoded_append(packI(acc))
                    except struct.error:
                        raise ValueError('Ascii85 overflow') from None
                    curr_clear()
            elif x == b'z'[0]:
                if curr:
                    raise ValueError('z inside Ascii85 5-tuple')
                decoded_append(b'')
            elif foldspaces and x == b'y'[0]:
                if curr:
                    raise ValueError('y inside Ascii85 5-tuple')
                decoded_append(b'x20x20x20x20')
            elif x in ignorechars:
                # Skip whitespace
                continue
            else:
                raise ValueError('Non-Ascii85 digit found: %c' % x)
    
        result = b''.join(decoded)
        padding = 4 - len(curr)
        if padding:
            # Throw away the extra padding
            result = result[:-padding]
        return result
    
    # The following code is originally taken (with permission) from Mercurial
    
    _b85alphabet = (b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                    b"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>[email protected]^_`{|}~")
    _b85chars = None
    _b85chars2 = None
    _b85dec = None
    
    def b85encode(b, pad=False):
        """Encode bytes-like object b in base85 format and return a bytes object.
    
        If pad is true, the input is padded with b'\0' so its length is a multiple of
        4 bytes before encoding.
        """
        global _b85chars, _b85chars2
        # Delay the initialization of tables to not waste memory
        # if the function is never called
        if _b85chars2 is None:
            _b85chars = [bytes((i,)) for i in _b85alphabet]
            _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars]
        return _85encode(b, _b85chars, _b85chars2, pad)
    
    def b85decode(b):
        """Decode the base85-encoded bytes-like object or ASCII string b
    
        The result is returned as a bytes object.
        """
        global _b85dec
        # Delay the initialization of tables to not waste memory
        # if the function is never called
        if _b85dec is None:
            _b85dec = [None] * 256
            for i, c in enumerate(_b85alphabet):
                _b85dec[c] = i
    
        b = _bytes_from_decode_data(b)
        padding = (-len(b)) % 5
        b = b + b'~' * padding
        out = []
        packI = struct.Struct('!I').pack
        for i in range(0, len(b), 5):
            chunk = b[i:i + 5]
            acc = 0
            try:
                for c in chunk:
                    acc = acc * 85 + _b85dec[c]
            except TypeError:
                for j, c in enumerate(chunk):
                    if _b85dec[c] is None:
                        raise ValueError('bad base85 character at position %d'
                                        % (i + j)) from None
                raise
            try:
                out.append(packI(acc))
            except struct.error:
                raise ValueError('base85 overflow in hunk starting at byte %d'
                                 % i) from None
    
        result = b''.join(out)
        if padding:
            result = result[:-padding]
        return result
    
    # Legacy interface.  This code could be cleaned up since I don't believe
    # binascii has any line length limitations.  It just doesn't seem worth it
    # though.  The files should be opened in binary mode.
    
    MAXLINESIZE = 76 # Excluding the CRLF
    MAXBINSIZE = (MAXLINESIZE//4)*3
    
    [docs]def encode(input, output):
        """Encode a file; input and output are binary files."""
        while True:
            s = input.read(MAXBINSIZE)
            if not s:
                break
            while len(s) < MAXBINSIZE:
                ns = input.read(MAXBINSIZE-len(s))
                if not ns:
                    break
                s += ns
            line = binascii.b2a_base64(s)
            output.write(line)
    
    
    [docs]def decode(input, output):
        """Decode a file; input and output are binary files."""
        while True:
            line = input.readline()
            if not line:
                break
            s = binascii.a2b_base64(line)
            output.write(s)
    
    def _input_type_check(s):
        try:
            m = memoryview(s)
        except TypeError as err:
            msg = "expected bytes-like object, not %s" % s.__class__.__name__
            raise TypeError(msg) from err
        if m.format not in ('c', 'b', 'B'):
            msg = ("expected single byte elements, not %r from %s" %
                                              (m.format, s.__class__.__name__))
            raise TypeError(msg)
        if m.ndim != 1:
            msg = ("expected 1-D data, not %d-D data from %s" %
                                              (m.ndim, s.__class__.__name__))
            raise TypeError(msg)
    
    
    def encodebytes(s):
        """Encode a bytestring into a bytes object containing multiple lines
        of base-64 data."""
        _input_type_check(s)
        pieces = []
        for i in range(0, len(s), MAXBINSIZE):
            chunk = s[i : i + MAXBINSIZE]
            pieces.append(binascii.b2a_base64(chunk))
        return b"".join(pieces)
    
    
    def decodebytes(s):
        """Decode a bytestring of base-64 data into a bytes object."""
        _input_type_check(s)
        return binascii.a2b_base64(s)
    
    
    # Usable as a script...
    def main():
        """Small main program"""
        import sys, getopt
        try:
            opts, args = getopt.getopt(sys.argv[1:], 'deut')
        except getopt.error as msg:
            sys.stdout = sys.stderr
            print(msg)
            print("""usage: %s [-d|-e|-u|-t] [file|-]
            -d, -u: decode
            -e: encode (default)
            -t: encode and decode string 'Aladdin:open sesame'"""%sys.argv[0])
            sys.exit(2)
        func = encode
        for o, a in opts:
            if o == '-e': func = encode
            if o == '-d': func = decode
            if o == '-u': func = decode
            if o == '-t': test(); return
        if args and args[0] != '-':
            with open(args[0], 'rb') as f:
                func(f, sys.stdout.buffer)
        else:
            func(sys.stdin.buffer, sys.stdout.buffer)
    
    
    def test():
        s0 = b"Aladdin:open sesame"
        print(repr(s0))
        s1 = encodebytes(s0)
        print(repr(s1))
        s2 = decodebytes(s1)
        print(repr(s2))
        assert s0 == s2
    
    
    if __name__ == '__main__':
        main()

    Понравилась статья? Поделить с друзьями:
  • Binar 5s ошибка 37 как разблокировать
  • Binance ошибка операции повторите попытку позже
  • Binance com 403 error the request could not be satisfied
  • Bin sh 1 syntax error unterminated quoted string
  • Bin sh 1 syntax error end of file unexpected expecting fi