标签: mcrypt

如何在PHP中进行AES256解密?

我有一个加密的文本,我需要解密.它是用AES-256-CBC加密的.我有加密的文本,密钥和iv.然而,无论我尝试什么,我似乎无法让它工作.

互联网已经建议mcrypt的Rijndael密码能够做到这一点,所以这就是我现在所拥有的:

function decrypt_data($data, $iv, $key) {
    $cypher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

    // initialize encryption handle
    if (mcrypt_generic_init($cypher, $key, $iv) != -1) {
        // decrypt
        $decrypted = mdecrypt_generic($cypher, $data);

        // clean up
        mcrypt_generic_deinit($cypher);
        mcrypt_module_close($cypher);

        return $decrypted;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

现在,我得到2个警告,输出是胡言乱语:

Warning: mcrypt_generic_init() [function.mcrypt-generic-init]: Key size too large; supplied length: 64, max: 32 in /var/www/includes/function.decrypt_data.php on line 8
Warning: mcrypt_generic_init() [function.mcrypt-generic-init]: Iv size incorrect; supplied length: 32, needed: 16 in /var/www/includes/function.decrypt_data.php on line 8
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

php aes mcrypt

5
推荐指数
1
解决办法
3万
查看次数

mcrypt_generic vs mcrypt_encrypt

在PHP中进行加密时,有没有人知道mcrypt_generic和mcrypt_encrypt之间的区别?

php mcrypt

5
推荐指数
1
解决办法
6436
查看次数

PHP mcrypt函数问题

我使用以下函数来解密我的服务器上的数据:

function decrypt($key, $text) {
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了很多关于不使用ECB的内容(并且知道它已被弃用,所以想切换到CBC.只需将模式切换为:

function decrypt($key, $text) {
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_CBC, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_RAND)));
}
Run Code Online (Sandbox Code Playgroud)

但不起作用.不会生成错误,但返回的数据仍然是加密的.

我错过了什么?

更新的代码 - 仍有错误:

$key = "hello"; 

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);

function encrypt($key, $text) {
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
}


function decrypt($key, $text) { 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv));
}


$text = 12345;

echo "Plain Number : " . $text . "<br><br>";

$encrypted = encrypt($key, $text);
echo …
Run Code Online (Sandbox Code Playgroud)

php mcrypt

5
推荐指数
2
解决办法
1万
查看次数

用nodejs加密和php的mcrypt解密blowfish-ecb

我正在尝试使用内置的加密库解码Node.js中的以下base64编码的密文

2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A==
Run Code Online (Sandbox Code Playgroud)

它似乎与PHP的mcrypt函数一起使用字符串typeconfig.sys^_-作为键,如将值输入到http://www.tools4noobs.com/online_tools/decrypt/并选择Blowfish,ECB,Base64 decode所示.

但是,当我在Node.js中运行以下代码时:

var crypto = require('crypto');
var data = "2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A==";
var decipher = crypto.createDecipher('bf-ecb', 'typeconfig.sys^_-');
data = decipher.update(data, "base64", "utf8");
data += decipher.final("utf8");
console.log(data);
Run Code Online (Sandbox Code Playgroud)

我得到垃圾输出:

