#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 для achar*
является abyte[]
, а не aString
. Преобразование его в строку проблематично, поскольку последовательность байтов не обязательно соответствует правилам UTF-8 или UTF-16 или любой другой кодировке Unicode.3. ваши деньги там. Я изменил его, чтобы возвращать jbytearray вместо строки, и теперь он работает нормально. Приветствия 🙂