我有一个加密的文本,我需要解密.它是用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中进行加密时,有没有人知道mcrypt_generic和mcrypt_encrypt之间的区别?
我使用以下函数来解密我的服务器上的数据:
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) 我正在尝试使用内置的加密库解码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"也会产生垃圾输出. …
在mcrypt_get_iv_size的PHP文档中,声明当算法/块模式组合不使用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流模式的算法产生正确的结果.
我正在寻找一种方法来对简单文本(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那里).
我试图在Mac OS X Mavericks上通过Homebrew安装mcrypt PHP扩展,并得到以下错误.
Error: No available formula for php54-mcrypt
救命!
我需要与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 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)
重新加密所有东西将是一件很大的痛苦,有什么东西可以用来填充密钥,以便它能像以前一样工作吗?
据推测,这里没有任何安全漏洞.
我们已经使用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)
上面的代码没有解密字符串。请建议我任何解密字符串的方法