【问题标题】:looking for simple PHP multi way encryption method寻找简单的PHP多路加密方法
【发布时间】:2012-05-19 04:23:14
【问题描述】:

我需要借助静态密钥解密加密的 POST 值字符串。

我已经研究过 crypt()(但它只是单向的)和 Mcrypt、GnuPG……但我对它们并不满意。我认为它们对于我的简单问题来说太复杂了。我应该使用什么?我不需要 IV 形状或超级安全的算法。有什么我不知道的基本 PHP 函数吗?

我只需要像这样对用户隐藏图像路径: ImageJPEG(ImageCreateFromJPEG(decode($_REQUEST['encryptedImage'],'secret Key')));

【问题讨论】:

  • 简单的 Mcrypt 解决方案:函数 simple_encrypt($text, $salt) { return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB)), MCRYPT_RAND) ))); } function simple_decrypt($text, $salt) { return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $salt, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); }

标签: php key encryption


【解决方案1】:

更新 (27/09/17):

自从 PHP 7.1.0 起,mcrypt_encrypt 已被弃用。我使用openssl 添加了一个简单的加密/解密。

function encrypt($string, $key = 'PrivateKey', $secret = 'SecretKey', $method = 'AES-256-CBC') {
    // hash
    $key = hash('sha256', $key);
    // create iv - encrypt method AES-256-CBC expects 16 bytes
    $iv = substr(hash('sha256', $secret), 0, 16);
    // encrypt
    $output = openssl_encrypt($string, $method, $key, 0, $iv);
    // encode
    return base64_encode($output);
}

function decrypt($string, $key = 'PrivateKey', $secret = 'SecretKey', $method = 'AES-256-CBC') {
    // hash
    $key = hash('sha256', $key);
    // create iv - encrypt method AES-256-CBC expects 16 bytes
    $iv = substr(hash('sha256', $secret), 0, 16);
    // decode
    $string = base64_decode($string);
    // decrypt
    return openssl_decrypt($string, $method, $key, 0, $iv);
}

$str = 'Encrypt this text';
echo "Plain: " .$str. "\n";

// encrypt
$encrypted_str = encrypt($str);
echo "Encrypted: " .$encrypted_str. "\n";

// decrypt
$decrypted_str = decrypt($encrypted_str);
echo "Decrypted: " .$decrypted_str. "\n";

原答案:

再简单不过了:(PHP

<?php 
define('SECRET',md5('Some secret key'));

function encrypt($value){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SECRET, $value, MCRYPT_MODE_ECB, $iv);
}

function decrypt($value){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SECRET, $value, MCRYPT_MODE_ECB, $iv));
}

?>

【讨论】:

  • 也不能比它更容易受到攻击。让我们来看看。使用欧洲央行(大忌)。使用 Rijndael 256 而不是 128(这将是 AES)。不认证。不是填充。是的。所以不...不要这样做。只需使用一个库(Zend\Crypt\BlockCipher 是一个不错的选择)。
  • 使用上述函数解密:U09DUlR5TllGbXNKdVRWVHg2ZnNCQT09
【解决方案2】:

您可以将内置函数封装起来,让它们更友好。就像在mcrypt_cbc 的文档页面上的第二个用户帖子中一样:

<?php
$stuff="String to enc/enc/dec/dec =,=,";
$key="XiTo74dOO09N48YeUmuvbL0E";

function nl() {
    echo "<br/> \n";
}
$iv = mcrypt_create_iv (mcrypt_get_block_size (MCRYPT_TripleDES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);

// Encrypting
function encrypt($string, $key) {
    $enc = "";
    global $iv;
    $enc=mcrypt_cbc (MCRYPT_TripleDES, $key, $string, MCRYPT_ENCRYPT, $iv);

  return base64_encode($enc);
}

// Decrypting
function decrypt($string, $key) {
    $dec = "";
    $string = trim(base64_decode($string));
    global $iv;
    $dec = mcrypt_cbc (MCRYPT_TripleDES, $key, $string, MCRYPT_DECRYPT, $iv);
  return $dec;
}

$encrypted = encrypt($stuff, $key);
$decrypted = decrypt($encrypted, $key);

echo "Encrypted is ".$encrypted . nl();
echo "Decrypted is ".$decrypted . nl();
?>

【讨论】:

    【解决方案3】:

    这是我所知道的唯一基本的内置函数。

    $string = "/path/img.jpg";
    
    $scramble = str_rot13($string);
    
    echo "<p>Scrambled: ".$scramble;
    
    echo "<p>Unscrambled: ".str_rot13($scramble);
    

    【讨论】:

    • @Tom 是的,我只是建议它,因为 OP 想要隐藏图像路径,我不认为仅仅看一个字符串你就会立即知道它是通过 str_rot13 传递的。我建议编写自己的旋转函数,但我认为我会建议最基本的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    相关资源
    最近更新 更多