4

根据OpenSSLhttps://www.openssl.org/docs/apps/enc.html#OPTIONS)的文档,他们期望and的hex-digit值;这是否意味着只有数字?或者哈希会做吗?(因为 a似乎不可逆)keyivmd5md5

  • 注意我提到key的是iv因为$passwordPHP函数openssl_encrypt实际上是关键。

(几乎)直接来自PHP评论(http://php.net/manual/en/function.openssl-encrypt.php

function strtohex($x) 
{
    $s='';
    foreach (str_split($x) as $c) $s.=sprintf("%02X",ord($c));
    return($s);
} 

$source = 'It works !';

$iv = substr( md5( "123sdfsdf4567812345678" ), 0, 16 );
$pass = '1234567812345678';
$method = 'aes-256-cbc';

echo "\niv in hex to use: ".$iv;
echo "\nkey in hex to use: ".strtohex($pass);
echo "\n";

file_put_contents ('./file.encrypted',openssl_encrypt ($source, $method, $pass, true, $iv));

$exec = "openssl enc -".$method." -d -in file.encrypted -nosalt -nopad -K ".strtohex($pass)." -iv ".$iv;

echo 'executing: '.$exec."\n\n";
echo exec ($exec);
echo "\n";
4

2 回答 2

3

您的第一个链接是关于命令行工具,而不是 PHP 函数。你很难在终端中输入二进制数据,因此为什么那里的密钥必须是十六进制编码的。

然而,在 PHP 中,openssl_encrypt()需要openssl_decrypt()一个原始的二进制字符串。

该文档还具有误导性,因为它提到了“密码”而不是“密钥”。你已经注意到了,但是加密密钥不是你应该通过键盘输入的东西,而且md5()-ing 任何东西也永远不是加密密钥的答案。密钥必须通过openssl_random_pseudo_bytes()(或至少这是您的情况最方便的方式)随机生成:

$key = openssl_random_pseudo_bytes(32);

(IV 也一样)

如果您需要对结果进行十六进制编码$key,只需将其传递给bin2hex(),但是您提供的示例有点损坏……您正在执行双重加密。通过 PHP 加密文件内容就足够了,你不需要处理命令行。

请注意,我的回答远非加密的全部内容。您还应该添加身份验证、适当的填充、仔细考虑如何管理和存储您的密钥等。

如果您想了解它,这里有一篇相当简短但仍然具有描述性的博客文章,它为您应该涵盖的关键点提供了正确的答案:http: //timoh6.github.io/2014/06/16/PHP-data -加密-cheatsheet.html

如果您只需要简单地完成工作 - 使用流行的加密库,不要自己编写。

于 2014-08-27T23:39:01.613 回答
1

我花了一些时间来处理openssl 文档。最后,我找到了使用 base64_encode() 将编码和解码为 ASCII 文本的解决方案:

//Return encrypted string
public function stringEncrypt ($plainText, $cryptKey = '7R7zX2Urc7qvjhkr') {

  $length   = 8;
  $cstrong  = true;
  $cipher   = 'aes-128-cbc';

  if (in_array($cipher, openssl_get_cipher_methods()))
  {
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext_raw = openssl_encrypt(
      $plainText, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
    $hmac = hash_hmac('sha256', $ciphertext_raw, $cryptKey, $as_binary=true);
    $encodedText = base64_encode( $iv.$hmac.$ciphertext_raw );
  }

  return $encodedText;
}


//Return decrypted string
public function stringDecrypt ($encodedText, $cryptKey = '7R7zX2Urc7qvjhkr') {

  $c = base64_decode($encodedText);
  $cipher   = 'aes-128-cbc';

  if (in_array($cipher, openssl_get_cipher_methods()))
  {
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = substr($c, 0, $ivlen);
    $hmac = substr($c, $ivlen, $sha2len=32);
    $ivlenSha2len = $ivlen+$sha2len;
    $ciphertext_raw = substr($c, $ivlen+$sha2len);
    $plainText = openssl_decrypt(
      $ciphertext_raw, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
  }

  return $plainText;
}
于 2019-02-14T19:06:36.823 回答