使用AesCryptoServiceProvider获取不正确的解密值我有以下代码使用AesCryptoServiceProvider进行加密和解密。加密和解密使用的iv和key是一样的。解密后的值仍然与源字符串不同。解密后需要修正得到原值?此代码在inputValue=valid128BitString时有效。但是当inputString="Test"出现以下异常时,Padding无效且无法删除。.我们如何纠正它?更新问题以下将根据@jbtule答案进行。encyptedValue.IV=result.IV;加密结果的IV值发生变化。假设加密是在一个单独的进程中完成的,我们如何知道IV用于解密?有没有办法让它保持不变或已知?答:您的另一个选择是将IV传递到加密中并在开始加密转换之前分配它,而不是让aesProvider为您生成随机的。–@ScottChamberlainaesProvider.IV=Convert.FromBase64String("4uy34C9sqOC9rbV4GD8jrA==");更新:请参阅如何为Base64应用填充。我们可以使用UTF8对源输入和结果输出进行编码。Key和IV可以保存在Base64中。将Base64用于源输入会导致某些值出现问题,例如“MyTest”,其中字符串的长度不是4的倍数相关要点:要解密使用SymmetricAlgorithm类之一加密的数据,Key属性和IV属性必须设置为用于加密的相同值。SymmetricAlgorithm.IV属性:来自前一个块的信息混合到加密下一个块的过程中。因此,两个相同的纯文本块的输出是不同的。因为该技术使用前一个块来加密下一个块,所以需要一个初始化向量来加密第一个数据块。(根据SymmetricAlgorithm.IV属性MSDN文章)有效密钥大小为:128,192,256位(根据我的AES方法为字节数组创建了多少个字符?)MainprogramclassProgram{staticvoidMain(string[]args){stringvalid128BitString="AAECAwQFBgcICQoLDA0ODw==";字符串输入值=valid128BitString;字符串键值=valid128BitString;字符串iv=valid128BitString;byte[]byteValForString=Convert.FromBase64String(inputValue);EncryptResult结果=Aes128Utility.EncryptData(byteValForString,keyValue);EncryptResultencyptedValue=newEncryptResult();encyptedValue.IV=iv;encyptedValue.EncryptedMsg=result.EncryptedMsg;字符串finalResult=Convert.ToBase64String(Aes128Utility.DecryptData(encyptedValue,keyValue));控制台.WriteLine(finalResult);如果(String.Equals(finalResult)){Console.WriteLine("Match");}else{Console.WriteLine("不同");}控制台.ReadLine();}}AES实用程序publicstaticclassAes128Utility{privatestaticbyte[]key;公共静态EncryptResultEncryptData(byte[]rawData,stringstrKey){EncryptResult结果=null;if(key==null){if(!String.IsNullOrEmpty(strKey)){key=Convert.FromBase64String((strKey));结果=加密(原始数据);}}else{结果=加密(原始数据);}返回结果;}publicstaticbyte[]DecryptData(EncryptResultencryptResult,stringstrKey){byte[]origData=null;if(key==null){if(!String.IsNullOrEmpty(strKey)){key=Convert.FromBase64String(strKey);origData=Decrypt(Convert.FromBase64String(encryptResult.EncryptedMsg),Convert.FromBase64String(encryptResult.IV));}}else{origData=Decrypt(Convert.FromBase64String(encryptResult.EncryptedMsg),Convert.FromBase64String(encryptResult.IV));}返回原数据;}privatestaticEncryptResultEncrypt(byte[]rawData){使用(AesCryptoServiceProvideraesProvider=newAesCryptoServiceProvider()){aesProvider.Key=key;aesProvider.Mode=CipherMode.CBC;aesProvider.Padding=PaddingMode.PKCS7;使用(MemoryStreammemStream=newMemoryStream()){CryptoStreamencStream=newCryptoStream(memStream,aesProvider.CreateEncryptor(),CryptoStreamMode.Write);encStream.Write(rawData,0,rawData.Length);encStream.FlushFinalBlock();EncryptResultencResult=newEncryptResult();encResult.EncryptedMsg=Convert.ToBase64String(memStream.ToArray());encResult.IV=Convert.ToBase64String(aesProvider.IV);返回编码结果;}}}privatestaticbyte[]Decrypt(byte[]encryptedMsg,byte[]iv){使用(AesCryptoServiceProvideraesProvider=newAesCryptoServiceProvider()){aesProvider.Key=key;aesProvider.IV=iv;aesProvider.Mode=CipherMode.CBC;aesProvider.Padding=PaddingMode.PKCS7;使用(MemoryStreammemStream=newMemoryStream()){CryptoStreamdecStream=newCryptoStream(memStream,aesProvider.CreateDecryptor(),CryptoStreamMode.Write);decStream.Write(encryptedMsg,0,encryptedMsg.Length);decStream.FlushFinalBlock();返回memStream.ToArray();}}}}数字当然publicclassEncryptedResult{publicstringEncryptedMsg{get;放;}公共字符串IV{得到;放;}}参考为我的AES方法创建字节数组的字符数是多少?Thespecifiedkeyisnotavalidsizeforthisalgorithm使用AES-256和初始化向量加密Base-64字符数组的长度无效在编码方面,UTF8/UTF16和Base64之间有什么区别使用加密原语很容易导致实现errors,人们总是这样做,如果可以的话,最好使用高级库我有一个片段,我会尝试不断审查和更新它,它非常接近你正在做的事情。它还对密文进行身份验证,如果攻击者无论如何都可以将选择的密文发送到您的解密实现,我建议这样做,并且有很多侧信道攻击与修改密文有关。但是,你遇到的问题与填充没有任何关系,如果你的密文与你的密钥和iv不匹配,并且你没有验证你的iv和密文,你通常会得到填充错误(如果这是模拟客户端,它被称为填充oracle)。您需要将主要声明更改为:stringvalid128BitString="AAECAwQFBgcICQoLDA0ODw=";stringinputValue="测试";字符串键值=valid128BitString;byte[]byteValForString=Encoding.UTF8.GetBytes(inputValue);EncryptResult结果=Aes128Utility.EncryDatabyteValForString,keyValue);EncryptResultencyptedValue=newEncryptResult();encyptedValue.IV=result.IV;//因此,您使用与加密相同的IV进行解密。以上为C#学习教程:使用AesCryptoServiceProvider获取解密值不正确。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处:
