2013-07-30 161 views
2

即时通讯错误'Base-64字符数组或字符串无效的长度'。在这条线上Base-64字符数组或字符串的无效长度。在C#中的AES#

rm.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(text)).Split(',')[0]); 

下面是代码:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     textBox2.Enabled = false; 
    } 

    private void label2_Click(object sender, EventArgs e) { } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     String s = generateKey(256); 
     textBox2.Text = s; 
    } 

    private String generateKey(int keySize) 
    { 
     RijndaelManaged rm = new RijndaelManaged(); 
     rm.KeySize = keySize; 
     rm.BlockSize = 128; 
     rm.Mode = CipherMode.CBC; 
     rm.Padding = PaddingMode.PKCS7; 
     rm.GenerateIV(); 
     String iv = Convert.ToBase64String(rm.IV); 
     rm.GenerateKey(); 
     String key = Convert.ToBase64String(rm.Key); 
     string completeKey = iv + "," + key; 

     return Convert.ToBase64String(ASCIIEncoding.UTF8.GetBytes(completeKey)); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     if (textBox2.Text == "" || textBox2.Text == null) 
     { 
      MessageBox.Show("Please generate a key!"); 
     } 
     else 
     { 
      String key = textBox2.Text; 
      String strToBeEncoded = textBox1.Text; 
      String s = encryptAES(strToBeEncoded, key, 256); 
      outputBox.Text = s; 
     } 
    } 

    private String encryptAES(String text, String key, int keySize) 
    { 
     RijndaelManaged rm = new RijndaelManaged(); 
     rm.KeySize = keySize; 
     rm.BlockSize = 128; 
     rm.Mode = CipherMode.CBC; 
     rm.Padding = PaddingMode.PKCS7; 
     rm.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(text)).Split(',')[0]); 
     rm.Key = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(key)).Split(',')[1]); 
     byte[] plainText = ASCIIEncoding.UTF8.GetBytes(text); 
     ICryptoTransform crypto = rm.CreateEncryptor(); 
     byte[] cipherText = crypto.TransformFinalBlock(plainText, 0, plainText.Length); 
     return Convert.ToBase64String(cipherText); 
    } 
} 
+0

你可能想看看这个,我觉得这是一种欺骗:http://stackoverflow.com/questions/15419542/base64 -invalid-string-error – Bit

+3

也许你应该把这个表达式分成多行,并确定问题的确切位置。哪一个调用'Convert.FromBase64String'失败? –

+0

现在,我已经有了新的孩子在我头上的块。你的错。 –

回答

2

您试图拉出来IV你将被加密的字符串。

尝试改变:

rm.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(text)).Split(',')[0]); 

到:

rm.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(key)).Split(',')[0]); 
+1

此外,不要忘记妥善处理'RijndaelManaged'和'ICryptoTransform'对象。更好的是,如果它们被包含在一些'Using'语句中。 –

相关问题