2014-01-16 5 views
1

Я видел много ответов RegEx о том, как проверить Base64, но я не могу найти их специально для представлений 256-битных чисел.Подтвердить 256-разрядные номера с кодировкой Base64 для цифровых ключей подписи

Я новичок в Base64, байтовых преобразованиях и RegEx. This answer, по-видимому, лучше всего подходит для проверки Base64, но я не могу сказать по деталям, если он может быть специально применен к представлению 256-битного номера.

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$ 

мне нужно, чтобы убедиться в справедливости этих строк, потому что я использую их в качестве кодировок клавиш Ed25519, и мой en/decoder, кажется, принимает не-ASCII символов.

Я действительно не понимаю, может ли это быть применено к представлению 256-битного номера.

Как RegEx может проверить 256-разрядный номер в кодировке Base64?

+2

Я не думаю, что нет ничего особенного bas64, когда оригинал был номер. Если вы хотите его проверить, сначала расшифруйте его. – Barmar

+0

@Barmar Спасибо, что посмотрели Бармара! Это для ключей Ed25519, поэтому я должен быть очень уверен, что то, что дает пользователь, является истинным 256-битным числом, закодированным в Base64. Базовый 64 де/кодировщик, который я использую, кажется, принимает символы, отличные от ASCII, которые, как я думаю, не будут работать с Ed25519 при декодировании. –

ответ

4

Как portforwardpodcast указывал, 256 битное число будет декодируется в 43 символов с одним = в конце в качестве наполнителя.

Только первые четыре бита используются для числа, которое представляет 43-й символ, поэтому он может быть только символом, представляющим число, в котором два последних бита равны нулю.

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

^[A-Za-z0-9+/]{42}[AEIMQUYcgkosw048]=$ 
+0

Огромное вам спасибо, Гуффа! Я так новичок в регулярном выражении, что, хотя я думаю, что так и есть, мне все равно нужно спросить: проверяет ли это хвост '='? Кроме того, для 256-битного номера не первый символ перед '=' имеет меньше возможностей? Огромное спасибо заранее! –

+1

@ Gracchus: Да, вы правы в отношении последнего персонажа, и я уже изучал это. '' '' Перед '' 'в регулярном выражении проверяет, что последний символ' = '. – Guffa

+0

Спасибо, очень, очень много Гуффа за очень тщательный ответ! –

0

Я бы предпринять следующие шаги:

  • Выполнить существующий RegEx решить, если она действует base64 или нет
  • Если это правда, расшифровывает из base64 и посмотреть, если есть 256 бит или 32 байта.
    • Я считаю, что это 256-битное число: ampqampqampqampqampqampqampqampqampqampqamo= Все 256-разрядные номера будут иметь одинаковую длину при кодировании в base64. Это означает, что у всех их будет 43 символа, за которым следует одно = всего 44 символа. Вы должны иметь возможность использовать это как ярлык для определения строки, кодированной base64, представляет 256 бит.
+0

Спасибо, что ответили на portforwardpodcast! Я использую это для цифровых подписей, поэтому я должен быть абсолютно уверен. Я могу использовать это регулярное выражение, убедитесь, что строка длиной 44, заканчивается только одним '=', но мне нужно быть на 100% уверенным. –

+0

Если вам нужно быть на 100% уверенным, тогда сгенерируйте 1000 случайных примеров ключей, base64 закодируйте их и проверьте, как они выглядят. Согласно wikipedia, «кодировка Base64 преобразует три октета в четыре кодированных символа». Таким образом, один октет - 8 бит, поэтому ваш ключ имеет 32 октета. (32/3) * 4 = 42,6. Base64 использует = дополнение в конце для учета доли. http://en.wikipedia.org/wiki/Base64 – portforwardpodcast

+0

Еще раз спасибо portforwardpodcast! Я почти уверен, что я где-то читал, что 256-битное число с кодировкой Base64 будет иметь меньше возможностей для символа перед '='. Знаете ли вы, что это такое и как это проверить? –