java - 如何将加密货币从java转换为nodejs

标签 java node.js encryption aes cryptojs

我有以下 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) 
}

我的问题是secureRandomKeyGenerator。不知道如何在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_saltivciphertext

关于java - 如何将加密货币从java转换为nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57954629/

相关文章:

java - 使用 Tapestry 和 Hibernate 的 Web 应用程序在调用 persist() 时抛出异常

java - 术语 'Platform Independent' 在编程语言上下文中的相关性

java - 在两台计算机之间传输文件

javascript - 当我使用 "require"时,Webstorm 无法识别我的全局函数

encryption - 如何用RSA加密大文件?

java - 按下按钮 FXML 后从 Textfield 获取文本

node.js - 如何调试 react.js 库

javascript - Webdriver JS - 将 sendKeys 存储到变量并重用

java - 如何设置请求 header (x-amz-服务器端加密 : aws:kms) while saving file to S3 in Java code?

java - 如何在java中实现ISO9797 M2 Padding