c# DES加密输出并不总是匹配预期
本文关键字:DES 加密 输出 | 更新日期: 2023-09-27 17:53:21
我正在使用另一家(大型跨国)公司提供的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,但根据这个SO回答算法是相同的。问题中的公司规模很大,通常需要几天的时间才能在几个国家之间得到一个答案,而这个答案往往是不相关的。
谢谢。
事实证明问题出在另一家公司的一端,并完全支持Oleg Estekhin的评论:"加密的输出是3*8=24字节,这意味着初始值是16-23字节长。DES的块大小为8字节,即8个输入字节对应8个输出字节,ECB模式表示8字节块是独立的。这一点以及输出仅相差第二个8字节块的事实导致结论,即输入在位置8-16中至少相差一个字节。"
添加到他们系统中的值(即VIN号)在应该使用数字0的地方添加了字母O;有趣的是,字母"O"在vin中是一个非法字符,人们会认为制造汽车的公司会知道这个字符!