【问题标题】:What are parameters to be added in the mcrypt_ decrypt() function in PHPPHP的mcrypt_decrypt()函数要加什么参数
【发布时间】:2013-06-24 21:41:58
【问题描述】:

我有以下 C# 代码,但我在为 PHP 添加参数时遇到困难 mcrypt_decrypt()。

  private string Decrypt(string strText, string sDecrKey)
    {
        string message;
        byte[] rgbKey = new byte[0];
        byte[] rgbIV = new byte[] { 0x12, 0x34, 0x56, 120, 0x90, 0xab, 0xcd, 0xef };
        byte[] buffer = new byte[strText.Length + 1];
        try
        {
            rgbKey = Encoding.UTF8.GetBytes(Strings.Left(sDecrKey, 8));
            DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
            buffer = Convert.FromBase64String(strText);
            MemoryStream stream2 = new MemoryStream();
            CryptoStream stream = new CryptoStream(stream2, provider.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
            stream.Write(buffer, 0, buffer.Length);
            stream.FlushFinalBlock();
            message = Encoding.UTF8.GetString(stream2.ToArray());
        }
        catch (Exception exception1)
        {
            ProjectData.SetProjectError(exception1);
            Exception exception = exception1;
            message = exception.Message;
            ProjectData.ClearProjectError();
            return message;
            ProjectData.ClearProjectError();
        }
        return message;
    }

字符串 mcrypt_decrypt ( 字符串 $cipher , 字符串 $key , 字符串 $data , 字符串 $mode [, 字符串 $iv ] )

我的数据是-:"iHcKDE0aeDZU3q31ULZcvQ=="

Key-:"&%#@?,:*"

我想使用 PHP mcrypt_decrypt() 函数解密这些数据。我在 C# 方面的知识很少,但 PHP 很好。请帮帮我

<?php
$key = pack("nvc*",0x12, 0x34, 0x56, 120, 0x90, 0xab, 0xcd, 0xef);
$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB)
$ciphertext_dec = base64_decode("iHcKDE0aeDZU3q31ULZcvQ==");
$iv_dec = substr($ciphertext_dec, 0, $iv_size);
$retval = mcrypt_decrypt(MCRYPT_3DES, $key, $ciphertext_dec, MCRYPT_MODE_CFB, $iv_dec);
echo $retval;
?>

【问题讨论】:

  • 您是否遇到任何错误?您可以发布您在 PHP 中尝试过的内容,而不是 C# 代码吗?
  • echo mcrypt_decrypt(MCRYPT_3DES,$key,$ciphertext_dec,MCRYPT_MODE_CFB)
  • 我得到的输出为 ¼p_‡

标签: c# php encryption


【解决方案1】:

从外观上看,你需要创建一个iv,而不是在$key 上运行substrsubstr 的键是mcrypt_get_key_size(cipher, mode),看来你正在使用iv .

$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

并且iv 应该来自随机来源,而不是$key 减少。不过,iv 是可选的。这是我能看到的唯一问题。

这是旧的,但是当我写它时它对我来说很好用。 Cipher.php

<?php
function encrypt($data, $key = null, $iv = null) {
    $key = (strlen($key) == 0) ? $key = null : $key;

    $key_size = mcrypt_get_key_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
    $key = hash("sha256", $key, true); 
    $key = substr($this->key, 0, $key_size);

    if ($iv == null) {
        $iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    }

    $out = mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CFB, $iv); 
    return base64_encode($out);
}

function decrypt($data, $key = null, $iv = null) {
    $key = (strlen($key) == 0) ? $key = null : $key;

    $key_size = mcrypt_get_key_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
    $key = hash("sha256", $key, true); 
    $key = substr($this->key, 0, $key_size);

    if ($iv == null) {
        $iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    }

    $data = base64_decode($data); 
    $out = mcrypt_decrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CFB, $iv);
}

$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$encrypted = encrypt('my data.', 'my secret key', $iv);
$decrypted = decrypt($encrypted, 'my secret key', $iv);

# $decrypted = 'my data.'
?>

更新

我已更新Cipher.php 以便于交互。您不再需要专门设置 ivCipher::encrypt 并将其附加到加密数据中。 Cipher::decrypt 然后在解密加密数据之前将其提取出来。

IV 仅用于为加密例程提供替代种子。这个 IV 根本不需要保密,尽管它可能是可取的。您甚至可以将其与您的密文一起发送而不会失去安全性。

【讨论】:

  • 你有你的秘密$key,我在一个字符串上运行了sha256,然后用mcrypt_get_key_size 将它截断,然后你的iv 是从随机来源生成的。例如在Cipher.php,你运行$encrypted = $cipher-&gt;encrpyt('my data', 'my secret key'); $last_iv = $cipher-&gt;getIV(); $decrypted = $cipher-&gt;decrypt($encrypted, 'my secret key', $last_iv);
  • 字符串 strText = Conversions.ToString(Interaction.IIf(Information.IsDBNull(RuntimeHelpers.GetObjectValue(current["ABC"])), "", RuntimeHelpers.GetObjectValue(current["ABC"]) ));
猜你喜欢
  • 2010-10-12
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 2018-06-24
  • 2019-09-10
  • 1970-01-01
  • 2016-07-27
  • 2023-03-27
相关资源
最近更新 更多