2016-03-01 3 views
0

В base64 разрядах вы можете сохранить до 6 бит (2**6 == 64).Как использовать urandom для генерации всех возможных символов base64?

Это означает, что вы можете поместить 3 байта в 4 base64 цифры.

64**4 == 2**24

Вот почему:

0x000000 == 'AAAA' 
0xFFFFFF == '////' 

Это означает, что случайная последовательность из 3-х байт эквивалентно base64 строка 4-х символов.

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

Давайте рассмотрим пример:

  • Если я хочу случайное 7 символов base64 строку, я должен был бы генерировать 42 случайных битов (64**7 == 2**42).

Если я использую urandom для получения 5 случайных байтов, я получу только 40 бит (5 * 8), и если запросить 6, я получу 48 бит (6 * 8).

Могу ли я запросить 6 байтов и использовать маску, чтобы сократить ее до 5 или она сломает мой случайный передел?

Одно из решений:

hex(0x123456789012 & 0xFFFFFFFFFF) 
'0x3456789012' 

Еще один:

hex(0x123456789012 >> 8) 
'0x1234567890' 

Что вы думаете?

+2

Поскольку вы получаете случайные байты из урбанда, вы также можете указать, что вы получаете случайные биты. Поэтому вы должны действительно вызывать 6 байтов и игнорировать 6 бит, чтобы получить 42 бита. Если вы решите отказаться от первых 6 или последних 6 бит, в этом случае это не имеет значения. – dmaij

+0

, но вы должны хотя бы использовать/dev/random вместо/dev/urandom, чтобы улучшить вашу энтропию. – dmaij

+0

Если я правильно понял, то другое решение всегда будет генерировать несколько из трех байтов base64 и вырезать строку до количества символов, которые мы хотим держать? – Natim

ответ

0

base64 строки с 7 символов длиной не является кодирование файла с 5 байт (40 бит: не менее, не более)

40% 6 = 4

base64 потребности добавить 2 more bits, а затем, с 42 bits, 42%6=0, возможно кодирование; но будьте осторожны:

«Если я хочу случайное 7 символов base64 строку, я должен был бы генерировать 42 случайных битов (64**7 == 2**42)

на 2 дополнительных бита не являются случайными, и константы ; равны нулю.

Кардинальный номер вашего ключевого пробела не изменяется: есть 2**40 = 1099511627776, а не (64**7 == 2**42).

(64**7 == 2**42) - это кардинальное число ключевого пространства, которое содержит все возможные комбинации 64 символов длиной 7; но при фиксированных последних двух битах (в этом случае, но не имеет значения, у вас нет всех возможных комбинаций.

6 случайных байтов (48 бит) или 42 случайных бита увеличивают исходное пространство ключа; вы должны использовать 5 случайных байтов (40 бит) и отправить их в base64

+0

Да, поэтому это не соответствует моему требованию «' 64 ** 7''. – Natim

Смежные вопросы