C# 如何捕捉解码问题。System.FormatException:“Base-64字符数组或字符串的长度无效。”

C# 如何捕捉解码问题。System.FormatException:“Base-64字符数组或字符串的长度无效。”,c#,C#,这是一个具有关键功能的哈希编码器/解码器。如果我有错误的密钥或部分散列消息,在尝试解码时,我会得到错误的数据错误。我怎样才能在它破裂之前抓住它 public partial class Form1 : Form { public Form1() { InitializeComponent(); } string hash = ""; public string Hash { get

这是一个具有关键功能的哈希编码器/解码器。如果我有错误的密钥或部分散列消息,在尝试解码时,我会得到错误的数据错误。我怎样才能在它破裂之前抓住它

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string hash = "";
        public string Hash { get => hash; set => hash = value; }

        private void btnEncrypt_Click(object sender, EventArgs e)
        {
            hash = txtKey.Text;
            byte[] data = UTF8Encoding.UTF8.GetBytes(txtValue1.Text);
            using (MD5CryptoServiceProvider mDS = new MD5CryptoServiceProvider())
            {
                byte[] keys = mDS.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
                using(TripleDESCryptoServiceProvider tripDes = new TripleDESCryptoServiceProvider() { Key = keys, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 })
                {
                    ICryptoTransform transform = tripDes.CreateEncryptor();
                    byte[] results = transform.TransformFinalBlock(data, 0, data.Length);
                    txtValue1.Text = Convert.ToBase64String(results, 0, results.Length);
                }
            }
        }

        private void btnDecrypt_Click(object sender, EventArgs e)
        {
            hash = txtKey.Text;
            byte[] data = Convert.FromBase64String(txtValue1.Text);
            using (MD5CryptoServiceProvider mDS = new MD5CryptoServiceProvider())
            {
                byte[] keys = mDS.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
                using (TripleDESCryptoServiceProvider tripDes = new TripleDESCryptoServiceProvider() { Key = keys, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 })
                {
                    ICryptoTransform transform = tripDes.CreateDecryptor();
                    byte[] results = transform.TransformFinalBlock(data, 0, data.Length);
                    txtValue1.Text = UTF8Encoding.UTF8.GetString(results);
                }
            }
        }
    }

Base64字符串的长度始终是4的倍数。如果txtValue1.text中的文本不是4的倍数,则iftxtValue1.text.Length%4!=0,则无法对其进行解码

那个文本框里真的是base64吗?如果是这样,您是否尝试将=chars追加为4的倍数?txtValue.Text+新字符串“=”,4-txtValue.Text.Length%4

检测TransformFinalBlock是否会引发错误的数据异常需要大量代码,不值得这么做。试着抓住它:

try{ 
  byte[] results = transform.TransformFinalBlock(data, 0, data.Length);
  txtValue1.Text = Convert.ToBase64String(results, 0, results.Length);
} catch
{
  MessageBox.Show("Key or data is incorrect");
}
如果您想捕获所有异常。如果要捕获特定异常,则catch采用以下类型:

catch(FormatException)
  ...
在一个层次结构中,可以在同一级别或父级别上有多个类型处理程序;以最深或对等子级到最浅子级的顺序指定它们

如果要使用异常的属性,请在类型后使用变量名,以便块可以访问异常的属性

try
  ...
catch(FormatException ex)
  MessageBox "format of ..." + ex.Message
catch(SomeOtherSpecificException ex)
  ...
catch(Exception ex)
  MessageBox "general error of ..." + ex.Message

试着/抓住?但是,为了回答你的问题,我怎样才能在它破裂之前抓住它?。答案就在你的问题里。使用try/catch try{/*您的代码*/}catch FormatException ex{/*代码来解决问题*/}只是给您一个提示根据NIST于2018年7月19日发布的指导草案,三重数据加密算法TDEA或3DES正式退役。该指导方针建议,经过一段时间的公众咨询后,所有新应用都不推荐使用3DES,2023年后不允许使用3DES来源:@Barns谢谢。这是一个与我的孩子们玩的类似逃生室游戏的个人项目。我不打算在商业上使用这个lol…但是,为了回答你的问题,我怎么能在它破裂之前抓住它呢?。答案就在你的问题里。使用try/catch try{/*您的代码*/}catch FormatException ex{/*代码来清除问题*/}@flydoger。。好吧,对我来说,这是在它断开后才接住它。在异常发生之前捕获它就是检测可能引发异常的情况并避免它,因为异常在计算上非常昂贵。我并没有把catch这个词作为try/catch的意思,因为它越是被检测到sense@CaiusJard所以iftxtValue1.Text.Length%4=如果哈希值发生更改,0会有所帮助,但是如果密钥错误,您知道如何防止中断吗?我的目标是,如果用户没有正确的散列消息和正确的散列密钥,那么他们将收到错误的消息。哦,我明白了。。还有更多关于flydog57的意思,当他说他在回答我的问题时,我没有问任何问题-你,Noel,在你的SO问题的标题中问了一个与你在身体中问的不同的问题。我建议不要这样做;将问题标题设置为问题主体的TLDR。还有一个阅读-我认为对于坏数据异常,你真的必须尝试解密,如果失败,根据flydog的评论捕获它。避免使用try/catch太复杂了,不值得这么做