来自 NodeJs Crypto 和 CryptoJS 库的不同加密值

Different encryption values from NodeJs Crypto and CryptoJS library

我在前端和后端都使用 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);

上面class的方法check3()请帮帮我。我也检查了 SO 中的许多链接。

你猜对了。两种代码都使用 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 中,您会发现 CryptoJS 的扩展用于 CFB 模式,因此也是一个可变的段大小,例如8位,支持。