用于整数的加密RC4算法

时间:2014-08-15 09:40:38

标签: java encryption rc4-cipher

基本上我可以为RC4 s成功实施String算法,该算法为Byte[]采用key数组:

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

如果我把clearText作为字符串说" 24"那么密文范围非常高,比如说> 2000年。 但对于我的算法,我需要将其限制在更少的范围~200。

我可以为int提供更好的选择吗?

这就是我在使用Strings做的事情:

加密模式:

  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"));
   }
}

1 个答案:

答案 0 :(得分:3)

当使用流密码(因为 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或使用具有所需输出长度的哈希函数