JCPABE Encypt расшифровывает строку

#java #string #encryption #cryptography

#java #строка #шифрование #криптография

Вопрос:

Я вижу проект JCPABE, но методы, которые находятся в классах, позволяют мне шифровать file или InputStream, но не простую строку Java. Как я могу использовать эти методы для шифрования / дешифрования строки? Я попытался преобразовать строку в массив байтов, но это не работает (т. Е. String.getBytes("UTF_8"); То же самое, если я конвертирую String в InputStream . Как я могу зашифровать / расшифровать простую строку?

Пример: мой простой код:

 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 using new String(<byte array>) — если вы не знаете, что массив байтов содержит закодированный текст, который, конечно, использует набор символов, специфичный для платформы. Однако в случае зашифрованного текста для современных шифров этого никогда не будет, поскольку обычно предполагается, что это неотличимо от случайного.