Openssl

如何通過命令行使openssl加密像php這樣的密碼

  • July 25, 2016

我有這個 php 腳本(encrypt.php)

<?php
   function encrypt($pure_string, $encryption_key, $encryptionMethod = "AES-256-CBC")
   {
       $iv = "3571984260";
       $encrypted_string = openssl_encrypt($pure_string, $encryptionMethod, $encryption_key, false, $iv);
       return $encrypted_string;
   }

   echo encrypt ("$argv[1]", 'mysecret');
?>

它有效,但我試圖通過 openssl cli 達到相同的結果(我需要它)。

但是這個:

echo '12345' | openssl enc -aes-256-cbc -iv "3571984260" -k mysecret -a

不會產生與以下相同的結果:

php encrypt.php 12345

實際上,shell 版本會為每次執行更改生成的字元串,而 php 版本始終會生成相同的字元串。我需要使用 openssl cli 獲得與 php 腳本相同的結果。

我究竟做錯了什麼?

我發現了!

php 使用ivkey變數作為字元串,opensslCLI 需要字元串的十六進製版本,如我將展示的那樣,沒有空格和換行符。

首先,我需要使用以下命令將 iv 和傳遞字元串轉換為十六進制:

確定 IV 十六進制等效項:

hexiv=$(echo $(echo -n '3571984260' | od -A n -t x1) | tr -d " ")

確定mysecret十六進制等效項:

hexpass=$(echo $(echo -n 'mysecret' | od -A n -t x1) | tr -d " ")

現在還有一件事,php 的通行證不是 openssl cli 的通行證,而是 KEY:

echo -n '12345' | openssl enc -aes-256-cbc -iv "$hexiv" -K "$hexpass" -a

現在它的工作方式與 php 腳本完全一樣!

重要提示:我需要使用-K大寫或生成的字元串不一樣。

引用自:https://unix.stackexchange.com/questions/296945