Что не так с моим DESKey (BlackBerry API)? - PullRequest
0 голосов
/ 14 июля 2010

У меня есть приложение, разработанное на BlackBerry JE 4.6.1, которое расшифровывает информацию из WebServer с использованием алгоритма DES.Если я отправляю зашифрованную информацию на сервер, она хорошо расшифровывается.Но в случае, если сервер отправляет зашифрованные данные, я не получаю правильное значение после расшифровки.Ключ должен быть одинаковым, а зашифрованная информация отправляется в кодировке base64.Во время отладки я обнаружил, что после создания DESKey его внутренние данные отличаются от байтового массива, передаваемого конструктору.Например, если я создаю DESKey следующим образом

String keyStr = "2100000A";
DESKey desKey = new DESKey(keyStr.getBytes()); // pass the byte array {'2','1','0','0','0','0','0','A'}

, метод desKey.getData () возвращает байтовый массив {'2', '1', '1', '1', '1', '1', '1', '@'}, который отличается от начальных байтов ключа.

Так возможно ли, что такое поведение DESKey может быть причиной, по которой я не могу расшифровать данные с сервера?

Спасибо.

1 Ответ

0 голосов
/ 13 сентября 2010

Ожидается поведение desKey.getData ().

Состояние doc :

DES работает на 64-битных блоках и имеет эффективную длину ключа 56 бит.На самом деле ключ равен 64 битам, но используется 8 битов четности, что означает, что эффективная длина ключа составляет всего 56 бит.Каждый восьмой бит используется для контроля четности, и это самый младший бит, который используется для контроля четности.

Бит контроля четности определение :

Контроль четностибит или контрольный бит - это бит, который добавляется для обеспечения того, чтобы число битов со значением один в наборе битов было четным или нечетным.Биты четности используются как простейшая форма кода обнаружения ошибок.

Итак, вот как это происходит:

'2' => 0x32 => 00110010 => 0011001 + (parity bit 0) => 00110010 => 0x32 => '2'
'1' => 0x31 => 00110001 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'0' => 0x30 => 00110000 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'0' => 0x30 => 00110000 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'0' => 0x30 => 00110000 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'0' => 0x30 => 00110000 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'0' => 0x30 => 00110000 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'A' => 0x41 => 01000001 => 0100000 + (parity bit 0) => 01000000 => 0x40 => '@'
...