1. Куча / Говнокод #26039

    0

    1. 1
    do { code = randomCode(); } while (code.contains("FUCK"));

    Пользователь с ником «Чапаев» опубликовал скриншот рекламного SMS-сообщения от
    сбербанка, содержащего код «CRYVKILLJEWS», что можно перевести с английского
    как «плачь, убивай евреев».

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

    (проверочный код: 8bog)

    Запостил: Steve_Brown, 22 Ноября 2019

    Комментарии (12) RSS

    • Подозреваю, что это тупо большое число в кодировке Base32 или в подобной, где используются только заглавные латинские буквы и цифры.

      12 символов по 5 значащих битов — это 60 битов. Значит, для такого слова хватит стандартного генератора 64-битных псевдослучайных чисел.
      Ответить
    • <?php
      
      function base32($input) {
      	$base32_map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567='; /* RFC 4648 */
              $binaryString = gmp_strval($input, 2);
              $fiveBitBinaryArray = str_split($binaryString, 5);
              $base32 = '';
              for($i = 0; $i < count($fiveBitBinaryArray); $i++) {    
                  $base32 .= $base32_map[base_convert(str_pad($fiveBitBinaryArray[$i], 5, '0'), 2, 10)];
              }
              return $base32;
      }
      
      $random = gmp_random_bits(60);
      
      echo base32($random) . PHP_EOL;
      Ответить
      • А теперь посчитайте вероятность, что в сгенерированном ключе:
        1) все буквы будут одинаковые
        2) будет содержаться слово "FUCK"
        3) будет содержаться последовательность символов, которую можно воспринять как непристойную или оскорбительную.
        Ответить
        • 1 и 2 ещё реально посчитать (да, вероятность будет крошечной).

          Для пункта 3 придётся составить словарь оскорбительных и непристойных последовательностей символов.
          Ответить
        • Допустим, у нас и вправду алфавит из 32 символов. 12-символьных слов, начинающихся на слово «FUCK», будет 32 в 8 степени = 2 в 40 степени. Слово FUCK может находиться в позиции 0, 1, 2, 3, 4, 5, 6, 7, 8, итого 9 вариантов. Итого у нас 9*(2^40) = 2^40 + 2^43 слов, содержащих слово «FUCK», минус повторные комбинации. Округлим до 2^43.

          Всего же 12-символьных слов у нас 2^(5*12) = 2^60. Значит, вероятность встретить слово «FUCK» порядка 1/2^17 = 1/131072 ≈ 7 × 10^(-6). Семь случаев на миллион. Т. е. если 60 миллионов клиентов «Сбербанка» получат по одной эсэмэске, то в 420 сообщениях будет содержаться слово «FUCK».
          Ответить
          • Возможно, нужно было бы придумать что-нибудь, чтобы ничего неприличного (лучше положить: ничего осмысленного) не получалось по построению. Например, чтобы сочетание букв было всегда неестественным для языка. Хотя это и уменьшит пространство кодов для заданной длины.
            Ответить
            • Можно строить по словарю. А вообще у них в паролях бывают цифры. Можно сделать так, чтобы цепочки букв обязательно перемежались цифрами. «3FU7CK4» уже как «FUCK» не воспринимается.
              Ответить
    • <?php
      
      function base32($input) {
      	$base32_map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567='; /* RFC 4648 */
              $binaryString = str_pad(gmp_strval($input, 2), 60, '0', STR_PAD_LEFT);
              $fiveBitBinaryArray = str_split($binaryString, 5);
              $base32 = '';
              for($i = 0; $i < count($fiveBitBinaryArray); $i++) {    
                  $base32 .= $base32_map[base_convert(str_pad($fiveBitBinaryArray[$i], 5, '0'), 2, 10)];
              }
              return $base32;
      }
      
      function base32_decode($input) {
      	$base32_map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567='; /* RFC 4648 */
              $bitArray = '';
              for($i = 0; $i < strlen($input); $i++) {    
                  $bitArray .= str_pad(base_convert(strpos($base32_map, $input[$i]), 10, 2), 5, '0', STR_PAD_LEFT);
              }
              return gmp_init($bitArray, 2);
      }
      
      echo base32('92065759696818898') . PHP_EOL;


      https://ideone.com/ea5Joi
      Ответить
    • 265!
      Ответить
      • Большое число получится. 69! уже содержит около сотни десятичных знаков.
        Ответить
      • https://www.wolframalpha.com/input/?i=265!
        Ответить
    • Это же промокод к сезонному вкладу Юденрат.
      Ответить

    Добавить комментарий