解密可序列化结构不能工作

本文关键字:不能 工作 结构 序列化 解密 | 更新日期: 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()在解密时将其转换回字节数组。