(Java to Javascript) javax.crypto.Cipher эквивалентный код в Nodejs Crypto Javascript - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь преобразовать код ниже Java в nodejs.


    private static String TRANS_MODE = "Blowfish";

    private static String BLOWFISH_KEY = "BLOWFISH_KEY";

    public static String encrypt(String password) throws Exception {

    SecretKeySpec keySpec = new SecretKeySpec(BLOWFISH_KEY.getBytes("Windows-31J"),TRANS_MODE);
    Cipher cipher;
    cipher = Cipher.getInstance(TRANS_MODE);

    cipher.init(Cipher.ENCRYPT_MODE, keySpec);
    byte[] passByte;
    passByte = cipher.doFinal(password.getBytes("Windows-31J"));


    return new String(Hex.encodeHex(passByte));

    }

Вот что я смог выяснить -



const crypto = require('crypto');

function encrypt(password)  
  var fcKey = "BLOWFISH_KEY";
  var cipher = crypto.createCipher('BF-CBC', fcKey, "");
  var encrypted = cipher.update(password,'ascii','hex');
  encrypted += cipher.final('hex');
return encrypted;

Я не могу получитьтот же вывод. Например, если

password = "password01"

Вывод Java-кода - fe0facbf8d458adaa47c5fe430cbc0ad

Вывод кода Nodejs - ae5e8238c929b5716566e97fa35efb9b

* 1014 Кто-нибудь может решить эту проблему??

1 Ответ

1 голос
/ 31 октября 2019

Обратите внимание, что crypto.createCipher(algorithm, password[, options]) устарела и не должна использоваться.

Когда SecretKeySpec(..) в java принимает двоичный ключ в качестве ввода, createCipher (..) в js принимает "пароль" какввод, а за кулисами пытается извлечь двоичный ключ, используя MD5. Таким образом, ваш ключ, используемый в двух программах, в конечном итоге будет разным. Метод js также пытается извлечь IV из пароля, что является плохой практикой и отличается от вашего java-кода.

В js вам нужно использовать crypto.createCipheriv() вместо этого. И когда вы на это, вам также нужно подумать, нужен ли iv - как в Java, так и в js.

...