程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了System.Security.Cryptography.CryptographicException: '错误数据。 ' - DES 加密大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决System.Security.Cryptography.CryptographicException: '错误数据。 ' - DES 加密?

开发过程中遇到System.Security.Cryptography.CryptographicException: '错误数据。 ' - DES 加密的问题如何解决?下面主要结合日常开发的经验,给出你关于System.Security.Cryptography.CryptographicException: '错误数据。 ' - DES 加密的解决方法建议,希望对你解决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 (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的System.Security.Cryptography.CryptographicException: '错误数据。 ' - DES 加密全部内容,希望文章能够帮你解决System.Security.Cryptography.CryptographicException: '错误数据。 ' - DES 加密所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。