, но вы правы, я не должен переключаться между строкой и байтом []

нный с этим вопросом:Не удается расшифровать AES-256 GCM с помощью Java

Проблема с расшифровкой Java, похоже, решается только в том случае, если зашифрованное сообщение короткое, т. Е. Двумя словами или около того. Я пробовал со словами «привет» и «короткая строка», и оба эти слова были расшифрованы в порядке. Когда я попробовал что-то вроде,

Буквенно-цифровая строка test1 с большим количеством цифр, таких как 5, 4, 3, 2, 1

AEADBadTagException появился снова.

РЕДАКТИРОВАТЬ:

Эта проблема напрямую связана с продолжительностью зашифрованного сообщения. Два слова - это немного преувеличение, но пока зашифрованное сообщение примерно столько же, сколько это или больше, чем Java, будет работать исключение.

Пример зашифрованного сообщения:

D + nyOuSfH3wup + 5KHJRQyVwVHE0nn7dOfLQsSxb2LsR1LuogHxmVobHoQSTbdyqupd / UvwGfbhkUQz + 8CjIBSd7FoEVpgpYv9dAQ3GGUr3AtA + rJJrFHo / EM443sQlSOG4cIBQ7trF7udmrIhtiZ9wMchaBEJFmDBL5Jwl8ZMM0ath8VNWqfyyhghPW8U2NiORAy5mw6v07o7v3UT2 lBzJThBsM =

Расшифровывается с помощью узла:

это более длинная строка, чтобы сделать зашифрованное сообщение длиннее, чем раньше

РЕДАКТИРОВАТЬ 2:

Java-код:

package decryption;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class DecryptAES256 {

    private static String salt;
    private static byte[] iv;
    private static byte[] encryptedMessageAndTag;
    private static byte[] key;

    public static void main(String[] args) {
        String key = "123456789aabbccddeefffffffffffff";
        String sourceText = "zMX8Xp8lCLGP3FsF7dy1uEODFG0+lhpoWR+xZPpNAXm2D39+CJUK5Kk0z4NbDfb/WbP8lHVWcTOuXf8hRA1AmtEV2G5kP3SH3mrGbyf4QthR4aOTqEQQAvt1T8LlIkBlgx32gehP/nwwm3DYyJV+NnN21Ac17L4=";
        System.out.println(decrypt(key, sourceText));
    }

    public static String decrypt(String masterkey, String encryptedText) {
        // decode encryptedText 
        encryptedText = new String(Base64.getDecoder().decode(encryptedText.getBytes()));

        // extract the different parts
        byte[] parts = encryptedText.getBytes();
        salt = new String(Arrays.copyOfRange(parts, 0, 64)); // not using for testing purposes
        iv = Arrays.copyOfRange(parts, 64, 76);
        encryptedMessageAndTag = Arrays.copyOfRange(parts, 76, parts.length);
        try {
            key = masterkey.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            // not going to reach here
        }

        // call helper method to decrypt
        byte[] decipheredText = decodeAES_256_CBC();
        return new String(decipheredText);
    }

    private static byte[] decodeAES_256_CBC() {
        try {
            SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
            GCMParameterSpec params = new GCMParameterSpec(128, iv, 0, iv.length);
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, params);
            return cipher.doFinal(encryptedMessageAndTag);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Failed to decrypt");
        }
    }
}

РЕДАКТИРОВАТЬ 3:

Очищен код Java для удобства чтения

 bitscuit19 сент. 2017 г., 21:01
Я не знаю, почему он не может расшифровать длинные зашифрованные сообщения. Это именно то, что я видел из тестирования.
 bitscuit19 сент. 2017 г., 21:14
@AlexandreFenyo отредактировано в коде Java
 rcgldr19 сент. 2017 г., 20:56
Я не понимаю проблемы с длинными сообщениями, поскольку AES обычно работает с 16 байтами за раз, используя заполнение последнего блока из 16 байтов, если это необходимо.статья в вики .
 Alexandre Fenyo19 сент. 2017 г., 21:09
Можете ли вы написать весь код Java, пожалуйста? (версия исправлена ​​после оригинального вопроса)
 bitscuit19 сент. 2017 г., 22:38
@ gusto2 Сначала я расшифровал егоencryptedText = new String(Base64.getDecoder().decode(encryptedText.getBytes()));, но вы правы, я не должен переключаться между строкой и байтом []

Ответы на вопрос(0)

Ваш ответ на вопрос