Кресты / Говнокод #24586 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 shite, (Updated )

Комментарии (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 байтиков.
              Ответить
    • В коде баг.
      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.
        Ответить
      • Если программа запускается на ноутбуке или на планшете/смартфоне, то можно рассчитывать на наличие микрофона, с которого можно снять недетерминированный сигнал.
        Ответить
        • Мне больше понравился источник энтропии из вебки, засунутой в непрозрачную банку.
          Ответить
          • Гораздо лучшим источником, гм, энтропии стала бы банка пепси, засунутая в твой немытЫй анус.
            Ответить
            • Ещё более лучшим источником, так сказать станет незакрывающаяся жестяная крышка от стеклянной бутылки со всё тем же "Pepsi", затолканная в твой анал (да и "bormand"-а тоже).
              Ответить
              • В мой анал легко поместится вся бутылка, и для тебя с бормандом останется место.
                Ответить
        • На планшете/смартфоне рандом можно из гироскопа и акселерометра брать, при этом можно попросить владельца потрясти девайс.
          Кажется в каком-то старом приложении на 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 на аватарке совсем недолго прожила т.к. кто-то поставил себе похожую.
              Ответить
  • Перевёл на 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.
    Ответить
    • > 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 ." для десятичной точки.
      Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8