将框架从 mcrypt 转换为 openssl
Convert framework from mcrypt to openssl
我正在开发加密会话处理。我提供的示例使用 mcrypt,虽然我知道如何修改这些示例以适用于我的代码,但我不知道如何将 Mcrypt 转换为 Openssl。
private function encrypt($data, $key) {
$salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH';
$key = substr(hash('sha256', $salt.$key.$salt), 0, 32);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_ECB, $iv));
return $encrypted;
}
private function decrypt($data, $key) {
$salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH';
$key = substr(hash('sha256', $salt.$key.$salt), 0, 32);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($data), MCRYPT_MODE_ECB, $iv);
$decrypted = rtrim($decrypted, "[=10=]");
return $decrypted;
}
我想知道是否有人可以为此提供等效的 OpenSSL?作为记录,我不打算支持 Mcrypt,因此不需要向后兼容性。
所以在做了一些学习和研究之后,我想出了我自己的工作 openssl 版本,它达到了类似的结果。
private function encrypt( $data, $key ) {
$salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH';
$iv_size = openssl_cipher_iv_length( "AES-256-CBC-HMAC-SHA256" );
$hash = hash( 'sha256', $salt . $key . $salt );
$iv = substr( $hash, strlen( $hash ) - $iv_size );
$key = substr( $hash, 0, 32 );
$encrypted = base64_encode( openssl_encrypt( $data, "AES-256-CBC-HMAC-SHA256", $key, OPENSSL_RAW_DATA, $iv ) );
return $encrypted;
}
private function decrypt( $data, $key ) {
$salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH';
$iv_size = openssl_cipher_iv_length( "AES-256-CBC-HMAC-SHA256" );
$hash = hash( 'sha256', $salt . $key . $salt );
$iv = substr( $hash, strlen( $hash ) - $iv_size );
$key = substr( $hash, 0, 32 );
$decrypted = openssl_decrypt( base64_decode( $data ), "AES-256-CBC-HMAC-SHA256", $key, OPENSSL_RAW_DATA, $iv );
$decrypted = rtrim( $decrypted, "[=10=]" );
return $decrypted;
}
我正在开发加密会话处理。我提供的示例使用 mcrypt,虽然我知道如何修改这些示例以适用于我的代码,但我不知道如何将 Mcrypt 转换为 Openssl。
private function encrypt($data, $key) {
$salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH';
$key = substr(hash('sha256', $salt.$key.$salt), 0, 32);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_ECB, $iv));
return $encrypted;
}
private function decrypt($data, $key) {
$salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH';
$key = substr(hash('sha256', $salt.$key.$salt), 0, 32);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($data), MCRYPT_MODE_ECB, $iv);
$decrypted = rtrim($decrypted, "[=10=]");
return $decrypted;
}
我想知道是否有人可以为此提供等效的 OpenSSL?作为记录,我不打算支持 Mcrypt,因此不需要向后兼容性。
所以在做了一些学习和研究之后,我想出了我自己的工作 openssl 版本,它达到了类似的结果。
private function encrypt( $data, $key ) {
$salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH';
$iv_size = openssl_cipher_iv_length( "AES-256-CBC-HMAC-SHA256" );
$hash = hash( 'sha256', $salt . $key . $salt );
$iv = substr( $hash, strlen( $hash ) - $iv_size );
$key = substr( $hash, 0, 32 );
$encrypted = base64_encode( openssl_encrypt( $data, "AES-256-CBC-HMAC-SHA256", $key, OPENSSL_RAW_DATA, $iv ) );
return $encrypted;
}
private function decrypt( $data, $key ) {
$salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH';
$iv_size = openssl_cipher_iv_length( "AES-256-CBC-HMAC-SHA256" );
$hash = hash( 'sha256', $salt . $key . $salt );
$iv = substr( $hash, strlen( $hash ) - $iv_size );
$key = substr( $hash, 0, 32 );
$decrypted = openssl_decrypt( base64_decode( $data ), "AES-256-CBC-HMAC-SHA256", $key, OPENSSL_RAW_DATA, $iv );
$decrypted = rtrim( $decrypted, "[=10=]" );
return $decrypted;
}