国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

如何將 mcrypt_crypt 轉(zhuǎn)換為 openssl_crypt?
P粉287345251
P粉287345251 2023-09-09 17:35:02
0
1
742

我想改進(jìn)某個使用現(xiàn)已過時的“mcrypt”的 WordPress 插件。相反,我想使用 OpenSSL 庫來加密提交的數(shù)據(jù),但在加密過程中我遇到了問題,即: openssl_encrypt 函數(shù)返回與 mcrypt_encrypt 不同的值,我連接到的系統(tǒng)不會返回我的值正確的數(shù)據(jù),并且其所有者無法向我發(fā)送我上傳到其中的內(nèi)容的日志:(

我已經(jīng)搜索了整個互聯(lián)網(wǎng),但還沒有找到解決方案。我懷疑問題出在填充上,但我找不到解決方案。你能幫忙嗎?

下面是我的 PHP 對象 $password、$salt 和 $iv 的內(nèi)部明顯發(fā)生了變化

class EncryptDebug{
private $algo = 'sha1';
private $password = 'ab4232goodcf423484422c90c3e4aa7c';
private $salt = 'ascastas54490a31';
private $iv = '8947da32awl55kwj'
private $lenght = 16;
private function generate_key(){
    return hash_pbkdf2( $this->algo , $this->password , $this->salt, 100, $this->lenght, true );
}
public function encryptSSL($plaintext){
    $key = $this->generate_key();
    $ciphertext = base64_encode(openssl_encrypt($plaintext, 'AES-128-CBC', $key,  OPENSSL_ZERO_PADDING, $this->iv));
    
    return str_replace('+', '%2B', $ciphertext);

}
public function encryptMCRYPT($plaintext){
    $key = $this->generate_key();
    $ciphertext = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_CBC, $this->iv));
    
    return str_replace('+', '%2B', $ciphertext);

}
}

忘記提及:OPENSSL_ZERO_PADDING 返回錯誤。使用 OPENSSL_RAW_DATA 我可以獲得與 mcrypt_encrypt 類似的結(jié)果,但結(jié)局不同,例如:

OpenSSL:rPzVvF7gaPMA4ADAjHUW8Wy1ThTJG%2BVPdcz5iKAkAwrDTTFTcOpWgWOCh9l9JFZ8WcNzMJ868026TkUxcYJMrQ==

MCRYPT:rPzVvF7gaPMA4ADAjHUW8Wy1ThTJG%2BVPdcz5iKAkAwrDTTFTcOpWgWOCh9l9JFZ8UGVfF091Q9bY61mTRg%2BBSg==

P粉287345251
P粉287345251

全部回復(fù)(1)
P粉021854777

encryptSSL() 中,當(dāng)前使用 Base64 編碼兩次,默認(rèn)情況下一次是顯式編碼,一次是隱式編碼。因此,必須刪除其中一種 Base64 編碼,無論是顯式編碼還是隱式編碼。前者是通過刪除 base64_encode() 調(diào)用來實現(xiàn)的,后者是通過設(shè)置 OPENSSL_RAW_DATA 標(biāo)志來實現(xiàn)的。

此外,mcrypt 使用零填充,PHP/OpenSSL 使用 PKCS#7 填充。因此,為了使 encryptSSL() 給出與 encryptMCRYPT() 相同的結(jié)果,必須使用零填充。由于 PHP/OpenSSL 不支持零填充,因此必須禁用 PKCS#7 填充(使用 OPENSSL_ZERO_PADDING 標(biāo)志)并且必須顯式實現(xiàn)零填充>.

總體:

$ciphertext = openssl_encrypt($this->zeroPad($plaintext, 16), 'AES-128-CBC', $key,  OPENSSL_ZERO_PADDING, $this->iv); // remove base64_encode(), zero pad plaintext, disable PKCS#7 padding 

與:

protected function zeroPad($text, $bs) {
    $pad = $bs - strlen($text) % $bs;
    return ($pad < 16) ? $text .  str_repeat("rrreee", $pad) : $text;
}

通過這些更改,兩個函數(shù)給出相同的結(jié)果。

請注意,與 PKCS#7 填充相比,零填充不可靠。


安全性:

請注意,靜態(tài) IV 和靜態(tài)鹽是漏洞。相反,兩者都將隨機生成并與密文一起傳遞到解密方,通常是串聯(lián)的(兩者都不是秘密的)。

此外,PBKDF2 的迭代次數(shù)為 100 通常太小。

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板