Симметричное шифрование между .NET и Java - PullRequest
3 голосов
/ 24 октября 2011

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

На их странице я могу зашифровать данные и отправить их на свой сервер через параметр запроса при вызове ресурса на моем сайте.Это делается с помощью симметричного шифрования AES.

Мне нужно указать пароль, соль (значение должно быть шестнадцатеричным) и вектор инициализации (но не более 16 символов).

Их серверная часть - платформа .NET.Я знаю это, потому что, если я укажу IV больше, чем он ожидает, базовое исключение будет:

System.Security.Cryptography.CryptographicException: Specified initialization vector (IV) does not match the block size for this algorithm. Source: mscorlib

Так, например, на их конце я указываю:

EncryptSymmetric("Hello World","AES","P4ssw0rD","00010203040506070809", "000102030405060708090A0B0C0D0E0F")

Где входные данные: обычный текст, алгоритм, пароль, соль и IV соответственно.

Я получаю значение: eg/t9NIMnxmh412jTGCCeQ==

Если я попытаюсь расшифровать это на моем конце, используя JCE или провайдера BouncyCastle, который я получаю (тот же алгоритм, пароль, соль и IV, с1000 итераций): 2rrRdHwpKGRenw8HKG1dsA==, что совершенно другое.

Я посмотрел много разных примеров Java в Интернете о том, как расшифровать AES.Одной из таких демонстраций является следующее: http://blogs.msdn.com/b/dotnetinterop/archive/2005/01/24/java-and-net-aes-crypto-interop.aspx

Как я могу расшифровать симметричное шифрование AES, использующее парольную фразу, соль и IV, сгенерированное платформой .NET на платформе Java?

Мне не обязательно иметь возможность дешифровать содержимое строки шифрования, если я могу сгенерировать ту же сигнатуру на стороне Java и сравнить (если выясняется, что на самом деле генерируется здесь хеш).

Я использую JDK 1.5 в производстве, поэтому мне нужно использовать 1.5 для этого.

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

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Все зависит от того, как используются различные части / аргументы шифрования.

AES используется для шифрования байтов.Поэтому вам нужно преобразовать строку в байтовый массив.Поэтому вам нужно знать кодировку, используемую для преобразования строки.(UTF7, UTF8, ...).

Ключ в AES имеет фиксированные размеры.Поэтому вам нужно знать, как перейти от ключевой фразы к ключу AES с правильным битовым размером.

Поскольку вы предоставляете и соль, и IV, я полагаю, что соль не IV.В .Net нет стандартного способа обработки соли.Насколько я помню, соль в основном используется для защиты от радужных таблиц и хэшей.Потребность в соли в AES мне неизвестна.

Возможно, парольная фраза хешируется (вы не указали способ для этого) с солью, чтобы получить ключ AES.

IVне секрет.Самый простой способ - добавить зашифрованные данные к IV.Рассматривая длину зашифрованных данных, это не тот случай.

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

1 голос
/ 24 октября 2011

Насколько я вижу, проблема заключается в количестве итераций. При прочих равных условиях (соль, IV, итерации) реализация .Net генерирует тот же вывод, что и реализация Java. Я думаю, что вам, возможно, придется спросить стороннюю компанию, какие итерации они используют

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