Зашифруйте файл в узле и расшифруйте в Java, используя «AES / GCM / NoPadding».В основном AES / GCM / NoPadding эквивалент в node.js - PullRequest
0 голосов
/ 03 января 2019

Я зашифровал файл с помощью node.js и расшифровал в JAVA. Расшифровка выполняется в JAVA с использованием алгоритма «AES / GCM / Nopadding», и это стороннее приложение, поэтому я не могу изменить код JAVA. Я шифрую файл в файле node.js с использованием алгоритма «aes-256-gcm» (не уверен, эквивалентен ли он «AES / GCM / Nopadding»).

Я пробовал с помощью crypto, модуль npm для кузницы узла также пытался установить cipher.setAutoPadding (false). Но не повезло. Не могли бы вы направить меня, где я иду не так.

код в node.js

const
 algorithm = 'aes-256-gcm',
 randomKey = crypto.randomBytes( 32 ),
 randomIv = crypto.randomBytes( 16 );
const
 cipher = crypto.createCipheriv( algorithm, randomKey, randomIv ),
 input = fs.createReadStream( './imageTest.jpg.gz' ), //gzip image 
 output = fs.createWriteStream( './imageTest.jpg.gz.enc' );

input.pipe( cipher ).pipe( output );

код для расшифровки в JAVA

byte[] decrypt(byte[] encrptedData, byte[] key, byte[] iv) {

    GCMParameterSpec ivSpec = new GCMParameterSpec(128, iv);
    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), ivSpec);
    return cipher.doFinal(encryptedData);
}

При расшифровке файла я получаю следующую ошибку на cipher.doFinal(encryptedData) шаг

Caused by: javax.crypto.AEADBadTagException: Tag mismatch!
    at com.sun.crypto.provider.GaloisCounterMode.decryptFinal(GaloisCounterMode.java:571)
    at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1046)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:983)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
    at javax.crypto.Cipher.doFinal(Cipher.java:2165)

поэтому мне нужно знать, как получить эквивалент в node.js

1 Ответ

0 голосов
/ 03 января 2019

Добавьте эту строку в NodeJs после завершения расшифровки, чтобы получить тег аутентификации.

const tag = cipher.getAuthTag();

Передать этот тег тоже.

А. в части Java добавьте его до dofinal

cipher.update(textBytes);
...