Java до Node.js Шифрование AES / ECB / PKCS5Padding - PullRequest
0 голосов
/ 20 января 2020

У меня есть следующая функция шифрования в JAVA. Я пытаюсь написать то же самое шифрование в Node.js, используя шифр из crypto. Но результат не тот. Он использует ту же клавишу и ввод.

JAVA

public static String encrypt(String input, String key) {
    byte[] crypted = null;
    try {
        SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skey);
        crypted = cipher.doFinal(input.getBytes());
    } catch (Exception e) {
        System.out.println(e.toString());
    }
    String result = new String(Base64.encodeBase64(crypted));
    return result.replace("+", "-");
}

Пример вывода: 0HCkcjWj / PoCZ4ZUFJARs / m4kstigMFk8dQnT0uNhog = (44 символа)

Node.js

encrypt = (input, key) => { 
    const algorithm = 'aes-128-cbc';   
    key = crypto.scryptSync(key, 'salt', 16);       
    const iv = Buffer.alloc(16, 0);
    const cipher = crypto.createCipheriv(algorithm, key, iv);
    cipher.setAutoPadding(true);
    let encrypted = cipher.update(input, 'utf8', 'base64');
    encrypted += cipher.final('base64');
    return encrypted.replace('+','-');
}

Пример вывода: ZHtEbAhrIo7vWOjdMNgW6Q == (24 символа)

Заранее спасибо.

1 Ответ

2 голосов
/ 20 января 2020

Так что код NodeJS функционально идентичен коду Java, в коде NodeJS:

  • Режим ECB должен использоваться вместо CB C mode:

    const algorithm = 'aes-128-ecb';
    ...
    //const iv = Buffer.alloc(16, 0); // remove
    const cipher = crypto.createCipheriv(algorithm, key, null);
    

    Обратите внимание, однако, что ECB не использует IV, как правило, небезопасно и поэтому не должно использоваться, [1] . Лучшими альтернативами являются режим CB C (конфиденциальность) или режим GCM (конфиденциальность, подлинность / целостность), [2] , [3] .

  • Функция извлечения ключей не может быть применена [4] , то есть должна быть удалена следующая строка:

    key = crypto.scryptSync(key, 'salt', 16); 
    
...