Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Node.js中的DES加密_Java_Node.js_Encryption_Des - Fatal编程技术网

Java Node.js中的DES加密

Java Node.js中的DES加密,java,node.js,encryption,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,

我一直在尝试将这个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,由于歇斯底里的理由,它的命名方案有一些奇怪的缺点des-ede-$mode实际上是一种2键TDEA。对于“真实”三键TDEA,您必须要求
des-ede3-$mode
,在这种情况下
des-ede3-cbc

另外,Java代码使用
新字节[8]
作为IV值,即8个字节全部为零,但您的nodejs代码使用随机字节。Random实际上在加密方面更好,但是如果您的目标是产生与Java代码相同的结果,那么您需要复制它的错误

最后,Java代码在base64中对结果进行编码,而nodejs代码使用十六进制。它们在语义上是等价的,并且很容易相互转换,但并不相同。如果您确实想要相同的,nodejs确实支持base64

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

 if (passwd == null && passwd.equals("") && msgId == null && msgId.equals(""))
只是愚蠢;Java
字符串
不能同时为
==null
.equals(“”
)。所有这些
&&
记录,应该是
|
记录或。本规范显然未编写、测试或审查合格;如果我是你(我不是),我会避免和它有任何关系