Объедините int & byte в long - PullRequest
       4

Объедините int & byte в long

1 голос
/ 09 июля 2010

У меня есть два числа: одно целое, другое байтовое.Я хочу создать из них одно длинное значение таким образом, чтобы человек, знающий значение байта, мог расшифровать исходное значение int из него.Какой лучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 09 июля 2010

Если я правильно понял ваш вопрос,

Самое простое решение, вы можете XOR 'int', используя 'byte'

Повторите процесс для расшифровки ...

         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 голос
/ 09 июля 2010

Одной из идей является применение обратимой функции количество раз, указанное байтом.

Чтобы вернуть исходный номер, просто примените обратную функцию столько же раз.

, например

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

Поиск функции реверса, оставленной в качестве упражнения для читателя .....

1 голос
/ 09 июля 2010
long mylong = (((long)mybyte) << 40) | myint;

Чтобы получить исходное значение:

int myorigint = (int)(mylong & ~(((long)mybyte) << 40));

Но для этого требуется 8-байтовый тип long.Которые не требуются стандартом C.Если длинный 4 байта, вам не повезло.Это означает, что long и int будут иметь одинаковую длину.Если sizeof(int)==sizeof(long)==4, то запрос на сохранение значения типа int и байта в long означает запрос на сохранение 5 произвольных байтов информации в 4 байта.Что совершенно невозможно.

Конечно, есть и тривиальное «решение»:

long mylong = (long)myint;

, и наоборот:

int myint = (int)mylong;

Теперь кто-то знает (или не зная!) байт может извлечь исходные данные.

Если вам нужно решение, такое, что только кто-то, кто знает правильный байт, может извлечь исходный int, вы можете использовать это:1020 *

long mylong = (long)(myint-mybyte);

и наоборот:

int myint = (int)(mylong+mybyte);

Но знайте, что шифрование четырех байтов одним байтом не будет действительно безопасным.Вы должны использовать 4-байтовую одноразовую панель для шифрования четырех байтов.Если у вас есть четырехбайтовый ключ, используйте XOR для действительно неразрушимого шифра.Нет, правда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...