Проблема при XOR шифровании строки битов, которая содержит пустые места - PullRequest
0 голосов
/ 29 января 2019

У меня здесь пароль в виде двоичной строки:

01110101 01101000 01010100 01000100 01000011 01000100 00110111 00111000 00110110 00110010 00110100 01100111 00100110 00110000 00111001 00111000 00111101 ...

И сообщение в виде двоичной строки:

01001000 01100001 01101100 01101100 01101111 01101100 01100101 01101100 01100101 01100001 01110011 01100100 01100110

Я пробовал много разных способов XOR для этих 2 строк, и этомоя последняя попытка:

public static String encrypt(String str) {
        String pwBinary = getBinaryString(pw);
        String msgBinary = getBinaryString(str);
        StringBuilder temp = new StringBuilder();


        int count = 0;


        for(int i = 0; i < msgBinary.length(); i++) {


            if(!(i%8==count)) {

                if(msgBinary.charAt(i) == pwBinary.charAt(i)) {

                    temp.append(0);
                }else {

                    temp.append(1);
                }


            }else if(i!=0) {
                temp.append(" ");
                count++;
                i++;
            }

        }
        return temp.toString();
    }

Вывод всегда начинает портиться где-то посередине ...

0111101 0001001 0111000 0101000 0101100 0101000 1010010 1010100 10100110010100110010001110000000110010000000

Я не знаю, как правильно получить пустые места :( Заранее спасибо: -)

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Рабочая версия вашего решения (с нелогичными комментируемыми частями):

public static String encrypt(String str) {
    String pwBinary = getBinaryString(pw);
    String msgBinary = getBinaryString(str);
    StringBuilder temp = new StringBuilder();
    //no idea what count was supposed to do!!!
    for(int i = 0; i < msgBinary.length(); i++) {
        if(((i+1)%9!=0)) {//the space occurs once in every 9 times
            if(msgBinary.charAt(i) == pwBinary.charAt(i)) {
                temp.append(0);
            }else {
                temp.append(1);
            }
        }else {
            temp.append(" ");
            //why should we increment i? the for loop does it automatically!
        }
    }
    return temp.toString();
}

, но более быстрый (с точки зрения загрузки процессора) способ достижения вашей цели:

public static String encrypt(String str) {
    String pw = "pass";
    byte[] pwb=pw.getBytes(),msb=str.getBytes(),xor_result;
    xor_result=new byte[msb.length];
    int j=0;
    while(j<pwb.length){
        xor_result[j]=(byte)(0xff &(pwb[j]^msb[j]));//you see in this code at least 8 bits are xored in one instruction depending on the processor(or am i wrong!?)
        j++;
    }
    return getBinaryString(new String( xor_result));
}
0 голосов
/ 30 января 2019

Я нашел простое решение, хотя мне потребовалось некоторое время, чтобы определить мою ошибку в рассуждениях:

public static String encrypt(String str) {
        String pwBinary = getBinaryString(pw);
        String msgBinary = getBinaryString(str);
        StringBuilder temp = new StringBuilder();

        int x = 8;

        for(int i = 0; i < msgBinary.length(); i++) {


            if(i == x) {
                temp.append(" ");
                x+=9;

            }else if(msgBinary.charAt(i) == pwBinary.charAt(i)) {

            temp.append(0);
            }else {

            temp.append(1);
            }


        }
        return temp.toString();
    }
...