Использование. NET для создания 64-байтового массива Base, дублирующего код Java - PullRequest
0 голосов
/ 08 января 2020

Для работающего проекта мне нужно преобразовать строку в байтовый массив, который затем может быть передан в алгоритм дешифрования AES / CBC / PKCS5. В этом случае мне нужно взять существующий код Java, который выполняет эту работу, и преобразовать его в. NET Код ядра.

Первый шаг в коде Java - это строка:

byte[] decodedBytes = Base64.getDecoder().decode( Utils.getBytes(masterKey) );

Из того, что я нашел при поиске в Google, эта строка в C# должна повторять функциональность.

var masterKeyBytes = Convert.FromBase64String(masterKey);

И они возвращаем очень похожие байтовые массивы.

Первые 10 байтов сгенерированного массива c#: 68 163 160 50 213 109 12 103

Первые 10 байтов сгенерированного массива Java: 68 -93 -96 50 -43 109 12 103

Так что они очень похожи, но если массив Java имеет отрицательные числа, массив c# имеет то же значение, но с добавленным 256.

Являются ли они достаточно различий, чтобы отбросить более поздний код дешифрования (AES / CBC / PKCS5Padding Cipher в Java и AES / CBC / PKCS7Padding AESManaged в. NET Core) В конечном итоге проблема заключается в том, что код Java возвращает расшифрованное значение, my. NET Код ядра возвращает мусор. Поэтому я построчно просматривал код, чтобы попытаться найти различия в выходных данных, и это было первое, что я нажал.

Я не контролирую код Java и не могу его редактировать, поэтому любой Решение должно быть на. NET Только со стороны ядра. Если это невозможно, мне нужно начать весь процесс с нашими сотрудниками из inte rnet, чтобы изменить этот код, и это головная боль, которую я не ожидаю.

Ответы [ 2 ]

1 голос
/ 08 января 2020

Байты в C# по умолчанию не подписаны, так как они, как правило, представляют необработанные двоичные данные, а не фактические числа. Если вы хотите обрабатывать байты как числа со знаком, есть тип sbyte.

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

Вы можете проверить, что ваши значения в C# такие же, как в Java, приведя массив byte к массиву sbyte:

byte[] bytes = new byte[] { 68, 163, 160, 50, 213, 109, 12, 103 };
foreach (var b in bytes)
{
    Console.WriteLine((sbyte) b);
}

Отпечатки:

68
-93
-96
50
-43
109
12
103

, что соответствует вашим значениям от Java.

Если вас интересует, как одни и те же 8 бит интерпретируются как значения без знака или со знаком, прочитайте о дополнении до двух представление.

Таким образом, это не является причиной вашего программа неверна. Продолжайте отладку и не стесняйтесь задавать другой вопрос, если что-то еще появится.

0 голосов
/ 08 января 2020

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

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