java - (Java 到 Javascript)Nodejs Crypto Javascript 中的 javax.crypto.Cipher 等效代码

标签 java node.js encryption encryption-symmetric javax.crypto

我正在尝试将下面的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;

我无法获得相同的输出。例如如果

密码=“密码01”

Java 代码输出 - fe0facbf8d458adaa47c5fe430cbc0ad

Nodejs 代码输出 - ae5e8238c929b5716566e97fa35efb9b

有人可以帮我解决这个问题吗?

最佳答案

请注意,crypto.createCipher(algorithm, password[, options]) 已弃用,不应使用。

java中的SecretKeySpec(..)采用二进制 key 作为输入,js中的createCipher(..)采用“密码”作为输入,并在幕后尝试派生一个使用 MD5 的二进制 key 。因此,这两个程序中实际使用的 key 最终会有所不同。 js方法 还尝试从密码中派生 IV,这是不好的做法,并且与您的 java 代码不同。

在 js 中,您需要使用 crypto.createCipheriv() 来代替。当你这样做时,你还需要考虑是否需要 iv - 无论是在 Java 中还是在 js 中。

关于java - (Java 到 Javascript)Nodejs Crypto Javascript 中的 javax.crypto.Cipher 等效代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58641643/

相关文章:

c++ - OpenSSL:EC_POINT_set_compressed_coordinates_GFp 段错误

node.js - GraphQL-js Node/Express : How to pass a stringed object in a GraphQL Query?

Java AES 字符串加密/解密

java - AES-256 CBC 在 php 中加密并在 Java 中解密,反之亦然

java - Java中多项式相除?

node.js - NodeJS 读取/写入文件到网络驱动器

java - 在java中加密和解密字符串

PHP 的地穴挑战

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 删除 Java 命令行界面的 args[] 中连续的第 0 个条目?