gpt4 book ai didi

java - 在 node 中加密并在 java 中解密

转载 作者:IT老高 更新时间:2023-10-28 23:14:37 26 4
gpt4 key购买 nike

我有一个 Java 加密代码。我正在尝试将加密部分移植到 Node 。基本上,node 会使用 crypto 模块进行加密,然后 Java 会进行解密。

这是我在 Java 中进行加密的方法:

protected static String encrypt(String plaintext) {
final byte[] KEY = {
0x6d, 0x79, 0x56, 0x65, 0x72, 0x79, 0x54, 0x6f, 0x70,
0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b
};

try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
final SecretKeySpec secretKey = new SecretKeySpec(KEY, "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
final String encryptedString = Base64.encodeToString(
cipher.doFinal(plaintext.getBytes()), Base64.DEFAULT);

return encryptedString;
} catch (Exception e) {
return null;
}
}

这是我在 Node 中进行加密的方法:

var crypto = require('crypto'),
key = new Buffer('6d7956657279546f705365637265744b', 'hex'),
cipher = crypto.createCipher('aes-128-ecb', key),
chunks = [];

cipher.setAutoPadding(true);
chunks.push(cipher.update(
new Buffer(JSON.stringify({someKey: "someValue"}), 'utf8'),
null, 'base64'));
chunks.push(cipher.final('base64'));

var encryptedString = chunks.join('');

在 Java 中,我得到字符串 T4RlJo5ENV8h1uvmOHzz1KjyXzBoBuqVLSTHsPppljA=。这得到正确解密。但是,在 Node 中,我得到 al084hEpTK7gOYGQRSGxF+WWKvNYhT4SC7MukrzHieM= 这显然不同,因此无法正确解密。

我试图寻找和我有同样问题的人,this github问题是我能找到的最接近的问题。正如该问题中所建议的,我尝试像这样运行 openssl:

$ echo -e '{"someKey": "someValue"}' | openssl enc -a -e -aes-128-ecb -K "6d7956657279546f705365637265744b"
T4RlJo5ENV8h1uvmOHzz1MY2bhoFRHZ+ClxsV24l2BU=

我得到的结果和java产生的结果很接近,但还是不一样:

T4RlJo5ENV8h1uvmOHzz1MY2bhoFRHZ+ClxsV24l2BU=  // openssl
T4RlJo5ENV8h1uvmOHzz1KjyXzBoBuqVLSTHsPppljA= // java
al084hEpTK7gOYGQRSGxF+WWKvNYhT4SC7MukrzHieM= // node

这让我想到了一个问题,如何让 Node 输出与我的 java 代码相同的加密字符串?我只能在 node 中更改我的代码,而不能在 java 中更改。

最佳答案

我认为我从 Node 和 java 端发布了一个完整的 CBC 示例(256 而不是 128):如果您收到 java.security.InvalidKeyException,您必须安装 Java Cryptography Extension (JCE) 无限强度管辖策略文件:

Java 6 link Java 7 link Java 8 link

Java 加密和解密。

    import java.security.MessageDigest;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.Cipher;
import java.util.Base64;
import javax.xml.bind.DatatypeConverter;

public class AESExample {
private static byte[] iv = "0000000000000000".getBytes();
private static String decrypt(String encrypted, String seed)
throws Exception {
byte[] keyb = seed.getBytes("utf-8");
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] thedigest = md.digest(keyb);
SecretKeySpec skey = new SecretKeySpec(thedigest, "AES");
Cipher dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
dcipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(seed.getBytes("UTF-8"), "AES"), new IvParameterSpec(iv));
byte[] clearbyte = dcipher.doFinal(DatatypeConverter
.parseHexBinary(encrypted));
return new String(clearbyte);
}
public static String encrypt(String content, String key) throws Exception {
byte[] input = content.getBytes("utf-8");
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] thedigest = md.digest(key.getBytes("utf-8"));
SecretKeySpec skc = new SecretKeySpec(thedigest, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes("UTF-8"), "AES"), new IvParameterSpec(iv));
byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
ctLength += cipher.doFinal(cipherText, ctLength);
return DatatypeConverter.printHexBinary(cipherText);
}

public static String encrypt128(String content, String key) throws Exception {
byte[] input = content.getBytes("utf-8");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(DatatypeConverter.parseHexBinary(key), "AES"), new IvParameterSpec(iv));
byte[] encrypted = cipher.doFinal(content.getBytes("UTF-8"));
return DatatypeConverter.printHexBinary(encrypted);
}

public static void main(String[] args) throws Exception {
String data = "Here is my string";
String key = "1234567891123456";
String cipher = AESExample.encrypt(data, key);
String decipher = AESExample.decrypt(cipher, key);
System.out.println(cipher);
System.out.println(decipher);
System.out.println(AESExample.encrypt(data, "1234567891123456"));
System.out.println(AESExample.encrypt128(data, "d7900701209d3fbac4e214dfeb5f230f"));
}
}

以下两个方向 Node :

    var crypto = require('crypto');
var iv = new Buffer('0000000000000000');
// reference to converting between buffers http://nodejs.org/api/buffer.html#buffer_new_buffer_str_encoding
// reference node crypto api http://nodejs.org/api/crypto.html#crypto_crypto_createcipheriv_algorithm_key_iv
// reference to ECB vs CBC cipher methods http://crypto.stackexchange.com/questions/225/should-i-use-ecb-or-cbc-encryption-mode-for-my-block-cipher

var encrypt = function(data, key) {
var decodeKey = crypto.createHash('sha256').update(key, 'utf-8').digest();
var cipher = crypto.createCipheriv('aes-256-cbc', decodeKey, iv);
return cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
};

var decrypt = function(data, key) {
var encodeKey = crypto.createHash('sha256').update(key, 'utf-8').digest();
var cipher = crypto.createDecipheriv('aes-256-cbc', encodeKey, iv);
return cipher.update(data, 'hex', 'utf8') + cipher.final('utf8');
};

var decrypt128 = function(data, key) {

var encodeKey = crypto.createHash('sha256').update(key, 'utf-8').digest();
var cipher = crypto.createDecipheriv('aes-128-cbc', new Buffer(key, 'hex'),
new Buffer(
iv));
return cipher.update(data, 'hex', 'utf8') + cipher.final('utf8');
};
var data = 'Here is my string'
var key = '1234567891123456';
var cipher = encrypt(data, key);
var decipher = decrypt(cipher, key);
console.log(cipher);
console.log(decipher);
// the string below was generated from the "main" in the java side
console.log(decrypt(
"79D78BEFC06827B118A2ABC6BD9D544E83F92930144432F22A6909EF18E0FDD1", key));
console.log(decrypt128(
"3EB7CF373E108ACA93E85D170C000938A6B3DCCED53A4BFC0F5A18B7DDC02499",
"d7900701209d3fbac4e214dfeb5f230f"));

关于java - 在 node 中加密并在 java 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19698721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com