C# 在.NET中使用AES-256 CBC解密文件时出现问题

C# 在.NET中使用AES-256 CBC解密文件时出现问题,c#,.net,encryption,aes,C#,.net,Encryption,Aes,我试图解密一个用Java程序加密的文件,据称使用了默认IV的AES-256 CBC 如果我使用通用解密方法(DecryptAesCbc),那么只有第一个块被成功解密 如果我使用Java开发人员推荐的解密方法(Decrypt),那么所有文本都将成功解密,并在结尾添加一些附加字符(可能是填充?) 如果我理解正确的话,CBC密码模式没有正确使用(),因为每个块都与IV进行异或运算,而不是与之前的密文块进行异或运算 如果我使用Decrypt方法,那么从最后一个块中删除(并检测)可能的垃圾字节(垃圾字节值

我试图解密一个用Java程序加密的文件,据称使用了默认IV的AES-256 CBC

如果我使用通用解密方法(DecryptAesCbc),那么只有第一个块被成功解密

如果我使用Java开发人员推荐的解密方法(Decrypt),那么所有文本都将成功解密,并在结尾添加一些附加字符(可能是填充?)

  • 如果我理解正确的话,CBC密码模式没有正确使用(),因为每个块都与IV进行异或运算,而不是与之前的密文块进行异或运算
  • 如果我使用Decrypt方法,那么从最后一个块中删除(并检测)可能的垃圾字节(垃圾字节值在文件之间发生变化)的最佳方法是什么?我是否应该尝试从最后一个块的末尾删除任何重复的字节
  • 工作示例:

    使用系统;
    使用System.IO;
    Net系统;
    使用System.Security.Cryptography;
    使用系统文本;
    /* 
    原文:
    读者在查看页面布局时会被页面的可读内容分散注意力,这是一个早已确定的事实。使用Lorem Ipsum的意义在于,它的字母分布或多或少是正态的,而不是使用“此处内容,此处内容”,使其看起来像可读的英语。许多桌面发布软件包和网页编辑器现在使用Lorem Ipsum作为默认模型文本,搜索“Lorem Ipsum”将发现许多尚处于起步阶段的网站。多年来,各种版本不断演变,有时出于偶然,有时出于故意(注入幽默等)。
    所谓的加密算法:AES CBC 256bit密钥(默认IV)-文件在Java程序中加密。
    */
    公共课程
    {
    //BASE64编码的密码文本
    公共静态字符串encryptedFileBase64="2.答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案答案是:1。答案答案答案1。答案1。答案1。答案1。答案1。答案是:答案1。答案2。答案1。答案2。答案答案1。答案2。答案2。答案是:答案6。答案6。答案6。答案6。答案6。答案6。答案6。答案6。答案6。答案6。答案6。答案6。答案6。答案6。答案是X099XEMPJT9ZNELE/W1ECAYC881IEOVSB12)一个单词(BXXXGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG8ISOGXFBGP/NxDcBrQV0HyTkN7AchNdVj7b5LRDwBOKag4jGwb87pyFdCjtAEd4XdS7asvMOoEBQNSL/B0NXFQWB5SYFHHZYK7EWT9P38ZSB8ZHXYDCFASUJWMAS5YOVW8/LTO3QFY02ZY/3K+”;
    //BASE64编码AES密钥
    公共静态字符串aesKeyBase64=“lAw0kowr1i//T6Bci78bRX/lIRIwwKeGUz4pHDz0jjo=”;
    公共静态字符串encryptedFileBase64_2=”2)2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0/CNP3ASQL/l2LmfiS396JbHw6NYn7GC+2eGiMbXeQs0Wo7b17hkQeSLtsB8U+Wdx”;
    公共静态字符串aesKeyBase64_2=“tl9wapacwj53zdbavddrdrtpautlkxdtysi4qtkq5ksta=”;
    公共静态void Main()
    {
    byte[]key=Convert.FromBase64String(aesKeyBase64);
    //四,
    字节[]iv=新字节[16]{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
    Console.WriteLine(“--------------第一个文件----------\n\n”);
    string decrypted=AesUtils.Decrypt(Convert.FromBase64String(encryptedFileBase64),密钥,iv);
    Console.WriteLine(“-----------------建议的解密过程----------------”);
    Console.WriteLine(已解密);
    Console.WriteLine(“\n------------------AES CBC解密过程-----------------”;
    string decrypted2=AesUtils.DecryptAesCbc(Convert.FromBase64String(encryptedFileBase64),密钥,iv);
    控制台写入线(解密2);
    Console.WriteLine(“\n\n-----------------第二个文件-----------------\n\n”);
    key=Convert.FromBase64String(aesKeyBase64_2);
    decrypted=AesUtils.Decrypt(转换.FromBase64String(encryptedFileBase64_2),密钥,iv);
    Console.WriteLine(“-----------------建议的解密过程----------------”);
    Console.WriteLine(已解密);
    Console.WriteLine(“\n------------------AES CBC解密过程-----------------”;
    decrypted2=AesUtils.DecryptAesCbc(Convert.FromBase64String(encryptedFileBase64_2),密钥,iv);
    控制台写入线(解密2);
    }
    }
    公共静态类AesUtils
    {
    公共静态字符串解密(字节[]密码字节,字节[]密钥,字节[]iv)
    {
    使用(Aes encryptor=GetCryptoAlgorithm())
    {
    加密机。密钥=密钥;
    加密机IV=IV;
    使用(MemoryStream MemoryStream=新的MemoryStream(cipherBytes.Length))
    {
    string纯文本=string.Empty;
    对于(int i=0;iprivate static Aes GetCryptoAlgorithm()
    {
        Aes algorithm = Aes.Create();
        algorithm.Padding = PaddingMode.PKCS7;
        algorithm.Mode = CipherMode.ECB;
        algorithm.KeySize = 256;
        algorithm.BlockSize = 128;
    
        return algorithm;
    }