Base-64 char数组或字符串的长度无效

时间:2015-02-11 09:34:15

标签: c# wpf

以下是我的加密和解密方法。我有两个数据库,我将加密的密码从一个数据库复制到另一个数据库。代码是在vb中,但我将其转换为C#。

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Security.Cryptography;
 using System.IO;
 namespace AccountSystem.Class{
class ClEncrDecr
{
    private TripleDESCryptoServiceProvider tripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider();

    private byte[] TruncateHash(string key, int length)
    {
        SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
        //Hash the Key
        byte[] keyBytes = System.Text.Encoding.Unicode.GetBytes(key);
        byte[] hash = sha1.ComputeHash(keyBytes);

        // truncate or pad the hash
        Array.Resize(ref hash, length);
        return hash;
    }

    public ClEncrDecr()
    {
        string key = "ABCD";
        tripleDESCryptoServiceProvider.Key = TruncateHash(key, tripleDESCryptoServiceProvider.KeySize / 8 );
        tripleDESCryptoServiceProvider.IV = TruncateHash("", tripleDESCryptoServiceProvider.BlockSize / 8 );
    }

    public string EncryptData(string plainText)
    {
        byte[] plaintextBytes = System.Text.Encoding.Unicode.GetBytes(plainText);
        MemoryStream ms = new MemoryStream();
        CryptoStream encStream = new CryptoStream(ms, tripleDESCryptoServiceProvider.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write);
        encStream.Write(plaintextBytes, 0, plaintextBytes.Length);
        encStream.FlushFinalBlock();
        return Convert.ToBase64String(ms.ToArray());
    }

    public string DecryptData(string encryptedtext)
    {
        byte[] encryptedBytes = Convert.FromBase64String(encryptedtext);
        MemoryStream ms = new MemoryStream();
        CryptoStream decStream = new CryptoStream(ms, tripleDESCryptoServiceProvider.CreateDecryptor(), CryptoStreamMode.Write);
        decStream.Write(encryptedBytes, 0, encryptedBytes.Length);
        decStream.FlushFinalBlock();
        return System.Text.Encoding.Unicode.GetString(ms.ToArray());
    }
}
}

登录代码:

MessageBox.Show(crypto.DecryptData(obj.password))

当我们致电DecryptData(string encryptedtext)时,它会抛出一个说Invalid length for a Base-64 char array or string的异常。我该怎么办?

2 个答案:

答案 0 :(得分:7)

如果您有以下加密密码:

  

dfghfgdfgd667878nnvghv

它不能从Base64转换为字节数组,因为它不是有效的Base64String。有效的Base64String将是:

  

dfghfgdfgd667878nnvghv ==

答案 1 :(得分:0)

正如Claudio在评论中提到的,您的encryptedtext变量不是base64编码的字符串,也许它至少缺少填充字符。

从示例中看不到它是如何创建的,但您可能希望查看此SO问题:How do I encode and decode a base64 string?

关于填充:http://en.wikipedia.org/wiki/Base64#Padding