如何解决System.Security.Cryptography.CryptographicException: '错误数据 ' - DES 加密
我正在将一些代码从 Python 转换为 C#(.net framework 4.8、VS 2019、WIN 10)。一开始,我使用 DES CBC 加密数据并使用 DES ECB 解密。在中间,我有坏数据的例外。 我看到它可能连接到不同的键,但我不排除相同的结果,所以我不知道是什么原因造成的。
我无法比较结果,因为数据变量每次都是随机的。
密钥(cmacKey)为15522d4fca86042d
,数据为93450567Â@ïÇpReAcTiV0000
private byte[] CBCMAC3DES(string cmacKey,string data){
// pad by zeroes to multiple of eight
string workDataStr = data;
while ((workDataStr.Length / 2) % 8 != 0)
workDataStr += "00";
byte[] clearBytes = Str2byteArr(workDataStr);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.KeySize = 64;
des.Mode = CipherMode.CBC;
// taking only 8 chars from the key,convert to ascii and to byte array
des.Key = Str2byteArr(HexStringToAsciString(cmacKey).Substring(0,8));
des.IV = new byte[8] { 0,0 };
ICryptoTransform ct = des.CreateEncryptor();
byte[] resultArray = ct.TransformFinalBlock(clearBytes,clearBytes.Length);
byte[] lastBlock = new byte[8];
for (int i = 0; i < 8; i++)
lastBlock[i] = resultArray[resultArray.Length - (8 - i)];
// Decryption
des.Mode = CipherMode.ECB;
string s = cmacKey.Substring(8,8);
byte[] keyTmpArr = Str2byteArr(s);
des.Key = keyTmpArr;
ct = des.CreateDecryptor();
lastBlock = ct.TransformFinalBlock(lastBlock,lastBlock.Length); // THE EXCEPTION
des.Key = Str2byteArr(cmacKey.Substring(0,8));
ct = des.CreateEncryptor();
lastBlock = ct.TransformFinalBlock(lastBlock,lastBlock.Length);
return lastBlock;
}
这些是我调用的函数:
public static byte[] Str2byteArr(string str)
{
byte[] ba = new byte[str.Length];
for (int i = 0; i < str.Length; i++) ba[i] = Convert.ToByte(str[i]);
return ba;
}
public string HexStringToAsciString(string hexString)
{
string ascii = string.Empty;
for (int i = 0; i < hexString.Length; i += 2)
{
String hs = string.Empty;
hs = hexString.Substring(i,2);
uint decval = System.Convert.ToUInt32(hs,16);
char character = System.Convert.ToChar(decval);
ascii += character;
}
return ascii;
}
这是 Python 代码,有帮助吗
def retail_mac(macKey,data,iv='\0'*8):
workDataStr = pad_by_zeroes_to_multiple_of_eight(data)
des = DES.new(str(macKey[0:8]),DES.MODE_CBC,IV = iv)
res = des.encrypt(workDataStr)
lastBlock = res[-8:]
des = DES.new(str(macKey[8:16]),DES.MODE_ECB)
lastBlock = des.decrypt(lastBlock)
des = DES.new(str(macKey[0:8]),DES.MODE_ECB)
return des.encrypt(lastBlock)
def pad_by_zeroes_to_multiple_of_eight(data):
paddingSize = (8 - len(data)) % 8
workData = bytearray(data)
workData.extend('\0'*paddingSize)
workDataStr = str(workData)
return workDataStr
提前致谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。