繁体   English   中英

如何在 JavaScript 中实现这个加密相关的代码?

[英]How to implement this encryption related code in JavaScript?

我在Java中有以下代码。

        String secretString = 'AAABBBCCC'
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom securerandom = SecureRandom.getInstance("SHA1PRNG");
        securerandom.setSeed(secretString.getBytes());
        kgen.init(256, securerandom);
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
        Security.addProvider(new BouncyCastleProvider());
        Cipher cipher = Cipher.getInstance("AES");

        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] byteContent = content.getBytes("utf-8");
        byte[] cryptograph = cipher.doFinal(byteContent);
        String enc1 = Base64.getEncoder().encodeToString(cryptograph);
        return enc1;

我需要在 JavaScript/Node.js 中实现它,但是我只能在 js 中找出后半部分,如下所示

        'use strict';
        const crypto = require('crypto');
        const ALGORITHM = 'AES-256-ECB';
        const secretString = 'AAABBBCCC'

        // missing part in JS (how to convert secretString to key)

        function encrypt(plaintext, key) {
            const cipher = crypto.createCipheriv(ALGORITHM, key, Buffer.alloc(0));
            return cipher.update(plaintext, 'utf8', 'base64') + cipher.final('base64');
        }

对于之前的 Java 部分(从secretStringKeyGenerator生成的密钥),我不知道如何在 JavaScript 中实现它,我也不知道 JavaScript 世界中是否有像KeyGenerator这样的东西可以帮助我完成繁重的工作.

我认为这就是你所追求的:

const crypto = require("crypto-js");


// Encrypt
const ciphertext = crypto.AES.encrypt('SOMETHING SECRET', 'secret key 123');

// Decrypt
const bytes  = crypto.AES.decrypt(ciphertext.toString(), 'secret key 123');
const decryptedData = bytes.toString(crypto.enc.Utf8);

console.log(decryptedData);

https://runkit.com/mswilson4040/5b74f914d4998d0012cccdc0

更新

JavaScript 没有用于密钥生成的本机等效项。 答案是创建自己的模块或使用第三方模块。 我会为初学者推荐类似uuid 的东西。

您可以使用crypto.randomBytes() 根据其文档:

生成加密强伪随机数据。 size 参数是一个数字,指示要生成的字节数。

此外,它在幕后使用了 openssl 的RAND_bytes API

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM