【问题标题】:Different encryption values from NodeJs Crypto and CryptoJS libraryNodeJs Crypto 和 CryptoJS 库中的不同加密值
【发布时间】:2021-09-02 13:39:50
【问题描述】:

我在前端和后端都使用 NodeJS Crypto 和 CryptoJS 库进行加密和解密。我能够使用 NodeJS Crypto 进行加密,它工作得很好,加密的字符串也与 Java 加密一致。但是当我使用 CryptoJS 库时,加密字符串并不像预期的那样。我在下面提供了独立的 Typescript 代码。

请帮助我。我正在使用 aes-256-cfb8 算法。是不是因为 CryptoJS 库可能不支持这个算法?请给我一些方向,我现在很震惊。

import * as crypto from "crypto";
import CryptoJS, { mode } from "crypto-js";

export class Test3 {

    private static readonly CRYPTO_ALGORITHM = 'aes-256-cfb8'
    private static readonly DEFAULT_IV: string = "0123456789123456";

    // NodeJS Crypto - Works fine
    public encryptValue(valueToEncrypt: string, secretKey: string): string {
        let encryptedValue: string = '';
        const md5 = crypto.createHash('md5').update(secretKey).digest('hex');
        const key: string = md5;
        console.log("MD5 Value : ", md5);
        const iv = Buffer.from(Test3.DEFAULT_IV)
        console.log("iv: ", iv)
        const cipher = crypto.createCipheriv(Test3.CRYPTO_ALGORITHM, key, iv);
        let encrypted = cipher.update(valueToEncrypt, 'utf8', 'base64');
        console.log("encrypted ::: ", encrypted);
        encrypted += cipher.final('base64');
        encryptedValue = encrypted;
        return encryptedValue;
    }

    // CryptoJS library - does not work
    public check3(valueToEncrypt: string, secretKey: string): void {
        const hash = CryptoJS.MD5(secretKey);
        const md5Key: string = hash.toString(CryptoJS.enc.Hex)
        console.log("MD5 Value: ", md5Key); // Upto correct

        const IV11 = CryptoJS.enc.Utf8.parse(Test3.DEFAULT_IV);
        const key11 = CryptoJS.enc.Utf8.parse(md5Key);
        const data = CryptoJS.enc.Utf8.parse(valueToEncrypt);

        const enc1 = CryptoJS.AES.encrypt(data, key11, { 
            format: CryptoJS.format.OpenSSL,
            iv: IV11,
            mode: CryptoJS.mode.CFB,
            padding: CryptoJS.pad.NoPadding
            
          });
          console.log("Cipher text11: ", enc1.toString());
        
    }
}

const text2Encrypt = "A brown lazy dog";
const someSecretKey: string = "projectId" + "~" + "India";
const test = new Test3();

// Using NodeJS Crypto
const enc = test.encryptValue(text2Encrypt, someSecretKey);
console.log("Encrypted Value Using NodeJS Crypto: ", enc); // ===> nJG4Fk27JZ7E5klLqFAt

// Using CryptoJS 
console.log("****************** Using CryptoJS ******************")
test.check3(text2Encrypt, someSecretKey);

请帮我解决上述类的方法check3()。我还检查了 SO 中的许多链接。

【问题讨论】:

    标签: javascript node.js typescript encryption cryptojs


    【解决方案1】:

    你猜对了。两种代码都使用 CFB 模式的不同变体。对于 CFB,必须定义段大小。 CFB 模式的段大小对应于每个加密步骤加密的位数,请参阅CFB

    NodeJS 的 crypto 模块支持多种段大小,例如8 位 (aes-256-cfb8) 或 128 位 (aes-256-cfb),而 CryptoJS 仅支持 128 位 (CryptoJS.mode.CFB) 的段大小。

    如果在 crypto 模块中将段大小更改为 128 位 (aes-256-cfb),则两个密文匹配。

    编辑:
    this post 中,您将找到 CFB 模式的 CryptoJS 扩展,因此段大小也是可变的,例如8位,支持。

    【讨论】:

    • 感谢@Topaco,当我更改为aes-256-cfb这个算法时,这两个加密字符串。但在我的情况下,它应该是aes-256-cfb8,因为它已经被我用Java实现了,因为它已经被许多模块使用了,所以不能使用。
    • 非常感谢@Topaco。我根据 Typescript 结构进行了一些更改以使其正常工作。它工作正常。接受您的意见和指导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多