c# - C#中的加密解密解密不起作用
问题描述
我有一个 java 代码,我必须用 C# 对其进行转换,如下所示
加密:
public String encrypt(String value)
{
System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
AesManaged tdes = new AesManaged();
tdes.Key = UTF8.GetBytes(securityKey);
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform crypt = tdes.CreateEncryptor();
byte[] plain = Encoding.UTF8.GetBytes(value);
byte[] cipher = crypt.TransformFinalBlock(plain, 0, plain.Length);
String encryptedText = Convert.ToBase64String(cipher);
return encryptedText;
}
现在我正在尝试编写反转过程
public String decrypt(String value)
{
System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
AesManaged tdes = new AesManaged();
tdes.Key = UTF8.GetBytes(securityKey);
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform crypt = tdes.CreateDecryptor();
byte[] plain = Encoding.UTF8.GetBytes(value);
byte[] cipher = crypt.TransformFinalBlock(plain, 0, plain.Length);
String encryptedText = Convert.ToBase64String(cipher);
return encryptedText;
}
但逆转不起作用。
错误:类型异常
“System.Security.Cryptography.CryptographicException”发生在 mscorlib.dll 中,但未在用户代码中处理
附加信息:填充无效且无法移除。
堆栈跟踪:
System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast) 在 System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) at redis2.Crypto.AESECBPKCS5PaddingEncryptor.decrypt(String value) in e:\TestApplication\Redis\redis2\redis2\Crypto\AESECBPKCS5PaddingEncryptor.cs: 第 53 行在 redis2.WebForm1.Page_Load(Object sender, EventArgs e) 在 e:\TestApplication\Redis\redis2\redis2\WebForm1.aspx.cs:line 14 at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) at System.Web.UI.Control.OnLoad (EventArgs e) 在 System.Web.UI.Control.LoadRecursive() 在 System.Web.UI.Page。ProcessRequestMain(布尔型 includeStagesBeforeAsyncPoint,布尔型 includeStagesAfterAsyncPoint)
更新 1
public String decrypt(String value)
{
System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
AesManaged tdes = new AesManaged();
tdes.Key = UTF8.GetBytes(securityKey);
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform crypt = tdes.CreateDecryptor();
// value = Convert.FromBase64String(value);
byte[] plain = Convert.FromBase64String(value);
byte[] cipher = crypt.TransformFinalBlock(plain, 0, plain.Length);
String encryptedText = Convert.ToBase64String(cipher);
return encryptedText;
}
解决方案
tdes.Key = UTF8.GetBytes(securityKey);
从字符串中获取密钥总是错误的方法。
- 当你有密码时,使用
Rfc2898DeriveBytes
- 当您需要传递随机二进制密钥时,请使用
Convert.FromBase64String()
String encryptedText = Encoding.UTF8.GetString(cipher);
将二进制数据作为文本传输是错误的方式。这甚至不会往返,因为 UTF8 有转义序列来编码非 ASCII 标记。你不能把它们分开。
利用Convert.ToBase64String(byte[])
推荐阅读
- php - IN FLEX SLIDER prevoius 和下一个按钮删除浏览器后退图标单击滑块上一张幻灯片幻灯片
- javascript - 如何在本地运行平均堆栈应用程序时获取包含在 angularjs 控制器中的 json 文件?
- reactjs - Pass props through Route with HOC
- xamarin - Xamarin - 再次询问设备位置
- c++ - 如果派生类还具有基类中不存在的虚函数,则创建的 vptr 数
- c++ - 在文件中找到字符串后替换它旁边的字符
- assembly - “auipc dest, label”(和“la dest,label”)不会产生预期的列表
- gnuplot - 需要带有标签的 gnuplot 框
- image - 使用 React Native 将图像分享到社交媒体
- c - 如何在 TIM_BASE 中为 Keil 的 stm32f746NG_Discovery 配置 TIMER?