![](/img/trans.png)
[英]How can I decrypt password string in PHP which was encrypted with crypt?
[英]Decrypt crypt-js encrypted string in PHP
在react
中使用crypto-js
時,我已經一一加密了多個字符串。
對於我使用的加密 -
encryptAES = (text, key) => {
return CryptoJS.AES.encrypt(text, key).toString();
};
對於解密,我使用 function 如下 -
decryptAES = (encryptedBase64, key) => {
const decrypted = CryptoJS.AES.decrypt(encryptedBase64, key);
if (decrypted) {
try {
console.log(decrypted);
const str = decrypted.toString(CryptoJS.enc.Utf8);
if (str.length > 0) {
return str;
} else {
return 'error 1';
}
} catch (e) {
return 'error 2';
}
}
return 'error 3';
};
我在這里上傳了這個加密解密的工作示例項目。
例如,如果我使用密鑰“地球”加密“我住在印度”,它會將 output 轉換為 -“U2FsdGVkX1+cBvU9yH5fIGVmliJYPXsv4AIosUGH4tA=”,類似地,它會使用正確的密鑰成功解密。
現在我的數據庫中存儲了多個加密字符串,但現在要求它們存儲未加密的字符串,所以我想在 PHP 中解密它們。 我可以使用上面提到的 function 在js
中解密它們,但我無法弄清楚如何在PHP
中這樣做。 我已經嘗試過這個github 存儲庫,但我無法為我的用例定制它。
對於解密,必須首先確定鹽和密文。 為此,必須對 CryptoJS 代碼的加密數據進行 Base64 解碼。 salt是Base64解碼數據的后8個字節,后面是實際密文(前8個字節是Salted__
的ASCII編碼,可以忽略)。
確定鹽之后,將使用EVP_BytesToKey()
導出密鑰和 IV。 您可以在 web 上找到各種 PHP 實現,例如這里。 請注意,CryptoJS 使用 MD5 作為摘要,因此必須對鏈接代碼中的摘要進行相應修改。
一旦確定了密鑰和 IV,就可以解密實際的密文。
全部一起:
<?php
// Separate salt and actual ciphertext
$ctOpenSSL = base64_decode("U2FsdGVkX1+cBvU9yH5fIGVmliJYPXsv4AIosUGH4tA=");
$salt = substr($ctOpenSSL, 8, 8);
$ciphertext = substr($ctOpenSSL, 16);
// Derive key and IV
$keyIv = EVP_BytesToKey($salt, "earth");
$key = substr($keyIv, 0, 32);
$iv = substr($keyIv, 32, 16);
// Decrypt
$decrypted = openssl_decrypt($ciphertext, "aes-256-cbc", $key, OPENSSL_RAW_DATA, $iv);
print($decrypted . PHP_EOL); // I live in India
function EVP_BytesToKey($salt, $password) {
$bytes = '';
$last = '';
while(strlen($bytes) < 48) {
$last = hash('md5', $last . $password . $salt, true);
$bytes.= $last;
}
return $bytes;
}
?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.