基本上我可以为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"));
}
}
答案 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
或使用具有所需输出长度的哈希函数。