CryptoJS 中 CFB 模式中的 mcrypt_encrypt 函数

Posted

技术标签:

【中文标题】CryptoJS 中 CFB 模式中的 mcrypt_encrypt 函数【英文标题】:mcrypt_encrypt in CFB mode function in CryptoJS 【发布时间】:2015-10-20 06:49:24 【问题描述】:

我正在尝试将用 php 编写的 mcrypt_encrypt 函数转换为 node.js,我在 node.js 中使用 CryptoJS 并尝试了各种配置选项,但我没有运气解决这个问题。

PHP 代码:

base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128,md5($secretKey),$ldapPwd,MCRYPT_MODE_CFB,$initialVector))

我试过的 javascript 代码不知道我做错了什么:

var encrypted = CryptoJS.AES.encrypt(password, keyBase64,

    keySize: 128 / 8,
    iv: iv,
    mode: CryptoJS.mode.CFB,
    padding: CryptoJS.pad.NoPadding
);

【问题讨论】:

您遇到的错误是什么? php 的输出与 php 的输出不同 :) 抱歉错误是 php 的输出与 javascript 的输出不同 :) 【参考方案1】:

密码反馈 (CFB) 模式是一组具有段大小参数的分组密码模式。 Mcrypt 只支持 CFB8 而 CryptoJS 只支持 CFB128。它们不兼容。

我已经实现了CFBb in CryptoJS,它也支持 8 位段,但它仅针对 CryptoJS 3.1.2 进行测试,而不是通过 NPM 提供的 CryptoJS 2 版本。

【讨论】:

不完全正确... mcrypt 确实有一个 'ncfb' 模式,只是在 PHP 中没有为它定义常量。您不能只将该字符串作为模式传递,它会起作用。 @Narf 不知道。如果 OP 可以更改不清楚的 PHP 代码,那将回答这个问题。奇怪的是,我下载了mcrypt源代码,看它是否支持变量CFB,没有找到。我想我只是看起来不够努力。 谢谢,不得不导入另一个库,但是,干杯伙伴,现在一切都很好:)【参考方案2】:

在 PHP 中,当您将 mcrypt_module_open 与 Rijndael-128 一起使用时,您必须传递一个 32 字节密钥 和一个 16 字节 IV。

所以对于nodeJs,你可以使用crypto模块,例如:

var crypto = require('crypto');

//Declare our secret key
var key = 'fcda0ssdegfffc9441581bdd86484513dd9cb1547df2jsd';

//Declare our alogrithm
var algorithm = 'AES-256-CFB';

//Generate IV to hex format, so 8 * 2 = 16 bytes
var iv = crypto.randomBytes(8).toString('hex');

//Declare our string to encrypt
var password = 'HELLO WORLD';


var handler = ;

handler.encrypt64 = function(algorithm, key, vector, password)

    //create a cipher with an IV
    var cipher = crypto.createCipheriv(algorithm, key.substr(0,32), iv);

    //Encrypt our password from utf8 to hex
    var encrypted = cipher.update(password, 'utf8', 'base64'); 

    //Return any remaining enciphered data to hex format
    encrypted += cipher.final('base64');

    //Return a base64 String
    return encrypted;
;

handler.decrypt64 = function(algorithm, key, vector, password)

    //create a decipher with an IV
    var decipher = crypto.createDecipheriv(algorithm, key.substr(0, 32), iv);

    //Decrypt our encode data from base64 to utf8
    var decrypted = decipher.update(encode, 'base64', 'utf8');

    decrypted += decipher.final('utf8');


    //Return a utf8 string
    return decrypted;
;

var encode = handler.encrypt64(algorithm, key, iv, password);

var decode = handler.decrypt64(algorithm, key, iv, encode);

【讨论】:

可能需要使用AES-256-CFB8而不是AES-256-CFB。填充也有问题。 感谢 Paul,但我使用了 Artjom 的图书馆,它很有效 :)

以上是关于CryptoJS 中 CFB 模式中的 mcrypt_encrypt 函数的主要内容,如果未能解决你的问题,请参考以下文章

分组对称加密模式:ECB/CBC/CFB/OFB(转)

JS前端接口加密/解密

AES共有ECB,CBC,CFB,OFB,CTR五种模式分别有啥区别

AES共有ECB,CBC,CFB,OFB,CTR五种模式分别有啥区别

IDEA / CFB模式解密和损坏的块

对称加密算法常用的五种分组模式(ECB/CBC/CFB/OFB/CTR)