C#DES加密输出并不总是与预期匹配

时间:2014-03-26 09:50:35

标签: c# encryption des

我正在使用另一家(大型跨国公司)提供的API查询API。其中一个参数需要使用DES加密(我知道,它不被认为是安全的,但a。已经开发了API,b。加密的数据无论如何都很容易为公众所用)。我已经达到要求我运行的5个查询中有2个正在运行的程度,但其他3个查询都没有。

这就是我开始迷惑的地方。工作正常的2显然正确地加密了数字。但是,该公司已经建议加密输出与3个失败的输出不匹配。我真的不明白这是怎么回事,但是他们已经告诉我,例如,一个预期的加密输出应该是" 9B2653BF0C348D8BA8643266BEBF329FDD643D2E4F432062"但我的输出是" 9B2653BF0C348D8B710BCAF2B3DBFCBFDD643D2E4F432062" - 似乎每个实例中间的16个字符与其输出不匹配。

我加密数据的代码如下:

public string GetEncryptedValue(string baseValue)
{
    using (var desProvider = new DESCryptoServiceProvider
          {
            Mode = CipherMode.ECB,
            Padding = PaddingMode.PKCS7,
            Key = Encoding.UTF8.GetBytes(Key)
          })
    using (var memoryStream = new MemoryStream())
    using (var cryptoStream = new CryptoStream(memoryStream, 
            desProvider.CreateEncryptor(), CryptoStreamMode.Write))
    {
       var data = Encoding.UTF8.GetBytes(baseValue);
       cryptoStream.Write(data, 0, data.Length);
       cryptoStream.FlushFinalBlock();

       return ByteArrayToString(memoryStream.ToArray());
    }
}

private static string ByteArrayToString(ICollection<byte> byteArray)
{
    var hex = new StringBuilder(byteArray.Count * 2);
    foreach (var singleByte in byteArray)
    hex.AppendFormat("{0:x2}", singleByte);
    return hex.ToString().ToUpper();
}

任何人都可以就原因可能提出建议吗?我尝试过不同的编码类型。我知道填充模式是PKCS#5,但根据this SO answer,算法是相同的。有问题的公司规模很大,往往需要几天的时间才能在几个国家之间提出问题,以获得通常无关紧要的答案。

感谢。

1 个答案:

答案 0 :(得分:0)

事实证明问题出在另一家公司的最后,并且完全支持Oleg Estekhin的评论:“加密输出是3 * 8 = 24字节,这意味着初始值是16-23字节长.DES有8字节的块大小,意味着8个输入字节对应8个输出字节,ECB模式意味着8字节块是独立的。这和输出仅相差第二个8字节块的事实导致结论输入在位置8-16中至少相差一个字节。“

添加到他们系统的值(它们是VIN号)加上字母O,其中应该使用数字0;有趣的是,字母“O”在VIN中是一个非法字符,人们会认为制造汽车的公司会知道!