PHP:mcrypt和openssl产生不同的输出

时间:2019-09-11 14:35:40

标签: php encryption openssl

希望有人可以对此有所启发。

我正在使用DES-CBC密码更新一些使用mcrypt_generic函数的旧代码

当我更新此代码以使用openssl_encrypt时,得到相同的输出,但是在编码字符串的末尾附加了8个字节。

之前

$this->_cipher = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_CBC,'');
mcrypt_generic_init($this->_cipher, $this->_key, $this->_iv) 
mcrypt_generic($this->_cipher, $text)

在方法输出之前:

  

27049189e7e08db6

之后

openssl_encrypt($text, "DES-CBC", $this->_key,  OPENSSL_RAW_DATA , $this->_iv);

方法输出后:

  

27049189e7e08db6d504d16516e1c567

为什么会发生这种情况?可以采取什么措施(除了子字符串之外)来防止这种情况发生?

2 个答案:

答案 0 :(得分:2)

根据this

  

1.3。数据大小

  DES算法在八个八位字节的块上运行。这通常需要在未加密的有效负载数据结束后进行填充。

可能只是填充输入内容。

mcrypt_encrypt()似乎默认填充0(基于docs中的代码示例):

# creates a cipher text compatible with AES (Rijndael block size = 128)
# to keep the text confidential 
# only suitable for encoded input that never ends with value 00h
# (because of default zero padding)
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
$plaintext, MCRYPT_MODE_CBC, $iv);

这将解释长度的差异。

答案 1 :(得分:1)

所以我设法找到解决方法

openssl_encrypt($text, "DES-CBC", $this->_key,  OPENSSL_NO_PADDING, $this->_iv);

此模式

  

OPENSSL_NO_PADDING

似乎产生了我期望的输出