簡體   English   中英

解密 PHP 中的 crypt-js 加密字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM