我有以下 Java 代码。
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(password.getBytes());
kgen.init(INIT_LENGTH, secureRandom);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(byteContent);
return result;
我需要在 JavaScript/Node.js 中实现它
我不知道如何在 JavaScript 中实现从 secretString
到 KeyGenerator 生成的 key
来自评论部分:
这是我的代码:
function encodeDesCBC( textToEncode, keyString, ivString ) {
const key = Buffer.from(keyString.substring(0, 8), 'utf8')
const iv = Buffer.from(ivString.substring(0, 8), 'utf8')
const cipher = crypto.createCipheriv('aes-128-cbc', key, iv)
let c = cipher.update(textToEncode, 'utf8', 'base64')
c += cipher.final('base64')
return base64url.escape(c)
}
我的问题是secureRandom
和KeyGenerator
。不知道如何在nodejs中实现
最佳答案
我不懂Java,但你的用法看起来有点弱,有像PBKDF2(现在已经过时且不鼓励使用)和scrypt这样的算法,它们在将人类密码转换为 key Material 方面做得更好。我也不确定你的 IV 在你的 Java 代码中来自哪里。准确地复制 Java 代码会有些困难,因为您需要知道您的 Java 版本是如何实现的,以及传递给 setSeed
的字节实际上如何变成 key 。
Node 的Crypto
据我所知,模块假设您知道 key 应该有多长。对于 CBC 模式下的 AES 128, key 和 IV 均为 128 位(即 16 字节)。
假设您想使用 Crypto 模块中内置的内容(如果您可以放宽此限制,建议使用 argon2),那么您会执行以下操作:
const crypto = require('crypto');
const password = 'passw0rd';
const scrypt_salt = crypto.randomBytes(16);
const key = crypto.scryptSync(password, scrypt_salt, 16);
这将为您留下一个合适的key
值,然后您可以使用以下内容进行加密:
const plaintext = 'the plain text to encode';
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
const ciphertext = Buffer.concat([
cipher.update(plaintext),
cipher.final(),
]);
您可以使用 ciphertext.toString('base64')
编码为 Base64。
请注意,为了能够解密此内容,您需要 scrypt_salt
、iv
和 ciphertext
。
关于java - 如何将加密货币从java转换为nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57954629/