Алгоритм шифрования RC4 для целых чисел

По сути, я могу успешно реализовать алгоритм RC4 для Strings, который принимает массив Byte[] для key :

byte [] key = "AAAAA".getBytes("ASCII");

Если я возьму clearText как String, скажем «24», тогда диапазон зашифрованного текста будет очень высоким, скажем > 2000 . Но для моего алгоритма мне нужно ограничить его меньшим диапазоном ~ 200.

Итак, могу ли я предложить лучший вариант для int?

Вот что я делаю со строками:

Режим шифрования:

  byte [] key = "AAAAA".getBytes("ASCII");

  String clearText = "66";


  Cipher rc4 = Cipher.getInstance("RC4");
  SecretKeySpec rc4Key = new SecretKeySpec(key, "RC4");
  rc4.init(Cipher.ENCRYPT_MODE, rc4Key);
  byte [] cipherText = rc4.update(clearText.getBytes("ASCII"));

Проверить значения:

      System.out.println("clear (ascii)        " + clearText);
      System.out.println("clear (hex)          " + DatatypeConverter.printHexBinary(clearText.getBytes("ASCII")));
      System.out.println("cipher (hex) is      " + DatatypeConverter.printHexBinary(cipherText));

- Можно ли применить какой-нибудь трюк к этим типам, чтобы получить меньшее значение int?

Расшифровать :

  Cipher rc4Decrypt = Cipher.getInstance("RC4");
  rc4Decrypt.init(Cipher.DECRYPT_MODE, rc4Key);
  byte [] clearText2 = rc4Decrypt.update(cipherText);

SSCCE:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
public class MyArcFour
{

  public static void main(String args[])throws Exception
    {


      byte [] key = "AAAAA".getBytes("ASCII");

      String clearText = "66";


      Cipher rc4 = Cipher.getInstance("RC4");
      SecretKeySpec rc4Key = new SecretKeySpec(key, "RC4");
      rc4.init(Cipher.ENCRYPT_MODE, rc4Key);

      byte [] cipherText = rc4.update(clearText.getBytes("ASCII"));

      System.out.println("clear (ascii)        " + clearText);
      System.out.println("clear (hex)          " + DatatypeConverter.printHexBinary(clearText.getBytes("ASCII")));
      System.out.println("cipher (hex) is      " + DatatypeConverter.printHexBinary(cipherText));


      Cipher rc4Decrypt = Cipher.getInstance("RC4");
      rc4Decrypt.init(Cipher.DECRYPT_MODE, rc4Key);
      byte [] clearText2 = rc4Decrypt.update(cipherText);

      System.out.println("decrypted (clear) is " + new String(clearText2, "ASCII"));
   }
}

person joey rohan    schedule 15.08.2014    source источник
comment
тогда диапазон зашифрованного текста очень велик, скажем › 2000 Что это значит?   -  person Duncan Jones    schedule 15.08.2014
comment
@Duncan результирующая строка, которую я получаю после шифрования, если вы разберете ее в int, будет высокой   -  person joey rohan    schedule 15.08.2014


Ответы (1)


При использовании потокового шифра (например, RC4) длина зашифрованного текста всегда будет равна длине открытого текста.

Это означает, что когда вы шифруете int (который имеет 4 байта), вы всегда будете получать другой int (4 байта) в качестве зашифрованного вывода. Так что теоретически, когда вы шифруете 0, вы можете получить в результате 220.
Если вам нужно значение в диапазоне 0 - 255, вы можете зашифровать только один байт.

Любой хороший алгоритм шифрования должен удовлетворять тому свойству, что при использовании одного и того же ключа шифрования k любой отдельный открытый текст p должен быть зашифрован в отдельный зашифрованный текст c.
Это свойство достижимо только при size(output) >= size(input).

Почему так должно быть?
Рассмотрим следующую функцию шифрования:

/* output = E(key, input); key = 123 */

i | o
======
1 | 17
2 | 13
3 | 17
4 | 125

Затем, когда у вас есть зашифрованный текст 17 и ключ 123, невозможно определить, было ли исходное зашифрованное значение 1 или 3.

Это означает, что если вы хотите впоследствии иметь возможность недвусмысленно расшифровывать значения, нет возможности уменьшить размер результирующего зашифрованного текста.

Если расшифровка не требуется, вы всегда можете сделать output % some_number или использовать хэш-функцию с желаемой длиной вывода.

person i_turo    schedule 15.08.2014
comment
Выдает исключение, что ключ должен быть › 40-битным :/ - person joey rohan; 15.08.2014
comment
Длина ключа должна быть >= 40 бит (5 bytes или String with 5 characters). key = 123 — это всего лишь гипотетический пример гипотетической функции шифрования. - person i_turo; 15.08.2014