【问题标题】:c# base64 encoding. Invalid length error on decrpytionc# base64 编码。解密时出现无效长度错误
【发布时间】: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


【解决方案1】:

使用以下链接中的简单解决方案解决 How do I encode and decode a base64 string?

还在编码函数中添加了一些代码,以确保将纯文本字符串转换为有效长度的base64字符串。

代码:

public static string Base64Encode(string plainText)
{

            //check plain text string and pad if needed
            int mod4 = plainText.Length % 4;
            if (mod4 > 0)
            {
                plainText += new string('=', 4 - mod4);
            }

            //convert to base64 and return
            var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
            return System.Convert.ToBase64String(plainTextBytes);
        }

        public static string Base64Decode(string base64EncodedData)
        {         
            //decode base64 and return as string
            var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
            return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多