y
?:????d?(????Q?i??z1??4?? ?k?(? ??a5????u??73c/??(???)????????f????
                                                              ?ec?-<z?8????(?-L?????I??1L*??u?4?j-??h?@\P)???.?^???q??U???W&?x??85?T-?9,dE<g}?`*?
??|@????k"?!?D'u???,x??7????
                 ??9q=q?q???>?w?T????H3??i)R??zy??C??
                                                    ??o?
Run Code Online (Sandbox Code Playgroud)

我也尝试过对库本身的测试,因为它似乎能够处理它自己编码的东西:

var crypto = require('crypto')
var cipher = crypto.createCipher("bf-ecb", "key");
var data = cipher.update("foobar", "utf8", "base64");
data += cipher.final("base64");
console.log(data);
var decipher = crypto.createDecipher("bf-ecb", "key");
data = decipher.update(data, "base64", "utf8");
data += decipher.final("utf8");
console.log(data);
Run Code Online (Sandbox Code Playgroud)

生产:

y0rq5pYkiU0=
foobar
Run Code Online (Sandbox Code Playgroud)

但复制并粘贴base64字符串并将其输入http://www.tools4noobs.com/online_tools/decrypt/以及键"key"也会产生垃圾输出. …

encryption blowfish mcrypt ecb node.js

5
推荐指数
1
解决办法
4538
查看次数

当不需要IV时,PHP的mcrypt_get_iv_size是否实际返回零?

mcrypt_get_iv_sizePHP文档中,声明当算法/块模式组合不使用IV时,返回值将为零:

以字节为单位返回初始化向量(IV)的大小.出错时,函数返回FALSE.如果在指定的密码/模式组合中忽略IV,则返回零.

当我用MCRYPT_DES作为算法和MCRYPT_MODE_ECB作为模式调用此函数时,它返回8(8)而不是预期的0(零).

我的理解是,ECB不会也不能使用IV,因此我期望零值.这是不正确的,文档是不正确的,还是我错过了其他的东西?

以下代码段演示了此问题:

<?php
// I expect this call to return zero.
$size = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB);
echo 'IV Size: ' . $size . PHP_EOL;
Run Code Online (Sandbox Code Playgroud)

请注意,我实际上并没有将ECB用于实际加密,我只是想找到一种可靠的方法来确定任意算法/模式是否需要IV.(我注意到mcrypt库有一个函数"mcrypt_enc_mode_has_iv",但似乎没有等效的PHP函数).

我正在使用PHP v5.3.12和libmcrypt 2.5.8_1.

更新可能的解决方法:

看看libmcrypt源,似乎mcrypt_enc_get_iv_size()将始终返回任何块密码模式的块大小,但回退到"询问"算法的流模式.

int mcrypt_enc_get_iv_size(MCRYPT td)
{
    if (mcrypt_enc_is_block_algorithm_mode(td) == 1) {
        return mcrypt_enc_get_block_size(td);
    } else {
        return mcrypt_get_algo_iv_size(td);
    }
}
Run Code Online (Sandbox Code Playgroud)

mcrypt_get_algo_iv_size()调用被转发到算法库的_mcrypt_get_algo_iv_size()函数.所以希望这意味着如果我手动处理ECB情况,它应该为那些需要IV流模式的算法产生正确的结果.

php encryption mcrypt

5
推荐指数
1
解决办法
1032
查看次数

在PHP中进行AES加密,然后用Javascript解密(cryptojs)

我正在寻找一种方法来对简单文本(5到6个数字和/或字符)进行双向加密.问题是,我想在php中进行加密,然后通过Javascript解密.对于php我已经使用mcrypt_encode测试并且已经使它工作,因此当我尝试用javascript解密它时(我正在使用Crypto-js库 - http://code.google.com/p/crypto-js /)我没有结果.这是我正在使用的PHP代码:

$key = "oijhd981727783hy18274";
$text = "1233";
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC,$iv);
echo base64_encode($crypttext);
Run Code Online (Sandbox Code Playgroud)

然后这是我正在使用的Javascript代码:

var encrypted = CryptoJS.enc.Base64.parse("LiJU5oYHXRSNsrjMtCr5o2ev7yDFGZId85gh9MEXPeg=");
var key = 'oijhd981727783hy18274';
var decrypted = CryptoJS.AES.decrypt(encrypted, key);
document.write( decrypted.toString(CryptoJS.enc.Utf8) );
Run Code Online (Sandbox Code Playgroud)

因为我只是测试,我将来自php的输出直接复制/粘贴到JS中,看看它是否会返回任何结果,但这并不会发生.由于我是加密/解密部分的新手,我可能会遗漏一些东西.任何建议将不胜感激.

在旁注中,我在这里阅读了很多关于使用其他类型的通信来传输数据的建议,在这种情况下这是不可能的,因为我需要将此字符串传递给第三方软件,这将带来它在一个安全的区域,我可以访问只编辑javascript,这就是为什么我试图加密php中的文本并将其放在网站的源代码中,第三方软件将从中读取它,因为它是加密的并将它转移到安全部分,我将需要通过Javascript解密它(我没有访问PHP那里).

javascript php encryption mcrypt cryptojs

5
推荐指数
2
解决办法
1万
查看次数

错误:在Mac OS X Mavericks上没有可用的php54-mcrypt公式

我试图在Mac OS X Mavericks上通过Homebrew安装mcrypt PHP扩展,并得到以下错误.

Error: No available formula for php54-mcrypt

救命!

php mcrypt osx-mavericks

5
推荐指数
1
解决办法
3976
查看次数

如何将128 CFB转换为Ruby?

我需要与PHP API进行交换,该API会对请求和答案进行加密.在我这边我是在rails 4.0.0(ruby 2.0),我无法使它工作.

我已经阅读了很多关于这个主题的答案,并试图了解mcrypt的工作原理,例如http://www.chilkatsoft.com/p/php_aes.asp,但没有成功.我仍然无法解密从PHP加密或加密PHP可以解密的东西

你能帮助我,看看我做错了什么吗?

PHP代码:

$secretKey = "1234567891234567";
$encrypt = urlencode( base64_encode( mcrypt_encrypt(
             MCRYPT_RIJNDAEL_128,
             md5($secretKey),
             $cleartext,
             MCRYPT_MODE_CFB,
             $secretKey
           ) ) );

$input = urldecode($input);
$decrypt = mcrypt_decrypt( MCRYPT_RIJNDAEL_128,
                           md5($secretKey),
                           base64_decode($input),
                           MCRYPT_MODE_CFB,
                           $secretKey );
Run Code Online (Sandbox Code Playgroud)

Ruby代码:

def self.encode(params = {})
  cipher = OpenSSL::Cipher::AES.new(256, :CFB)
  cipher.encrypt
  cipher.key = Digest::MD5.hexdigest("1234567891234567")
  cipher.iv = "1234567891234567"
  encrypted = cipher.update(params.to_query) + cipher.final

  CGI.escape(Base64.strict_encode64(encrypted))
end

def self.decode(answer)
  decrypted = Base64.decode64(CGI.unescape(answer))

  decipher = OpenSSL::Cipher::AES.new(256, :CFB)
  decipher.decrypt
  decipher.key = Digest::MD5.hexdigest("1234567891234567")
  decipher.iv = "1234567891234567"
  decoded = decipher.update(decrypted) + …
Run Code Online (Sandbox Code Playgroud)

php ruby encryption aes mcrypt

5
推荐指数
1
解决办法
574
查看次数

关于更新到php 5.6.2的mcrypt警告; 尺寸x的键不受支持

从PHP 5.5.18更新到PHP 5.6.2后,我们收到以下警告:

mcrypt_decrypt(): Key of size 20 not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported
Run Code Online (Sandbox Code Playgroud)

加密算法在此之前似乎工作正常:

$decrypttext = mcrypt_decrypt(
  MCRYPT_RIJNDAEL_256,
  $this->keys[$key_label],
  $crypttext,
  MCRYPT_MODE_ECB,
  $iv
);
Run Code Online (Sandbox Code Playgroud)

重新加密所有东西将是一件很大的痛苦,有什么东西可以用来填充密钥,以便它能像以前一样工作吗?

据推测,这里没有任何安全漏洞.

php security mcrypt

5
推荐指数
1
解决办法
4433
查看次数

通过mcrypt加密,并通过opensl以CBC模式和密码BLOWFISH解密

我们已经使用mcrypt密码对一些数据进行了加密,BLOWFISH并且模式为CBC String加密,php5.5并且需要对此进行解密php7.1(已升级php版本)

以下是我们尝试使用openssl解密mcrypt字符串的代码

$data = "Lorem ipsum";
$key = "12345678";
$iv = "12345678";

$encrypted = mcrypt_encrypt(
    MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC, $iv);
echo $encrypted . PHP_EOL;

$decrypted = openssl_decrypt(
    $encrypted, "BF-CBC", $key,
    OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);

echo $decrypted;
Run Code Online (Sandbox Code Playgroud)

上面的代码没有解密字符串。请建议我任何解密字符串的方法

php encryption openssl mcrypt

5
推荐指数
1
解决办法
373
查看次数