我正在将MCRYPT ECB转换为打开的SSL ECB
MCRYPT功能
public function encrypt($input) {
$vi = base64_decode($this->iv);
$key = mb_convert_encoding($this->key, "UTF8");
$key = md5($key,true);
$key = $this->processKey($key);
$input = $this->addPKCS7Padding($input);
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
mcrypt_generic_init($td, $key, $vi);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$data = base64_encode($data);
return $data;
}
private function processKey($key) {
// Complete the key
$key_add = 24 - strlen($key);
$key .= substr($key, 0, $key_add);
// Padding the text
$text_add = strlen($text)%8;
for ($i=$text_add; $i<8; $i++){
$text .= chr(8-$text_add);
}
return $key;
}
private function addPKCS7Padding($source) {
$block = mcrypt_get_block_size('tripledes', 'cbc');
$pad = $block - (strlen($source) % $block);
if ($pad <= $block) {
$char = chr($pad);
$source .= str_repeat($char, $pad);
}
return $source;
}
来自here
mcrypt_module_open ( MCRYPT_3DES, '', 'ecb', '' ) == "DES-EDE3"
来自旧示例
1,md5键并转换为utf 8
2,添加PKCS7Padding openssl已经执行PKCS#7填充(所以我不添加)
在我的功能之前
function encry_it($data,$cipher_method,$secret_key ,$iv){
$secret_key = md5(utf8_encode($secret_key), true);
$result = openssl_encrypt($data, $cipher_method, $secret_key, $options=OPENSSL_RAW_DATA);
return base64_encode($result);
}
加密结果不同我不能将IV添加到openssl函数,因为它的错误是说此DES-EDE3期望0 IV因此,为什么会有不同的结果?
谢谢希望高端开发人员可以帮助我,谢谢
这里似乎存在复制/粘贴错误,这导致processKey
和addPKCS7Padding
功能混合在一起。可能必须是:
private function processKey($key) {
// Complete the key
$key_add = 24 - strlen($key);
$key .= substr($key, 0, $key_add);
return $key;
}
private function addPKCS7Padding($text) {
// Padding the text
$text_add = strlen($text)%8;
for ($i=$text_add; $i<8; $i++){
$text .= chr(8-$text_add);
}
return $text;
}
这样,如果在openssl代码中,openssl代码将返回与mcrypt代码相同的密文:
$cipher_method
等于des-ede
。原因:MD5摘要返回一个16字节的哈希,通过附加前8个字节,该哈希在mcrypt代码的processKey
中扩展为24个字节。结果用作与2TDEA对应的键。在openssl代码中,如果应用了des-ede
标识符,则可以直接将MD5摘要的16个字节的哈希值用作[2TDEA]的密钥(而不是与des-ede
对应的des-ede3
标识符,如果使用24个字节)使用由三个不同的DES密钥组成的密钥)。 注意:或者,可以在openssl代码中使用des-ede3
标识符,在这种情况下,必须将密钥扩展为类似于mcrypt代码的24个字节。
3TDEA替换为des-ede3
(在mcrypt代码中也使用)。原因:utf8_encode
和utf8_encode
具有不同的功能,并且通常会产生不同的结果:mb_convert_encoding(..., "UTF8")
将ISO-8859-1编码转换为UTF-8编码。 mb_convert_encoding(..., "UTF8")
在任意两种编码(每种都要指定)之间转换,即utf8_encode
将一种编码(要指定)转换成UTF-8编码。因此,如果转换了ISO-8859-1编码,则两个函数仅返回相同的结果。
已通过Base64解码的IV通过。原因:在mcrypt代码中,IV是通过Base64解码的,而在openssl代码中则不是。
关于安全性:mcrypt代码(以及由此衍生出的openssl代码)使用ECB模式和MD5摘要作为KDF,两者都不安全。更好的选择是GCM和PBKDF2。此外,应使用AES代替TripleDES,而不仅仅是出于安全性考虑,还是出于性能mb_convert_encoding
的考虑。