AES解密失败,“Invalidpadding,cannotremoved”使用C#forWindows。总算把两种语言BigIntegers不同字节的关卡都攻克了一遍(Java:bigendian,C#:little),所以密钥交换也成功了。现在问题来了,在Java中我使用AES/CBC/PKCS5Padding进行加密,但在C#中没有可用的PKCS5,但是正如我在关于这个主题的其他帖子中读到的那样,PKCS7被告知可以与PKCS5一起使用相同或Java确实使用PKCS7而不是PKCS5。我不知道什么是正确的。所以这里是代码:对于(inti=0;i<16;i++)iv[i]=0;rijndael.Padding=PaddingMode.PKCS7;rijndael.Mode=CipherMode.CBC;rijndael.Key=Sys.PrivateKey;rijndael.KeySize=128;rijndael.BlockSize=128;;Sys.LogWrite("解密输入字节长度:"+buff.Length+",keyLength:"+Sys.PrivateKey.Length);Sys.LogWriteBuffer("输入字节",buff);Sys.LogWriteBuffer("输入密钥",Sys.PrivateKey);ICryptoTransform解密器=rijndael.CreateDecryptor(rijndael.Key,rijndael.IV);buff=rijndael.CreateDecryptor().TransformFinalBlock(buff,0,buff.Length);Sys.LogWriteBuffer("缓冲区:",buff);请忽略IV始终为00000000,这仅用于测试目的。数据总是来自服务器,密钥在密钥交换中生成:解密输入字节长度:32,keyLength:16输入字节:7C253F499ED55167E286F9862EC18F2270516574FC392C52A68336B59AC727B9输入密钥:1C13C233505700DBFD60E21C272AA500如果我将它放入任何在线AES解密器中,例如http://aes.online-domain-tools.com/…我总是得到正确的结果:[[27,{"Established":true}]]但在C#中我只得到这个:System.Security.Cryptography.CryptographicException:Paddingisinvalidandcannotberemoved。在System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[]inputBuffer,Int32inputOffset,Int32inputCount,Byte[]&outputBuffer,Int32outputOffset,PaddingModepaddingMode,BooleanfLast)在System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[]inputBuffer,Int32inputOffset,Int32inputCount)我什至尝试了PaddingMode.None,它没有抛出任何异常,但输出只是随机字节。即使在线解密器可以正确解析它,我做错了什么?其他示例输入数据应产生相同的结果[[27,{"Established":true}]]:解密输入字节长度:32,密钥长度:16输入字节:855C552444B877A5EFCEE7A145ECF3842F8B741FABD9BED08264BC0DB0507363输入密钥:B221FA1763E64C25480384648B700500解密输入字节长度:32,密钥长度:16输入8BFC47B49105B7E16C0E6178D2516B77EF8030493705DA794752D124B9DEA7F3输入键:E7BFE0AAACF1264206D65944F934763注IV总是16个空字节。我终于发现了这个问题,难以置信!而不是像这样创建解密器:ICryptoTransformdecryptor=rijndael.CreateDecryptor(rijndael.Key,rijndael.IV);我应该这样创建它:ICryptoTransformdecryptor=rijndael.CreateDecryptor(Sys.PrivateKey,iv);因此,如果将来有人有类似的问题,这里是通用函数:.Security.Cryptography.RijndaelManaged()){rijndael.Padding=PaddingMode.PKCS7;rijndael.Mode=CipherMode.CBC;rijndael.KeySize=128;rijndael.BlockSize=128;ICryptoTransform解密器=rijndael.CreateDecryptor(key,System.iv);.MemoryStreammemoryStream=newSystem.IO.MemoryStream(buff);CryptoStreamcryptoStream=newCryptoStream(memoryStream,decryptor,CryptoStreamMode.Read);byte[]output=newbyte[buff.Length];intreadBytes=cryptoStream.Read(,0,output.Length);返回System.Text.Encoding.UTF8.GetString(输出,0,readBytes);希望有帮助以上就是C#学习教程:AES解密失败,“Paddingisinvalidandcannotbedelete”。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
