C# 从c加密的解密字符串#

C# 从c加密的解密字符串#,c#,php,encryption,C#,Php,Encryption,我有一个从c#用以下方法加密的字符串: public static string KEY = "81736529"; public string EncryptString(string stringToEncrypt,string keyStr) { byte[] key = { }; byte[] IV = { 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78 }; try { key = Enc

我有一个从c#用以下方法加密的字符串:

public static string KEY = "81736529";
public  string EncryptString(string stringToEncrypt,string keyStr)
{
    byte[] key = { };

    byte[] IV = { 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78 };
    try
    {
        key = Encoding.UTF8.GetBytes(keyStr);
        DESCryptoServiceProvider desProvidr = new
        DESCryptoServiceProvider();
        byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
        MemoryStream ms = new MemoryStream();
        CryptoStream csstreamdata = new CryptoStream(ms,
        desProvidr.CreateEncryptor(key, IV), CryptoStreamMode.Write);
        csstreamdata.Write(inputByteArray, 0, inputByteArray.Length);
        csstreamdata.FlushFinalBlock();
        return Convert.ToBase64String(ms.ToArray());
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
我试图在PHP中使用几种类型的方法对这个字符串进行解密,但不幸的是,它不起作用!! 这是我用php编写的代码

    $key = "81736529";
$data = "Ntl1xIjA1k3zn+uRxw8s+w==";

$ivSize = 8;
$iv = "1 18 35 52 69 86 103 120";
$data = substr ($data,0, 8);
$decrypted = rtrim(mcrypt_decrypt(MCRYPT_CRYPT, $key, $data, MCRYPT_MODE_CBC,$iv));

echo $decrypted;

你有四个问题:

  • 你的IV编码是错误的。使用类似于:

    $iv = "\x01\x12\x23\x34\x45\x56\x67\x78";
    

  • 执行适当的程序。DES和三重DES的块大小为8字节,AES的块大小为16字节

  • $data=substr($data,0,8)中断您的密文。由于您的密文是Base64编码的,因此必须首先对其进行解码:

    $data = base64_decode($data);
    
  • 您需要使用
    MCRYPT\u DES
    而不是
    MCRYPT\u CRYPT

综合起来:

$iv = hex2bin("0112233445566778");
$key = "81736529";
$data = "Ntl1xIjA1k3zn+uRxw8s+w==";

$data = base64_decode($data);
$decrypted = pkcs7unpad(mcrypt_decrypt(MCRYPT_DES, $key, $data, MCRYPT_MODE_CBC, $iv), 8);

echo $decrypted;

安全考虑:
  • 密钥应该是从整个字节范围中随机选择的。如果您只使用数字,则可以在几秒钟内强制执行密钥。键中的每个字节应在0x00-0xFF(0-255)范围内,而不是在0x30-0x39(“0”-“9”)范围内。查看ASCII表了解更多信息

  • 现在不要使用DES。它只提供56位安全性。AES会更好,因为它的最小密钥大小为128位,更安全。DES的最大密文大小也有实际限制。看

  • 静脉注射必须是不可预测的(阅读:随机)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定以前何时发送相同的消息前缀。IV不是秘密,所以你可以把它和密文一起发送。通常,它只是在密文前面加上前缀,然后在解密之前切掉


为什么会这样:
$data=substr($data,0,8)?这将使您的数据无效。@KIKOSoftware我只是删除了它,没有发生任何事情。我没有说它会突然工作,只是说有了那段代码它肯定不能工作。很抱歉误解了,我明白了。最好不要使用mcrypt,它是弃用软件,多年来没有更新过,也不支持标准PKCS 7(née PKCS 5)填充,只有非标准的空填充,甚至不能用于二进制数据。mcrypt在2003年就有很多杰出的作品。相反,考虑使用或提供完整的解决方案,并保持和纠正。谢谢你的答复和建议我,代码工作良好后,我改变了McCuTyCuLPT到McLogtEdes。
$iv = hex2bin("0112233445566778");
$key = "81736529";
$data = "Ntl1xIjA1k3zn+uRxw8s+w==";

$data = base64_decode($data);
$decrypted = pkcs7unpad(mcrypt_decrypt(MCRYPT_DES, $key, $data, MCRYPT_MODE_CBC, $iv), 8);

echo $decrypted;