希望有人可以对此有所启发。
我正在使用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
为什么会发生这种情况?可以采取什么措施(除了子字符串之外)来防止这种情况发生?
答案 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
似乎产生了我期望的输出