1. C++ / Говнокод #24586

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    string pswdGen(int quantity) {
        srand(time(0));
        char chars[] = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890@\#\$\%\&\-\+\!\/\_"; // Символы, из которых будет состоять пароль 
        string password;
        for(int i = 0; i < quantity; i++) {
            password += chars[rand() % (sizeof(chars)/sizeof(*chars))]; // Добавить рандомный символ из списка в пароль
        }
        return password;
    }
    int main() {
        int charNo;
        cout << "How many characters do you want in the password?" << endl;
        cin >> charNo;
        cout << "Your new password is: " << pswdGen(charNo) << endl;
        return 0;
    }

    Генерит произвольные пароли. Говно?

    Запостил: shite, 05 Августа 2018

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

    • Вот была такая параша в криптолокерах, где использовали ГПСЧ и seed инициализировали системным временем, просили выкуп в биткоинах. Эту парашу еще потом смогли бесплатно без смс расшифровать на основе времени создания зашифрованных файлов.
      Ответить
      • А потом они на заработанные деньги всё-таки смогли купить себе книжку по криптографии?
        Ответить
      • осеменять генератор случайных чисел текущим временем это пидерство высшей категории.

        Криптолокеры не имеют ключа для расшифровки: они просто затирают данные рендомной хуйней, а после получения оплаты высылают случайную последстовательность символов.

        Не удалось расшифровать файлы? Ну, можешь обратиться в полицию
        Ответить
        • Да не, должны присылать. Иначе к ним доверия вообще не будет и никто не будет платить...
          Ответить
          • Да и на случай, если где-нибудь проколешься... И при этом зашифруешь какие-нибудь такие файлы, что высылать последовательность придется, пока нагревается паяльник.
            Ответить
            • https://ru.wikipedia.org/wiki/Penetrator_(вредоносная_программа)

              Вирус активизировался в январе 2008 года и поразил системы семи органов исполнительной власти области, городской Думы Благовещенска, избирательной комиссии области, Благовещенского городского суда, УВД по Амурской области и других учреждений.

              Хотя тут чувак что-то совсем легко отделался...
              Ответить
              • >>огда же и появилась легенда, что российский программист решил отомстить отвергнувшей его девушке,
                >>ОДИТЬ РЯДОМ И СМЕЯТЬСЯ НАД ТЕМ КАК ТЫ, СУКА, ИЩЕШЬ ВИНОВНИКА!! СОСИ ХУЙ, ЛИЖИ ПИЗДУ!! ХАХАХАХ \Penetrator\

                ох, лол
                Ответить
              • >> Предполагается, что он появился в марте 2007 года.
                >> создан 04.08.2003 9:00:00 AM

                Ясно. Статья на основе слухов.
                Ответить
                • Х.з., инфе в экзешнике тоже слепо верить не стоит. Может быть у чела дата была сбитая или он специально её перевёл. Или написал и джва четыре года ждал подходящего случая.
                  Ответить
                  • Возможно, специально перевёл. Старый экзешник вызывает меньше подозрений, чем экзешник со вчерашней датой.
                    Ответить
                • > в марте 2007 года
                  На вирустотале в инфе из хедеров написано: Compilation timestamp 2007-09-16 12:22:27.
                  Ответить
              • >> производит скрытый вызов следующих системных dll-библиотек: ... MSVBVM60.DLL ...
                Ответить
                • Скрытый вызов рантайма визуалбейсика?
                  Ответить
                • Добрый день.

                  Я -- вирус, и чтобы я работал, пожалуйста установите мой рантайм.

                  Хотя мы тут уже обсуждали что кусок вбрантайма есть на винде
                  Ответить
                • А, вон почему скрытый вызов. Он пожат UPX'ом и из-за этого все функции через LoadLibrary/GetProcAddress импортятся.
                  Ответить
      • Я эту хрень писа́л с помоШью телефона, а там ты хрен подключишь сторонние либы.
        Ответить
    • 1) Проблемы использования rand() я описывал в предыдущем генераторе паролей
      2) Скорее всего, оператор += применительно к строке будет неэффективным, особенно учитывая то что размер строки заранее известен.
      Позволю себе привести то как я бы реализовал данный тобой алгоритм.
      std::string pswdGen(int quantity) {
          const std::string chars("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890@#$%&-+!/_ ");
          
          std::random_device device;
          std::mt19937 gen(device());
          std::uniform_int_distribution<> dist(0, chars.length());
          
          std::string password(quantity, ' ');
          std::generate(password.begin(), password.end(), [&](){return chars[dist(gen)];});
      
          return password;
      }
      Ответить
      • Говно. Правда не столько в твоём коде, сколько в спеке и реализациях.

        std::random_device may be implemented in terms of an implementation-defined pseudo-random number engine if a non-deterministic source (e.g. a hardware device) is not available to the implementation. In this case each std::random_device object may generate the same number sequence.

        A notable implementation where std::random_device is deterministic is MinGW (bug 338).
        Ответить
      • З.Ы. Хотя не, вообще говнище полное даже если std::random_device не поломан. Ты же четырьмя байтами инициализируешь MT. Из-за этого всего 4ккк разных паролей получится...
        Ответить
        • Можешь раскрыть тему поподробнее, пожалуйста?
          Ответить
          • device() возвращает unsigned int. Т.е. ты инициализируешь MT одной из 4ккк комбинаций. Столько же (или чуть меньше из-за коллизий) разных паролей ты и получишь на выходе независимо от их длины. А 4 миллиарда -- это ни о чём, брутится за день. Не лучше rand()'а получается.
            Ответить
            • Спасибо, очень хорошее замечание. Поискав немного[1], нашел один из возможных фиксов:
              std::string pswdGen(int quantity) {
                  const std::string chars("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890@#$%&-+!/_ ");
                  
                  std::vector<unsigned int> random_data(std::mt19937::state_size);
                  std::random_device device;
                  
                  std::generate(std::begin(random_data), std::end(random_data), std::ref(device));
                  std::seed_seq seeds(std::begin(random_data), std::end(random_data));
                  
                  std::mt19937 gen (seeds);
                  std::uniform_int_distribution<> dist(0, chars.length()-1);
                  
                  std::string password(quantity, ' ');
                  std::generate(std::begin(password), std::end(password), [&](){return chars[dist(gen)];});
              
                  return password;
              }

              1.https://codereview.stackexchange.com/questions/109260/seed-stdmt19937-from-stdrandom-device
              Ответить
              • Да, это уже ближе к истине...

                Но с точки зрения криптографии -- тоже фигня, конечно. MT -- не самая подходящая функция для KDF. К random_device после той фразы в спеке и факапа в mingw у меня вообще никакого доверия нет.

                В общем, если бы мне надо было генерить пароли, я бы взял за основую нормальную криптографическую либу. Ну а поверх её генератора уже можно натянуть uniform_int_distribution.
                Ответить
              • Даже если предположить, что в качестве random_device нам достался качественный TRNG, то получается, что мы из него выкачали целых 2.5 килобайта. Не всем TRNG такие большие запросы нравятся, тот же /dev/random может подвиснуть пока будет копить энтропию... А реально нужно было от силы 16 байтиков.
                Ответить
                • Поэтому я за "PHP".
                  Ответить
                  • Ну да, тут не поспоришь, у вас там давным-давно openssl_real_random_pseudo_bytes() есть.
                    Ответить
                    • З.Ы. Лол, а он тоже бажный! Пишут, что под апачем иногда выдавал одинаковые значения из-за fork'а.
                      Ответить
      • В коде баг.
        std::uniform_int_distribution<> dist(0, chars.length());

        Рано или поздно породит chars.length()
        std::uniform_int_distribution<> dist(0, chars.length()-1);
        Ответить
      • Вспомнился хак с неинициализированными переменными вместо источника рандома:
        void foo() {
           unsigned seed;
           srand(seed);
          // anything can be said to be random, right?
        }
        Ответить
        • Ага, а потом прога форматирует тебе диск, ибо конпелятор только и ждал, когда ты допустишь UB.

          З.Ы. Версия с srand(&seed) поинтересней выглядит с учётом ASLR.
          Ответить
        • Вспомнилось.
          https://xkcd.com/221/
          Ответить
        • Если программа запускается на ноутбуке или на планшете/смартфоне, то можно рассчитывать на наличие микрофона, с которого можно снять недетерминированный сигнал.
          Ответить
          • Мне больше понравился источник энтропии из вебки, засунутой в непрозрачную банку.
            Ответить
            • Гораздо лучшим источником, гм, энтропии стала бы банка пепси, засунутая в твой немытЫй анус.
              Ответить
              • Ещё более лучшим источником, так сказать станет незакрывающаяся жестяная крышка от стеклянной бутылки со всё тем же "Pepsi", затолканная в твой анал (да и "bormand"-а тоже).
                Ответить
                • В мой анал легко поместится вся бутылка, и для тебя с бормандом останется место.
                  Ответить
                • Кто о чём, а русня о бутылках.
                  Ответить
            • https://youtu.be/1cUUfMeOijg
              Ответить
              • "1C" - говно.
                Факт.
                Отправлено автоматически. Ругаться бесполезно.
                Ответить
          • На планшете/смартфоне рандом можно из гироскопа и акселерометра брать, при этом можно попросить владельца потрясти девайс.
            Кажется в каком-то старом приложении на Java для взаимодействия с банком (работа с расчетным счетом там, платежи принимать-отправлять) было еще такое окошечко сраное, в котором надо было мышкой порисовать какой-то хуйни, чтоб рандом собрался
            Ответить
            • Пидар ты ебаный, кипар
              Ответить
            • И какой это будет рандом, если гироскопом и акселерометром можно управлять?

              А, ты про подпись. Тогда в принципе да
              Ответить
    • Как насчет этого говна?
      char alphabet[] = "Insert your alphabet here, faggots.";
      size_t i, bytes;
      scanf("%zu", &bytes);
      char buf[bytes], password[bytes + 1];
      int fd = open("/dev/urandom", O_RDONLY);
      read(fd, buf, bytes);
      
      for (i = 0; i < bytes; i++)
          password[i] = alphabet[buf[i] % sizeof(alphabet)];
      close(fd);
      
      password[bytes] = '\0';
      printf("%s\n", password);
      Ответить
      • Неравномерненькое распределение. Часть букв будет выпадать чаще, чем остальные.
        Ответить
        • Чтобы было равномерным, нужно переводить в плавпитух, умножать на коэффициент, а потом округлять до ближайшего?
          Ответить
          • А чем тебе тут поможет плавучий питух?

            Вот есть у тебя 200 шаров и 3 коробки. Сможешь ли ты равномерно раскидать эти шары по коробкам? Очевидно, что нет.

            Чтобы не потерять равномерность распределения придётся часть вариантов выкинуть (рероллить на них рандом пока не выпадет что-то хорошее).

            Например, если при преобразованнии [0; 200) в [0; 3) у тебя выпадает 198 или 199, то ты тупо рероллишь новое число из [0; 200) пока не выпадет что-то поменьше.
            Ответить
            • Оба, что с аватарой ? Что всякие нироавтоматы это приходящее и уходящее, а мехи сражающиеся с "ангелами" вечны?
              Ответить
              • 2B на аватарке совсем недолго прожила т.к. кто-то поставил себе похожую.
                Ответить
    • https://vk.com/wall-39243732_1345782
      Ответить
    • Перевёл на J:
      clockCounter =: 6!:9
      
      setSeed =: 9!:1
      
      pswdGen =: {&a.@+&33@?@$&93
      
      main =: verb define
      	setSeed >.(2^31)|clockCounter''
          stdout 'Скока? '
          qntt =. {. _1 ". (] {~ i.@i.&LF) stdin ''
          if. qntt < 0 do.
              stdout  'Ты пидор.'
              exit 1
          end.
          stdout 'Вот: ', ": pswdGen qntt
          exit 0
      )
      
      main ''
      Как оказалось, J не умеет прочитать из stdin одну строку, он читает усё до eof.
      Ответить
      • Переведи на "PHP".
        Ответить
      • > stdout 'Вот: ', ": pswdGen qntt
        Это то же самое, если бы в программе на C++ было бы:
        cout << "Your new password is: " << string(pswdGen(charNo)) << endl;
        Ответить
    • Сам так делал - только рандоматор надо другой.
      Ответить
    • Высрал еще один пример, на этот раз хуевее:
      #include <iostream>
      #include <string>
      #include <cstdlib>
      #include <ctime>
      #define next ;
      #define zero 0
      #define one 1
      #define two 2
      #define three 3
      #define four 4
      #define five 5
      #define six 6
      #define seven 7
      #define eight 8
      #define nine 9
      #define dot .
      #define begin {
      #define end }
      #define open (
      #define close )
      #define sqopen [
      #define sqclose ]
      #define less <=
      #define xless <
      #define greater >=
      #define xgreater >
      #define isnt !=
      #define isequal ==
      #define mustbe =
      #define write cout
      #define plus +
      #define minus -
      #define multi *
      #define divby /
      #define incr +=
      #define decr -=
      using namespace std next
       
      string pswdGen open int quantity close begin
          srand open time open 0 close close next
          char chars sqopen sqclose mustbe "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890@\#\$\%\&\-\+\!\/\_" next
          string password next
          for open int i = zero next i xless quantity next i++ close begin
              password incr chars sqopen rand open close % open sizeof open chars close divby sizeof open *chars close close sqclose next
          end
          return password next
      end
      int main open close begin
          int charNo next
          write << "How many characters do you want in the password?" << endl next
          cin >> charNo next
          write << "Your new password is: " << pswdGen open charNo close << endl next
          return zero next
      end

      И да,
      password incr chars sqopen rand open close % open sizeof open chars close divby sizeof open *chars close close sqclose next
      . Лол.
      Ответить
      • > #define dot .
        Не хватает "#define point ." для десятичной точки.
        Ответить

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