8

我正在尝试使用 javascript 对数据进行编码,使用 AES-256-CBC 和 php mcrypt 库进行解码,反之亦然。

我知道 javascript 的问题性质以及任何人都可以看到密钥的事实,但我正在使用 javascript 作为非 Web 环境的脚本工具 - 所以不用担心。

我找到了 pidder https://sourceforge.net/projects/pidcrypt/

并使用演示页面加密了一些数据,然后尝试通过 php 对其进行解密,但是出了点问题,我似乎找不到什么...我在两端使用相同的密钥,一个 32 字节的字符串

任何指针将不胜感激

~~~

$encrypted = "string after pidder encryption";  

$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_256,'',MCRYPT_MODE_CBC,'');    

$iv_size = mcrypt_enc_get_iv_size($cipher);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

mcrypt_generic_init($cipher, $key, $iv);


$encrypted = base64_decode($encrypted);

echo "after b64decode: " . $encrypted . "\n\n\n";

$encrypted = mdecrypt_generic($cipher, $encrypted);

echo "decrypt:" . $encrypted;

~~~

4

5 回答 5

1

Try MCRYPT_RIJNDAEL_128 with a 32-byte key for AES-256.

AES is a 128-bit block cipher that supports 128-, 192-, and 256-bit keys. Rijndael-256 is a 256-bit block cipher and AES. AES is a 128-bit block specification for Rijndael.

于 2014-02-17T19:54:54.217 回答
0

Pidder uses key derivation function to get the key from password (it should be HMAC-SHA1, i guess), but you seems to use plain password as a key.

于 2011-06-19T20:40:10.517 回答
0

首先:MCRYPT_RIJNDAEL_256 不是(!)AES-256-CBC,如果你想要这种加密,你必须使用 MCRYPT_RIJNDAEL_128 和 265 位,也就是 32 个字符的密钥。

这将是 php 部分:

function decrypt($data, $key) {
    if(32 !== strlen($key)) $key= hash('SHA256', $key, true);

    $data = base64_decode($data);
    $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16));
    $padding = ord($data[strlen($data) - 1]); 

    return substr($data, 0, -$padding); 
}

这个 php 函数包括填充,这是一个重要的部分,因为如果提供的数据长度不是键的倍数,你会得到一些奇怪的东西。

对于解码,我们使用我的一些 Node.js 脚本和 php 的 str_repeat 的模拟方法用于 iv:

var crypto = require('crypto'); 

function encrypt(data, key) {
    key = key || new Buffer(Core.config.crypto.cryptokey, 'binary'),
        cipher = crypto.createCipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16));
    cipher.update(data.toString(), 'utf8', 'base64');
    return cipher.final('base64');
}

function str_repeat(input, multiplier) {
    var y = '';
    while (true) {
        if (multiplier & 1) {
            y += input;
        }
        multiplier >>= 1;
        if (multiplier) {
            input += input;
        } else {
            break;
        }
    }
    return y;
}

注意:不建议使用静态 IV(初始化向量)!注意:JavaScript 部分适用于使用它的加密库的 Node.js。

我希望这对你有用。

于 2014-04-01T23:42:10.003 回答
0

Javascript Mcrypt与 PHP mcrypt 配合得很好。您可以使用它而不是 pidder。

于 2012-11-24T20:33:27.217 回答
0

老实说,您的代码是连续的,我没有尝试修复,但我有一个运行良好的功能并且可以帮助您。

    /**
 * Encrypt Token
 *
 * @param unknown $text         
 */
private function rijndaelEncrypt($text) {
    $iv_size = mcrypt_get_iv_size ( MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB );
    $iv = mcrypt_create_iv ( $iv_size, MCRYPT_RAND );
    $key = 'your key';
    return base64_encode ( mcrypt_encrypt ( MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv ) );
}

/**
 * Decrypt
 *
 * @param unknown $text         
 */
private function rijndaelDecrypt($text) {
    $iv_size = mcrypt_get_iv_size ( MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB );
    $iv = mcrypt_create_iv ( $iv_size, MCRYPT_RAND );
    $key = 'your key';
    // I used trim to remove trailing spaces
    return trim ( mcrypt_decrypt ( MCRYPT_RIJNDAEL_256, $key, base64_decode ( $text ), MCRYPT_MODE_ECB, $iv ) );
}

http://us3.php.net/manual/en/function.mcrypt-encrypt.php

于 2014-03-10T20:34:24.940 回答