为了编写一个简单的 nodejs 应用程序与用 java 编写的服务器交谈,我必须为 nodejs 实现以下功能。
public class Crypto {
Cipher decipher;
byte[] salt = {
(byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04,
(byte) 0x0A, (byte) 0x0B, (byte) 0x0C, (byte) 0x0D
};
int iterationCount = 10;
public Crypto(String pass) {
try {
KeySpec keySpec = new PBEKeySpec(pass.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance(
"PBEWithMD5AndTripleDES").generateSecret(keySpec);
ecipher = Cipher.getInstance("PBEWithMD5AndTripleDES/CBC/PKCS5Padding");
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
decipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
} catch (Exception ex) {
}
}
}
我使用crypto
nodejs的模块
var crypto = require('crypto'),
pass = new Buffer(wek),
salt = new Buffer([0x01, 0x02, 0x03, 0x04, 0x0A, 0x0B, 0x0C, 0x0D])
password = 'mySecretPassword'
key = crypto.pbkdf2(pass, salt, 10, 256)
cipher,
encrypted;
cipher = crypto.createCipher('des-ede-cbc', key);
encrypted = cipher.update(new Buffer('the very secred information'));
将加密信息发送到服务器后,我无法使用decipher
上面 java 代码示例中列出的 Object 解密消息。我认为主要问题是md5
部分。我不知道如何用crypto
nodejs
模块实现它。有谁知道如何解决这个问题?或者是否有任何其他模块或库来实现这一点?
编辑:我为nodejs尝试了另一个模块:node-forge
forge = require('node-forge')
var numIterations = 10,
keyLength = 24,
password = forge.util.createBuffer('mySecretPassword'),
salt = new forge.util.ByteBuffer(new Uint8Array([0x01, 0x02, 0x03, 0x04, 0x0A, 0x0B, 0x0C, 0x0D])),
derivedKey = forge.pkcs5.pbkdf2(password, salt.getBytes(), numIterations, keyLength, forge.md.md5.create())
iv = {}; // TODO... ???
var cipher = forge.des.createEncryptionCipher(derivedKey);
cipher.start(iv);
cipher.update('the very secred information');
cipher.finish();
var encrypted = cipher.output;
但我有几个问题/疑问:
- 我在javascript中使用正确的算法吗?
- 计算是否
salt
与java实现匹配? - 如何确定
keyLength
java 实现中使用了哪个? initialization vector
java实现中如何生成?在最后一个代码示例中,node-forge
我必须提供iv
oncipher.start(iv)
. 在 java 代码中,我看不到这是如何完成的。在我看来iv
,客户端和服务器上的必须相同还是不正确?