Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#DES加密输出不总是与预期匹配_C#_Encryption_Des - Fatal编程技术网

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

C#DES加密输出不总是与预期匹配,c#,encryption,des,C#,Encryption,Des,我正在使用另一家(大型跨国)公司提供的API查询API。其中一个参数需要使用DES进行加密(我知道,这并不安全,但a.API已经开发,b.加密的数据对公众来说非常容易获得)。在我被要求运行的5个查询中,有2个可以正常工作,而其他3个则不行 这就是事情开始让我困惑的地方。工作正常的2显然正确地加密了数字。然而,该公司表示,加密输出与失败的3个加密输出不匹配。我真的不明白这是怎么回事,但他们告诉我,例如,一个预期的加密输出应该是“9B2653BF0C348 D8863266BEBF329 FDDD6

我正在使用另一家(大型跨国)公司提供的API查询API。其中一个参数需要使用DES进行加密(我知道,这并不安全,但a.API已经开发,b.加密的数据对公众来说非常容易获得)。在我被要求运行的5个查询中,有2个可以正常工作,而其他3个则不行

这就是事情开始让我困惑的地方。工作正常的2显然正确地加密了数字。然而,该公司表示,加密输出与失败的3个加密输出不匹配。我真的不明白这是怎么回事,但他们告诉我,例如,一个预期的加密输出应该是“9B2653BF0C348 D8863266BEBF329 FDDD64 3D2E4F4332”,但我的输出是“9B2653F8C848 B710BCA2B3BFBCDFD64 3D2E4F4332”-似乎每个中间的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();
}
公共字符串GetEncryptedValue(字符串baseValue)
{
使用(var desProvider=new DESCryptoServiceProvider)
{
模式=CipherMode.ECB,
Padding=PaddingMode.PKCS7,
Key=Encoding.UTF8.GetBytes(Key)
})
使用(var memoryStream=new memoryStream())
使用(var cryptoStream=新加密流(memoryStream,
DeProvider.CreateEncryptor(),CryptoStreamMode.Write))
{
var data=Encoding.UTF8.GetBytes(baseValue);
cryptoStream.Write(数据,0,数据长度);
cryptoStream.FlushFinalBlock();
返回ByteArrayToString(memoryStream.ToArray());
}
}
私有静态字符串byteArray字符串(ICollection byteArray)
{
var hex=新的StringBuilder(byteArray.Count*2);
foreach(字节数组中的单字节变量)
十六进制格式(“{0:x2}”,单字节);
返回hex.ToString().ToUpper();
}
有人能就原因提出建议吗?我尝试过不同的编码类型。我知道填充模式是PKCS#5,但根据算法是相同的。所涉及的公司规模很大,通常需要几天的时间,问题才能在几个国家之间得到答案,而答案往往是无关紧要的


谢谢。

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


添加到他们的系统中的值(即VIN编号)与字母O一起添加,字母O本应使用数字0;有趣的是,字母“O“在VIN中是一个非法的字符,人们会认为一家制造汽车的公司会知道

您可能有不同的
ByteArrayToString
实现。加密输出为3*8=24字节,这意味着初始值为16-23字节长。DES的块大小为8字节,这意味着8个输入字节对应8个输出字节,ECB模式意味着8字节块是独立的。这一点以及输出仅相差第二个8字节块的事实导致得出结论,即输入在位置8-16至少相差一个字节。你能检查加密的输入在你有问题的情况下是否相同吗?你可能是对的,但是我用来获取字节的任何其他编码类型都会导致所有输出与预期的输出不同。这与基于字符串字段的加密方法完全相同。