libgcrypt AES для возврата зашифрованного текста ascii?

#java #c #cryptography #java-native-interface #gnupg

#java #c #криптография #java-native-interface #gnupg

Вопрос:

Привет, я разрабатываю разделяемую библиотеку JNI, которая использует режим AES256 CFB для шифрования некоторых данных с помощью libgcrypt, а затем передает зашифрованные данные обратно в Java-приложение для дальнейшей обработки.

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

Я думал, что проблема была вызвана преобразованием буфера символов, который я использовал для хранения зашифрованных данных, в NewStringUTF () (т. Е. env-> NewStringUTF (buf)) для отправки обратно в java, поэтому есть ли способ получить / преобразовать выходные данные зашифрованных данных в ascii или была какая-то другая работа?

Большое спасибо, Foo

Ответ №1:

Почему вы используете JNI и внешние библиотеки только для шифрования строки? Используйте встроенный javax.crypto.Cipher класс Java.

Однако, что касается вашего фактического вопроса, вы должны передавать данные в виде массива байтов, а не строки. Шифры работают с байтами, а не с абстрактными кодовыми точками Unicode.

Комментарии:

1. было предписано использовать libgcrypt, иначе JCE было бы намного проще : ( метод encrypt в libgcrypt передает зашифрованные данные обратно в буфер char const, поэтому я подумал, что могу просто вернуть это как новую строку utf. Я передам массивы байтов назад и посмотрю, что из этого выйдет, приветствую

2. @Foo, я бы попытался отказаться от этого мандата. Это глупо и отнимает время разработчика, и я сомневаюсь, что это приносит какую-либо пользу. В любом случае, помните, что char в C — это байт, а не символ Юникода; естественным эквивалентом Java для a char* является a byte[] , а не a String . Преобразование его в строку проблематично, поскольку последовательность байтов не обязательно соответствует правилам UTF-8 или UTF-16 или любой другой кодировке Unicode.

3. ваши деньги там. Я изменил его, чтобы возвращать jbytearray вместо строки, и теперь он работает нормально. Приветствия 🙂