Как использовать RIM crypto api для шифрования TripleDES без заполнения - PullRequest
2 голосов
/ 24 марта 2011

Похоже, что RIM Crypto API обеспечивает только режим заполнения PKCS5 для симметричного шифрования (3D), насколько я знаю.Я работаю с JDE 4.6.0.

Я пытаюсь предоставить криптографию для приложения blackbery, которое должно быть совместимо с существующими сервисами, которые уже используют NoPadding со стандартным API безопасности Java.

Есть ли способ расширить APIчтобы обеспечить отсутствие режимов PADDING или какой-либо другой взлом, чтобы добиться этого?

Ответы [ 3 ]

1 голос
/ 25 марта 2011

Исходя из того, что вы мне сказали, я бы использовал функцию шифрования TripleDESCBCEncryptorEngine для шифрования ваших блоков.

Существует версия функции, которая может шифровать несколько блоков одновременно, указав количество блоков.

Здесь является ссылкой на эту функцию.

Это выглядит очень просто, вы просто передаете ключ и IV в конструктор, а затем продолжаете делать вызовы .encrypt для шифрования данных.

Точно так же есть TripleDESCBCDecryptorEngine здесь .

0 голосов
/ 25 марта 2011

Если вы используете режим цепочки CBC и можете сделать так, чтобы ваши входные данные имели длину, кратную размеру блока (то есть, кратную восьми, если выражено в байтах, если блочный шифр - 3DES), тогда вам просто нужно удалить последний блок зашифрованного вывода.

При шифровании CBC входные данные ( m ) сначала добавляются в сообщение, длина которого кратна размеру блока (с PKCS # 5, путем добавления между 1 и b байтов, где b - длина блока, b = 8 для 3DES); затем он разбивается на последовательные b -байтовые блоки. Каждый из этих блоков дает зашифрованный блок одинакового размера: зашифрованный блок для блока сообщений i является результатом 3DES, примененного к битовому XOR блока сообщений i и зашифрованному блоку я-1 . Следовательно, если исходное сообщение m имеет длину, кратную b , то заполнение PKCS # 5 добавляет b байтов, то есть полный блок. Удалив последний зашифрованный блок, вы получите то, что получили бы без заполнения вообще.

Расшифровка может быть сложнее. Если API RIM ориентирован на поток (если он может дать вам несколько байтов открытого текста перед тем, как получить целое сообщение), то вы можете передать ему нулевые завершающие байты, пока он не вернет вам все ваше сообщение (дополнительные нулевые байты будут расшифрованы в чистый случайный ищите барахло, просто откажитесь от него). Если RIM API ориентирован на сообщения, вам придется использовать свои знания секретного ключа, чтобы восстановить действительный «последний блок» (тот, который был удален во время шифрования). А именно, в 3DES это будет означать следующее: если z является последним зашифрованным блоком сообщения (без "заполнения"), то вы шифруете пустое сообщение ( без байта) с тем же ключом, используя z в качестве «начального значения» (IV). Это должно привести к одному b -байтовому блоку, который вы просто добавляете к зашифрованному сообщению. Эффект этого дополнительного блока состоит в том, что механизм дешифрования «увидит» надлежащий отступ PKCS # 5 и прозрачно удалит его, получив ожидаемые данные.

Все вышеперечисленное предполагает, что вы используете CBC , который является наиболее распространенным режимом цепочки среди тех, которые требуют заполнения.

0 голосов
/ 25 марта 2011

Я признаю, что совсем не знаком с крипто-API RIM, но, просто прочитав документацию, он появляется, просто используя метод BlockEncryptorEngine.encrypt(), предоставляющий вам ту же функциональность, что и преобразования JCE NoPadding для блочные шифры. Так что в вашем примере это будет TripleDESEncryptorEngine.

...