为什么mcrypt_encrypt()将二进制字符放在字符串的末尾?

时间:2012-03-20 05:30:58

标签: php encryption mcrypt

这是一个加密和解密数据的PHP演示脚本:

<?

$encryptionkey = 'h8y2p9d1';

$card_nbr = "1234";
echo "original card_nbr: $card_nbr <br>\n";

$card_nbr_encrypted=encrypt_data($card_nbr);
echo "card_nbr_encrypted: $card_nbr_encrypted <br>\n";

$card_nbr_decrypted=decrypt_data($card_nbr_encrypted);
echo "card_nbr_decrypted: $card_nbr_decrypted <br>\n";

$len=strlen($card_nbr_decrypted);
echo "length: $len <br>\n";



function encrypt_data($text){
  global $encryptionkey;
  $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  $encrypted_text = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $encryptionkey, $text, MCRYPT_MODE_ECB, $iv);
  return $encrypted_text;
}

function decrypt_data($text){
  global $encryptionkey;
  $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  $decrypted_text = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $encryptionkey, $text, MCRYPT_MODE_ECB, $iv);
  return $decrypted_text;
}

?>


输出是:

original card_nbr: 1234
card_nbr_encrypted: vY¨(Z$<§G3-žÃ-Éù3Ý2Ê×rz¨VÛ
card_nbr_decrypted: 1234  (and 28 binary characters)
length: 32 


输出成功解密,但最后添加了28个二进制字符。在查看HTML源代码时,最容易在Firefox中看到这一点。 字符串长度32也证明了这一点。有什么想法吗?

enter image description here

4 个答案:

答案 0 :(得分:8)

使用空字符n * blocksize填充返回的字符串以填充\0字节,这就是您看到额外数据的原因。

如果您运行$card_nbr_decrypted= rtrim($card_nbr_decrypted, "\0");,则应返回实际数据。

答案 1 :(得分:3)

似乎是known problem。解码后使用rtrim()删除多余的NUL。

答案 2 :(得分:2)

您正在接收空字节,因为您正在为block cipher mode of operation使用电子代码块(ECB),这会填充明文的末尾以适应块大小。在您的情况下,块大小为256位,因为您使用的是MCRYPT_RIJNDAEL_256

如果您使用密码反馈(CFB)模式 - MCRYPT_MODE_CFB - 无空字节,无需修剪,您可以一起避免此填充问题。但是,对于CFB,您应该HMAC加密数据,以验证它是否未被(see "Mallet")篡改。您可以在Cryptography For The Average Developer找到工作实施的示例。

另外值得注意的是,ECB模式被认为不太安全,因为它可以reveal data patterns。此外,ECB(以及CBC,因为它也会填充)可能容易受到padding oracle attack的攻击。<​​/ p>

答案 3 :(得分:-1)

我认为问题在于您在以下情况下使用二进制数据:

mcrypt_encrypt - 使用给定参数加密明文

您可以使用base64_encode($ text)来使用明文。