解密可序列化结构不能工作
本文关键字:不能 工作 结构 序列化 解密 | 更新日期: 2023-09-27 18:08:03
尝试解密时我的错误是什么?
当调用DecrypToken时显示以下消息:
类型为"System.Runtime.Serialization"的未处理异常。SerializationException'在mscorlib.dll中发生
附加信息:输入流不是有效的二进制格式。
[编辑]
数据现在从十六进制格式转换回数据。
键和IV现在被保存以供重用。
现在得到这个错误:
类型为"System.Runtime.Serialization"的未处理异常。SerializationException'发生在mscorlib.dll
附加信息:在解析完成之前遇到的流结束。
代码:
<>之前使用系统;使用System.Runtime.Serialization;使用System.Runtime.Serialization.Formatters.Binary;使用先;使用System.Security.Cryptography;名称空间DecryptStruct{类项目{静态字节[]theKey = null;static byte[] theIV = null;(序列化)内部结构符号{公共字符串用户;公共字符串主机;公共字符串现在;}静态字符串EncryptToken(字符串用户,字符串主机){Token Token = new Token();令牌。User = User;令牌。now = DateTime.Now.ToString();令牌。Host = Host;//序列化IFormatter form = new BinaryFormatter();MemoryStream ser = new MemoryStream();的形式。(对象序列化(ser)令牌);//设置密码Rijndael alg = Rijndael. create ();alg.GenerateIV ();alg.GenerateKey ();//保存键theKey = alg.Key;=;;;//倒带流爵士。位置= 0;//加密MemoryStream enc = new MemoryStream();CryptoStream cw = new CryptoStream(enc, alg.CreateEncryptor(), CryptoStream mode . write);write (ser.ToArray(), 0, (int)ser.Length);cw.FlushFinalBlock ();c.位置= 0;//倒带byte[] benc = enc.ToArray();string hex = Convert.ToBase64String(benc);cw.Close ();返回十六进制;}解密令牌(字符串十六进制){byte[] benc = Convert.FromBase64String(hex);MemoryStream enc = new MemoryStream(c);//设置密码Rijndael alg = Rijndael. create ();alg。Key = theKey;alg。IV = theIV;CryptoStream cr = new CryptoStream(enc, alg.CreateDecryptor(), CryptoStreamMode.Read);IFormatter form = new BinaryFormatter();MemoryStream ser = new MemoryStream();的形式。Serialize(ser, (object)new Token());byte[] buf = new byte[(int)ser.Length];read (buf, 0, (int)ser.Length);MemoryStream unenc = new MemoryStream(buf);unenc。位置= 0;//反序列化Token tk = (Token)form.Deserialize(unenc);返回tk;}静态void Main(string[] args){string enc = EncryptToken("username", "myhost");Token Token = DecrypToken(enc);}}}用十六进制编码并在这里进行转换:
byte[] benc = enc.ToArray();
string hex = BitConverter.ToString(benc);
cw.Close();
return hex.Replace("-", "");
但你不做相反的!
GenerateIV()
和GenerateKey()
方法分别用一个新的随机IV和密钥初始化算法。您必须使用与加密数据时完全相同的密钥和IV来解密数据,但是在加密时不存储这两个值,而是在解密过程中生成另一个(完全不同的)密钥/IV。
正如另一个答案所表明的那样,您还忘记了在加密时反转使用的文本编码。我建议使用Convert.ToBase64String()
将加密的数据转换为字符串值,Convert.FromBase64String()
在解密时将其转换回字节数组。