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

标签 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

最佳答案

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

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

关于php - 为什么 mcrypt_encrypt() 将二进制字符放在字符串的末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9781780/

相关文章:

php - 如何使用preg_match检查我的字符串是否包含空格?

无需使用 UNION 的 php mysql 解决方法

encryption - 需要有关自签名 SSL 和 Java 的建议

java - 如果没有无限强度的 JCE 文件,Java 中是否可以进行 AES256 加密解密?

c# - TripleDESCryptoServiceProvider.Blocksize 不同于 PHP 的 mcrypt_get_key_size

php - 使用复选框过滤 MySQLi

php - Laravel - 将自定义样式添加到现有的 app.scss

linux - 加密/解密在两个不同的 openssl 版本之间不能很好地工作

php - 在 Python 中解密用 PHP 中的 MCRYPT_RIJNDAEL_256 加密的字符串

c# - 在 .Net (C#) 中解密 mcrypt 文件