【发布时间】:2017-12-11 14:40:07
【问题描述】:
我正在尝试解密一个也是 base64 编码的字符串,但是当我尝试解密该字符串时收到一个。
我收到的错误是:
{System.FormatException:Base-64 字符数组或字符串的长度无效。
在下面的解密函数中的这一行:MemoryStream ms = new MemoryStream(Convert.FromBase64String(inString));
加密/解密函数:
//ENCRYPT
public static bool stringEncrypt(string inString,ref string outstring)
{
try
{
if(String.IsNullOrEmpty(inString)){return false;}
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms,provider.CreateEncryptor(PWbytes,PWbytes),CryptoStreamMode.Write);
StreamWriter sw = new StreamWriter(cs);
sw.Write(inString);
sw.Flush();
cs.FlushFinalBlock();
sw.Flush();
outstring = Convert.ToBase64String(ms.GetBuffer(),0,(int)ms.Length);
return true;
}
catch(Exception ex)
{
clsCommonBase.AppendToExceptionFile("Encrypt : " + ex.Message);
return false;
}
}
//DECRPYT
public static bool stringDecrypt(string inString,ref string outstring)
{
try
{
if(String.IsNullOrEmpty(inString)){return false;};
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream(Convert.FromBase64String(inString));
CryptoStream cs = new CryptoStream(ms, provider.CreateDecryptor(PWbytes,PWbytes),CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs);
outstring = sr.ReadToEnd();
return true;
}
catch(Exception ex)
{
clsCommonBase.AppendToExceptionFile("Decrypt : " + ex.Message);
return false;
}
}
【问题讨论】:
-
你检查过你传入的字符串了吗?大概它不是有效的base64 ...我的猜测是它不是先前调用
passwordEncrypt的结果。 (我强烈建议您重新审视您的异常处理,顺便说一句...这不是 C# 中处理异常的惯用方式。) -
请发布minimal reproducible example 以及您尝试加密/解密的确切字符串。
-
如果您确实需要加密而不是散列使用 AES,则不应将 DESCryptoServiceProvider 用于安全性很重要的任何事情。您还使用相同的值或键和 IV,这会更加破坏它。
-
未来读者警告: DES 不应用于新工作,它不安全且已被 AES 取代,请改用 AES。旧工作应尽快迁移到 AES。
-
使用@VladimirArustamian 的链接解决。将尽可能发布解决方案代码。
标签: c# encryption encoding character-encoding base64