AES-шифрование в java и дешифрование в javascript с использованием CryptoJS - PullRequest
0 голосов
/ 28 марта 2019

Ниже приведен код для шифрования некоторого содержимого файла в Java с использованием режима AES / CTR / NOPADDING.Я использую криптографический пакет javax.Также я использую тот же секретный ключ для генерации ключа и iv.

Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");

        byte[] secretKey = Base64.decodeBase64("uQsaW+WMUrjcsq1HMf+2JQ==");

        SecretKeySpec key = new SecretKeySpec(secretKey, "AES");
        IvParameterSpec iv = new IvParameterSpec(secretKey);

        cipher.init(mode, key , iv);

        FileInputStream fileInputStream = new FileInputStream(sourceFilePath);
        FileOutputStream fileOutputStream = new FileOutputStream(destFilePath);

        int read = 0;
        while ((fileInputStream.available()) > 0) {
            byte[] block = new byte[4096];
            read = fileInputStream.read(block);
            byte[] writeBuffer = cipher.update(block);
            fileOutputStream.write(writeBuffer, 0, read);
        }

        byte[] writeBuffer = cipher.doFinal();
        fileOutputStream.write(writeBuffer, 0, writeBuffer.length);

        fileInputStream.close();
        fileOutputStream.close();

Я не могу расшифровать зашифрованный контент в javascript с помощью cryptojs.Вот кое-что, что я попробовал.

var key = CryptoJS.enc.Hex.parse(atob('uQsaW+WMUrjcsq1HMf+2JQ=='));

var decrypted = CryptoJS.AES.decrypt(encryptedContent, key, {
    mode: CryptoJS.mode.CTR,
    iv: key,
    padding: CryptoJS.pad.NoPadding
});

var decryptedText = CryptoJS.enc.Utf8.stringify(decrypted);

Может кто-нибудь сказать мне, что я делаю неправильно?Или скажите мне, как это сделать.

Я могу зашифровать и расшифровать в java и javascript независимо друг от друга.

Ответы [ 2 ]

0 голосов
/ 30 марта 2019
  • В документации CryptoJS объясняется, какие типы данных и параметры ожидает метод CryptoJS.decrypt() и какие кодировщики доступны:

    • Ключ должен быть передан методу CryptoJS.decrypt() как WordArray. Поскольку данные ключа закодированы в Base64, их можно преобразовать в WordArray с помощью CryptoJS.enc.Base64.parse() -метода.
    • Зашифрованный текст может быть передан методу CryptoJS.decrypt() как WordArray внутри CipherParams -объекта. Java-код хранит зашифрованные данные в файле. Предполагая, что строка encryptedContent содержит эти данные в виде шестнадцатеричной строки (к сожалению, это не вытекает из опубликованного кода, поэтому здесь необходимо сделать предположение), они могут быть преобразованы в WordArray с помощью CryptoJS.enc.Hex.parse() и завернутый в CipherParams -объект.
    • CryptoJS.decrypt() -метод возвращает WordArray, который можно преобразовать с помощью CryptoJS.enc.Utf8.stringify() -метода в строку.
  • Если во входном файле содержится следующий простой текст:

    This is the plain text which needs to be encrypted!
    

    Java-код сохраняет следующую последовательность байтов (= зашифрованные данные) в выходном файле:

    52F415AB673427C42278E8D6F34C16134D7E3FE7986500980ED4063F3CF51162592CE0F5412CCA0BC2DBAE3F2AEC2D585EE8D7
    

    Код JavaScript для расшифровки:

    var key = CryptoJS.enc.Base64.parse('uQsaW+WMUrjcsq1HMf+2JQ==');
    
    var encryptedContent = '52F415AB673427C42278E8D6F34C16134D7E3FE7986500980ED4063F3CF51162592CE0F5412CCA0BC2DBAE3F2AEC2D585EE8D7';
    var cipherParams = CryptoJS.lib.CipherParams.create({
        ciphertext: CryptoJS.enc.Hex.parse(encryptedContent)         
    });
    
    var decrypted = CryptoJS.AES.decrypt(cipherParams, key, {
        mode: CryptoJS.mode.CTR,
        iv: key,
        padding: CryptoJS.pad.NoPadding
    });
    
    var decryptedText = CryptoJS.enc.Utf8.stringify(decrypted);
    console.log(decryptedText); 
    

, который отображает оригинальный текст в консоли. Для запуска приведенного выше кода требуется как минимум CryptoJS-версия 3.1.4 (см. версии , cdnjs ).

0 голосов
/ 28 марта 2019

Ваш цикл шифрования неправильный.Я не уверен, является ли это причиной ваших проблем, но я бы начал с этого

read = fileInputStream.read(block);
byte[] writeBuffer = cipher.update(block);

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

byte[] writeBuffer = cipher.update(block, 0, read);

Об использовании ключа в качестве IV, я должен подчеркнуть, что в режиме CTR безопасность будет полностью нарушена.

...