#java #string #encryption #cryptography
#java #строка #шифрование #криптография
Вопрос:
Пример: мой простой код:
String test="Message";
policy="newyork or losangeles";
Cpabe.encrypt(publickey, policy, test, test);
У меня есть это сообщение: метод encrypt(File, String, File, File) в типе Cpabe неприменим для аргументов (File, String, String, String).
Функция encrypt заключается в следующем:
public static void encrypt(File publicKeyFile, String policy, File inputFile, File outputFile) throws IOException, AbeEncryptionException {
AbePublicKey publicKey = AbePublicKey.readFromFile(publicKeyFile);
try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(inputFile));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outputFile))) {
encrypt(publicKey, policy, in, out);
}
Я изменил функцию в:
public static void encrypt(File publicKeyFile, String policy, String inputstr, String outputstr) throws IOException, AbeEncryptionException {
AbePublicKey publicKey = AbePublicKey.readFromFile(publicKeyFile);
try (String in = new String(inputstr);
String out = new String(outputstr)) {
encrypt(publicKey, policy, in, out);
}
}
но у меня есть другое сообщение: строка типа ресурса не реализует java.lang.Автоматически закрывается для ввода и вывода строки; при шифровании у меня есть следующее сообщение: метод encrypt(AbePublicKey, String, InputStream, OutputStream) в типе Cpabe неприменим для аргументов (AbePublicKey, String, String, String).
Это функция с 2 параметрами InputStream:
public static void encrypt(AbePublicKey publicKey, String policy, InputStream input, OutputStream output) throws AbeEncryptionException, IOException {
AbeEncrypted encrypted = encrypt(publicKey, policy, input);
encrypted.writeEncryptedData(output, publicKey);
}
и это метод writeEncryptedData:
public void writeEncryptedData(OutputStream out, AbePublicKey publicKey) throws IOException {
AbeOutputStream abeOut = new AbeOutputStream(out, publicKey);
Version.writeToStream(abeOut);
cipher.writeToStream(abeOut);
abeOut.writeInt(iv.length);
abeOut.write(iv);
byte[] buffer = new byte[1024];
int len;
while ((len = dataStream.read(buffer)) != -1) {
abeOut.write(buffer, 0, len);
}
}
Комментарии:
1. «Это не работает» не является хорошим описанием ошибки. Пожалуйста, покажите нам ваш код и точную ошибку (например, трассировку стека и указание, в какой строке это происходит). Мы здесь не для того, чтобы писать ваши решения для вас.
2. @MaartenBodewes Я новичок в SO. Спасибо за ваши подсказки. Я обновил описание своего вопроса. Мне не нужно решение; Я любопытен, и я хочу понять свои ошибки.
Ответ №1:
Ваш код не может по разным причинам. Сначала вам нужны InputStream и OutputStream. Чтобы использовать строку, вы должны сначала преобразовать ее в byte[]
, а затем в поток.
В вашей функции вы определили что-то вроде «параметра out» String outputstr
. Однако строки неизменяемы в Java, поэтому вы не можете использовать его таким образом и изменять его содержимое. Вместо этого используйте его в качестве возвращаемого значения.
В-третьих, никогда не пытайтесь преобразовать byte[]
в String
using new String(<byte array>)
. Это возвращает не строку с печатными символами, а строку с двоичным непечатаемым содержимым. Вы должны ее закодировать, например, используя base64. Перед ее расшифровкой необходимо применить декодирование base64.
public static String encrypt(File publicKeyFile, String policy, String inputstr) throws IOException, AbeEncryptionException {
AbePublicKey publicKey = AbePublicKey.readFromFile(publicKeyFile);
try (InputStream in = new ByteArrayInputStream(inputstr.getBytes(StandardCharsets.UTF_8);
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
encrypt(publicKey, policy, in, out);
return Base64.getEncoder().encodeToString(out.toByteArray());
}
}
Комментарии:
1. Отлично @Robert, спасибо за ваше объяснение. Я все понимаю, и я должен написать функцию расшифровки :).
2. В-третьих, никогда не пытайтесь преобразовать
byte[]
вString
usingnew String(<byte array>)
— если вы не знаете, что массив байтов содержит закодированный текст, который, конечно, использует набор символов, специфичный для платформы. Однако в случае зашифрованного текста для современных шифров этого никогда не будет, поскольку обычно предполагается, что это неотличимо от случайного.