java - Node.js 中的 DES 加密

标签 java node.js encryption des

我一直在尝试将此 Java 程序移植到 Node.js。我已经尝试了几种方法,但到目前为止仍然无法完成此任务。可能是由于我对密码学的了解有限。

我写的Node.js程序是这样的。

var crypto = require('crypto');

var iv = crypto.randomBytes(8);

var encrypt = function(data, key) {
    var decodeKey = crypto.createHash('sha512').update(key, 'utf-8').digest().slice(0, 24);
    var cipher = crypto.createCipheriv('des-ede-cbc', decodeKey, iv);
    return cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
};

var data = 'abc101'
var key = '1785851816255252-8887772';

var cipher = encrypt(data, key);
console.log(cipher);

我不断收到以下错误:

Error: Invalid key length

我尝试移植的原始程序是这样的:

import java.security.MessageDigest;
import java.security.spec.KeySpec;
import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class PasswordEncryptor {

    public static void main(String[] args) {

        String passwd = "abc101";
        String msgId = "1785851816255252-8887772";

        String result = "";

        try {
            if (passwd == null && passwd.equals("") && msgId == null && msgId.equals("")) {
                System.out.println("Wrong Inputs");
            } else {
                result = PasswordEncryptor.encryptPassword(msgId, passwd);
            }
            System.out.println(result);
        } catch (Exception e) {
            System.out.println("Exception in PasswordEncryption  ::: " + e);
        }

    }

    public static String encryptPassword(String msgId, String password) {
        String finalValue = "";
        try {
            MessageDigest mDigest = MessageDigest.getInstance("SHA-512");
            byte[] digestSeed = mDigest.digest(msgId.getBytes());
            byte[] seedEncArray = Arrays.copyOf(digestSeed, 24);
            Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
            SecretKeySpec skspec = new SecretKeySpec(seedEncArray, "DESede");
            IvParameterSpec iv = new IvParameterSpec(new byte[8]);
            cipher.init(Cipher.ENCRYPT_MODE, skspec, iv);
            byte[] finalByteArray = cipher.doFinal(password.getBytes());
            finalValue = new String(Base64.encodeBase64(finalByteArray));
        } catch (Exception e) {
            System.out.println("Exception in encryptPassword ::::" + e);
        }
        return finalValue;
    }
}

感谢任何帮助。谢谢。

最佳答案

nodejs 调用 OpenSSL,其命名方案由于歇斯底里的葡萄干而存在一些奇怪的缺陷。 OpenSSL 中的 des-ede-$mode 实际上是 Keying Option 2 ,又名 2 键 TDEA。对于“真正的”3 键 TDEA,您必须请求 des-ede3-$mode(在本例中为 des-ede3-cbc)。

Java 代码还使用 new byte[8] 作为 IV 值,即 8 个字节全为零,但您的 Nodejs 代码使用随机字节。随机实际上在密码学上更好,但如果您的目标是产生与 Java 代码相同的结果,您需要复制它的错误。

最后,Java 代码将结果编码为 base64,而 Nodejs 代码使用十六进制。它们在语义上是等效的并且易于相互转换,但并不相同。如果您确实想要相同的功能,nodejs 确实支持 base64。

旁白:Java 代码中尝试的错误检查

 if (passwd == null && passwd.equals("") && msgId == null && msgId.equals(""))

只是愚蠢; Java String 不能同时为 == null.equals("")。所有这些 && 对数与应该是 || 对数或。这段代码显然没有经过适当的编写测试审查;如果我是你(我不是),我会避免与此有任何关系。

关于java - Node.js 中的 DES 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51298371/

相关文章:

javascript - 如何格式化作为对象数组中值的日期

javascript - NodeJS : How do I perform an action after multiple asynchronous functions have completed?

java - 查看加密的数据库数据

python - 如何在 python 中使用 RSA/ECB/PKCS1Padding 创建 key ?

java - 查询 Java 的错误 SQL 语法

java - 访问按下按钮时的变量

node.js - 如何使用 Node 将二进制对象存储在redis中?

php - 为什么像 sha1 这样的散列函数最多只使用 16 个不同的字符(十六进制)?

java - 带有 GWT 的 App Engine 模块

java - 如何在 Kitkat Android 中将图像从一个 Activity 发送到另一个 Activity ?