Длина строк относительно операции XOR для байтового массива - PullRequest
1 голос
/ 21 марта 2012

Я создаю алгоритм шифрования и XOR две строки. Хотя я знаю, как выполнить XOR для двух строк, проблема в длине. У меня есть два байтовых массива, один для простого текста, который имеет переменный размер, а затем ключ, который имеет 56 байтов, скажем То, что я хочу знать, является правильным методом XORing двух строк. Объединить их в одну строку в двоичном и XOR двух значений? У каждой позиции байтового массива XOR есть двоичное значение ключа и тому подобное. Любая помощь с благодарностью.

С уважением, Милинда

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Для кодирования просто перемещайтесь по массиву байтов из простого текста, повторяя ключ по мере необходимости с оператором mod%.Обязательно используйте один и тот же набор символов на обоих концах.Концептуально мы повторяем ключ, как этот, игнорируя кодировку.

hello world, there are sheep
secretsecretsecretsecretsecr

Encrypt

String plainText = "hello world, there are sheep";
Charset charSet = Charset.forName("UTF-8");
byte[] plainBytes = plainText.getBytes(charSet);
String key = "secret";
byte[] keyBytes = key.getBytes(charSet);

byte[] cipherBytes = new byte[plainBytes.length];
for (int i = 0; i < plainBytes.length; i++) {

    cipherBytes[i] = (byte) (plainBytes[i] ^ keyBytes[i
            % keyBytes.length]);
}
String cipherText = new String(cipherBytes, charSet);
System.out.println(cipherText);

Чтобы расшифровать, просто поверните вспять процесс.

// decode
for (int i = 0; i < cipherBytes.length; i++) {

    plainBytes[i] = (byte) (cipherBytes[i] ^ keyBytes[i
            % keyBytes.length]);
}
plainText = new String(plainBytes, charSet); // <= make sure same charset both ends
System.out.println(plainText);
2 голосов
/ 21 марта 2012

(Как отмечено в комментариях, вы не должны использовать это для чего-то реального. Правильную криптографию невероятно сложно сделать правильно с нуля - не делайте этого сами, используйте существующие реализации.)

Там неттакое понятие, как «XOR», когда дело доходит до струн, действительно.XOR указывает результат, заданный двумя битами , а текст не состоит из битов - он состоит из символов .

Теперь вы могли просто возьмите Unicode-представление каждого символа (целое число) и XOR эти целые числа вместе - но результатом может быть последовательность целых чисел, которая не является допустимым представлением Unicode любой допустимой строки.

Не ясно, что вы даже думаете, как правильно начать - вы говорите о наличии строк, но также о 56 байтах .Вы можете иметь закодированное представление строки (например, результат преобразования строки в UTF-8), но это не одно и то же.

Если у вас есть два байтовых массива,Вы можете легко XOR их вместе - и, возможно, вернуться к началу одного из них, если он короче другого, так что результат всегда будет той же длины, что и более длинный массив.Однако даже если оба input являются (скажем) текстом в кодировке UTF-8, результат часто не будет действительным текстом в кодировке UTF-8.Если вы должны иметь результат в текстовой форме, я бы рекомендовал использовать Base64 на этом этапе - есть кодировщик public domain *1025* с простым API.

...