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太复杂了,不值得这么做