0

基本上我可以成功实现s 的RC4算法String,它需要一个 Byte[]数组key

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

如果我将 clearText 作为 String 说 "24" 那么密文范围非常高,比如 > 2000 。但是对于我的算法,我需要将其限制在较小的范围内~200。

那么我可以为int's 提供更好的选择吗?

这就是我对 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"));
   }
}
4

1 回答 1

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使用或使用具有所需输出长度的散列函数。

于 2014-08-15T10:58:28.040 回答