1. Java / Говнокод #9798

    +73

    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
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    public String XOR_Encrypt(String source, String key)
        {
            byte plain_text[] = new byte[source.length()];
            plain_text = source.getBytes();
            byte key_mas[] = new byte[key.length()];
            key_mas = key.getBytes();
            int key_len = key.length();
            int crypt_pos = 0;
            for(int i = 0; i < source.length(); i++)
            {
                plain_text[i] = (byte)(plain_text[i] ^ 0xaa);
                plain_text[i] = (byte)(plain_text[i] ^ key_mas[crypt_pos]);
                if(crypt_pos >= key_len - 1)
                    crypt_pos = 0;
                else
                    crypt_pos++;
            }
    
            String EText = ByteToHexString(plain_text);
            return EText;
        }
        public static String EncodeSimmetr(String s)
        {
            int MultKey = 62142;
            int AddKey = 11719;
            byte f1[] = new byte[s.length()];
            byte f[] = new byte[s.length()];
            f = s.getBytes();
            for(int i = 0; i < s.length(); i++)
            {
                f1[i] = (byte)(f[i] ^ MultKey);
                MultKey ^= AddKey;
            }
    
            s = new String(f1);
            return s;
        }

    Система шифрования в той-же платёжке...

    Запостил: dinisoft, 28 Марта 2012

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

    • Если длина ключа и шифротекста совпадают, ключ случаен и полностью одноразовый, гаммирование считается стойким шифром.
      plain_text[i] = (byte)(plain_text[i] ^ 0xaa);
      plain_text[i] = (byte)(plain_text[i] ^ key_mas[crypt_pos]);

      Интересно, почему нельзя было сделать одной строкой.
      Ответить
      • В качестве ключа используют Base64 от пары логин:пароль, который при авторизации передаётся по голому http, даже без намёка на ssl, посему key нам известен и расшифровать, либо вообще провести левый платёж, можно без лишних хлапот.
        Мне больше интерестно: неужели для конторы с дневным оборотом в суммы с кучей знаков настолько накладно преобрести валидный сертификат и загнать трафик в https?
        Ответить
        • > Base64 от пары логин:пароль
          Тогда, собственно, даже перехватывать логин-пароль не надо. Как сообщает копетан очевидность, если проксорить два шифротекста, ключи уйдут, а статистика останется, вроде как. Плюс, сразу же можно атаковать на известные вероятные фрагменты текста, через них восстановить части ключа. Шифрование для бедных и от идиотов, да.
          Ответить
        • Как, говорите, контора называется?
          Ответить
      • шифрование с симметричным ключом....
        Ответить
      • ГАМНИРОВАНИЕ
        Ответить
      • > Интересно, почему нельзя было сделать одной строкой.
        Потому что "0xaa" требуется периодически менять.
        Ответить
        • Маловероятно. Или у меня детектор сарказма снова сломался?
          Ответить
    • Меня в вышеприведенном коде другое поразило:
      byte plain_text[] = new byte[source.length()];
      plain_text = source.getBytes();
      byte key_mas[] = new byte[key.length()];
      key_mas = key.getBytes();
      При том, что в описании String.getBytes() написано:
      "Returns a new byte array containing the characters of this string..."
      Ладно, допустим, я - параноик, не верю документации, и хочу, чтобы String XOR_Encrypt работала заведомо с _копиями_ текста и ключа, а не с оригиналами. Но тогда уж:
      byte[] srcBytesArray=source.getBytes();
      int bytesLength=srcBytesArray.length; // Кто сказал, что String.length()==String.getBytes().lengt h? А если у нас многобайтовая кодировка символов?
      byte plain_text[] = new byte[bytesLength];

      System.arraycopy(srcBytesArray,0,plain_t ext,0,bytesLength);
      Ответить
      • Сразу видно людей не из мира java (это я об авторе кода). Возможно, он раньше писал на фортране, где при присвоении массива копируется его содержимое. Строки в Java иммутабельны, поэтому делать их копии никогда не нужно. getBytes будет создавать новый массив и заполнять его согласно дефолтной кодировке системы.
        Поэтому да, новые массивы байт создаются только для того, чтобы ссылка на них была сразу перетёрта результатом вызова getBytes.
        Ответить
    • показать все, что скрытоvanished
      Ответить

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