我有两个数字:一个是int,另一个是byte。我想以一种知道字节值的人可以从中解密原始int的方式创建一个长值。什么是最好的方法呢?
答案 0 :(得分:2)
假设我理解你的问题是正确的,
最简单的解决方案,您可以使用'byte'
对'int'进行异或重复此过程以解密...
byte key = 8;
int secret = 123;
System.out.println("Secret : " + secret);
int encrypted = (secret ^ (key | (key << 8)));
System.out.println("Encrypted : " + encrypted );
int decrypt = (encrypted ^ (key | (key << 8)));
System.out.println("Decrypted : " + decrypt );
结果是'int'但是,你总是可以将它投入长...
答案 1 :(得分:1)
long mylong = (((long)mybyte) << 40) | myint;
要检索原始值:
int myorigint = (int)(mylong & ~(((long)mybyte) << 40));
但这需要8个字节的长度。这是C标准不要求的。如果long是4个字节,那你就不走运了。这意味着long
和int
的长度相同。如果sizeof(int)==sizeof(long)==4
,则要求在long中存储int和一个字节,要求以4个字节存储5个任意字节的信息。这是完全不可能的。
当然,还有一些简单的“解决方案”:
long mylong = (long)myint;
反之亦然:
int myint = (int)mylong;
现在,知道(或不知道!)字节的人可以检索原始数据。
如果你想要一个解决方案,只有 某人知道正确的字节可以检索原始的int,你可以使用这个:
long mylong = (long)(myint-mybyte);
并反向:
int myint = (int)(mylong+mybyte);
但是要知道用一个字节加密四个字节并不是真正安全的。您应该使用4字节的一次性填充来加密四个字节。如果您有一个四字节密钥,请使用XOR作为真正牢不可破的密码。不,真的。
答案 2 :(得分:1)
一个想法是将可逆函数应用于字节指示的次数。
要获得原始数字,只需应用反函数相同的次数。
e.g。
public static int encrypt(int value, byte key) {
int result=value;
for (int i=0; i<=(key&255); i++) {
result=Integer.rotateRight(result,7)^(i+0xCAFEBABE);
}
return result;
}
找到反向功能作为读者的练习......