结合int&字节长

时间:2010-07-09 10:14:35

标签: java

我有两个数字:一个是int,另一个是byte。我想以一种知道字节值的人可以从中解密原始int的方式创建一个长值。什么是最好的方法呢?

3 个答案:

答案 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个字节,那你就不走运了。这意味着longint的长度相同。如果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;
}

找到反向功能作为读者的练习......