来自 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位,支持。
我在前端和后端都使用 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位,支持。