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

3

以下是我的加密和解密方法。我有两个数据库,并将加密后的密码从一个数据库复制到另一个数据库。这段代码原本是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。我该怎么办?


加密方法可能很有趣。encryptedtext 可能不是有效的 Base64。也许你有 encryptedtext 的示例值。 - Claudio P
你是什么意思?我不明白。 - Joy
异常试图告诉您,参数encryptedtext不是有效的Base64String。您能否提供一个encryptedtext的示例值,以便抛出异常?这意味着如果您的应用程序中有加密方法,则其输出未生成正确的输出(一个Base64String,例如:"YWJjZGVmPT0=")。 - Claudio P
实际上我有两个数据库,密码从一个复制到另一个。现在我正在应用解密方法。我的密码是InvertAdmin。但是从这一行开始就出错了: byte[] encryptedBytes = Convert.FromBase64String(encryptedtext); 加密密码是:dfghfgdfgd667878nnvghv现在我有一个问题,代码是VB的,然后我转换成C#,所以加密不依赖于应用程序,这意味着密码相同但在不同的应用程序中加密文本不同。 - Joy
dfghfgdfgd667878nnvghv 不是有效的Base64字符串。 - Claudio P
显示剩余2条评论
3个回答

9
如果你有以下加密密码:

dfghfgdfgd667878nnvghv

它不能从Base64转换为字节数组,因为它不是一个有效的Base64字符串。一个有效的Base64字符串应该是:

dfghfgdfgd667878nnvghv==


1

0

我曾经遇到过这个问题。结果发现我忘记在数据库中增加两个列的varchar大小。导致值被截断。永远不要排除自己的愚蠢。


这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时收到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - Özgür Güzeldereli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接