我有以下加密功能,我试图扭转它,但似乎我想念一些
$ceva = "123456";
function encrypt($plaintext,$textHos) {
$textLen=str_pad(dechex(strlen($plaintext)),8, '0', STR_PAD_LEFT);
$salt='WSj2g7jTvc8ISmL60Akn';
$textHosHash=hash('sha256',$salt.$textHos);
$textHos= md5($textHos,true);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $textHos,
$plaintext, MCRYPT_MODE_CBC,$iv);
$ciphertext = $iv . $textHosHash . $textLen . $ciphertext;
$ciphertext_base64 = base64_encode($ciphertext);
return $ciphertext_base64;
}
$data = encrypt($ceva,$textHos);
我试图做的是:
$data = 'HpOrKcKS1hwAiFfpbZnijmZmZjg1OWMzOWFlNzRiMzU2Y2JiMTQ5OTY4MTI3MWNiYjQzYjBkMTAyNDUzM2ZhNGJjZmZhNzQ4M2QxN2M0ZGYwMDAwMDAwNu6mYaA+BBBVfbFXChMm/BE=';
$textHos = 'MCRYPT_RIJNDAEL_128';
$salt='WSj2g7jTvc8ISmL60Akn';
$textHosHash=hash('sha256',$salt.$textHos);
$textHos= md5($textHos,true);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$textHosHash=hash('sha256',$salt.$textHos);
$base64de = base64_decode($data);
$mdecrypt = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $textHos, $base64de, MCRYPT_MODE_CBC,$iv);
然后我停了下来因为我的思绪被冻结了。
任何想法?
答案 0 :(得分:0)
你在加密功能中错过了这部分:
$ciphertext = $iv . $textHosHash . $textLen . $ciphertext;
在运行`mcrypt_decrypt'之前你需要从数据前面剥离这些东西。
答案 1 :(得分:0)
我不会为你编写代码,但我会概述这些步骤。要解密,您必须先颠倒加密所做的步骤,最后要做的事情。所以,让我们看一下密文并尝试一下。
我们在加密端做的最后一件事是base64 编码它,所以我们在解密端做的第一件事是base64 decode 它。这将为我们提供一串字节,这些字节是作为iv,密钥散列,原始明文的8字符十进制ASCII长度和密文的串联而创建的。所以现在你必须提取这些字段。幸运的是,你知道前3个字段的确切长度。
iv:16个字符 key hash:64个字符(十六进制ASCII,代表32个字节)在您的代码中,您正在尝试创建一个新的随机IV来解密。那是错的,您必须恢复用于加密的原始IV并使用该IV进行解密。此外,由于您传输了密钥的哈希值,因此应该对您正在使用的解密密钥进行哈希处理,并确保它与使用密文发送的哈希值匹配。您现在拥有解密密文所需的一切。结果将是填充的明文。最后,使用明文长度去除可能已添加的任何填充。