解密返回垃圾数据

时间:2014-05-21 21:02:13

标签: c# encryption

我的加密算法运行正常,并将其保留了几个月。今天我需要再次使用它,不知怎的,它破了。我已经戳了一会儿,却无法发现问题所在。没有错误,它只返回垃圾数据。

安装程序:PHP脚本(已在生产中工作了很长时间)使用以下方法加密某些字符串:

function hexstr($hexstr) 
{
  // return pack('H*', $hexstr); also works but it's much harder to understand.
  $return = '';
  for ($i = 0; $i < strlen($hexstr); $i+=2) {
    $return .= chr(hexdec($hexstr[$i] . $hexstr[$i+1]));
  }
  return $return;
}

function encrypt($str, $key)
{
    $key = hexstr($key);
    $size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($size, MCRYPT_RAND);
    return $iv . mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_CBC,$iv);
}

如果我在php端解密它,它可以正常工作。

然后字符串是base64编码的:

$encoded = base64_encode($encrypted);

最后,C#程序获得了它并执行以下操作:

....
byte[] decoded = Convert.FromBase64String(myWebText);
Decrypt(decoded)
.....


public static byte[] Decrypt(byte[] p)
{
    RijndaelManaged aes128 = new RijndaelManaged();
    aes128.KeySize = 128;
    //aes128.BlockSize = 
    aes128.Padding = PaddingMode.Zeros;
    aes128.Mode = CipherMode.CBC;
    aes128.Key = StringToByteArray("SOMEHEXSTRING");
    //pull the iv off the front of the byte array
    if (p.Length <= 16)
    {
        Utils.ReportError("byte array too short");
        return null;
    }
    byte[] iv = new byte[16];
    Array.Copy(p, 0, iv, 0, 16);
    aes128.IV = iv;
    ICryptoTransform transform = aes128.CreateDecryptor();
    byte[] result = transform.TransformFinalBlock(p, 16, p.Length - 16);

    Debug.Log("If this encrypted stuff was text it would be:"+System.Text.Encoding.UTF8.GetString(result));
    return result;
}


public static byte[] StringToByteArray(string hex)
{
    if (hex.Length % 2 == 1)
        throw new Exception("The binary key cannot have an odd number of digits");

    byte[] arr = new byte[hex.Length >> 1];

    for (int i = 0; i < hex.Length >> 1; ++i)
    {
        arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1])));
    }

    return arr;
}

有谁知道这可能不起作用?它必须非常接近,因为我确信它在某一点上起作用。 更新:我做了C#encode \ decode和php编码解码时的二进制比较。当使用相同的IV时,php编码的Hello World与c#Hello world不同。这是可能的,还是这表明他们没有以某种方式使用相同的配置。

2 个答案:

答案 0 :(得分:1)

事实证明我已经改变了密钥以使非大写字母和我的GetHexVal函数显示只有大写字母...哎哟

答案 1 :(得分:0)

IDEA:解密密钥已更改。

当它发生时非常讨厌。 您使用带解密密钥的配置文件吗? 如果不是什么是decryptionKey使用? 它改变了吗?

如果使用localApp.configROOT.config且密钥已更改,您可以搜索所有备份以获取密钥。

 <machineKey decryptionKey="SomeHexValueHere" validationKey="SomeveryLongHexvalueHere" />

但是如果您的PHP版本正常工作,那么密钥必须是“已知”