介绍

我正在尝试加密和解密文本,有时,尤其是对于较大的文本,在解密的文本中会出现随机字符。我在System.Security.Cryptography命名空间中使用AES加密,此刻我要加密的文本将是URL和一些信息,例如页面标题。我在下面提供了一个示例以及我尝试过的示例。我还编写了两种加密和解密方法,减去输出到“调试窗口”的所有行。使用的Key和IV应该不是问题,因为目前它们是不变的。

我认为对我来说,明智的是指出,它按预期的那样在单独的出现中对18/01/2013;18/01/2013进行加密和解密。

例子

假设我想解密此文本:
Barnabe Googes Information & Homepage | Search and Research on BarnabeGooge.com;18/01/2013;18/01/2013;;http://www.googe.com
默认情况下,它使用UTF-8,并且会加密为:
뤟౏羜ڮ胂淺弊놛荧ꠃ錺槝ヸ蘜ầᄼꕒヘ⍩㗪潺뱂施㒞ꨛ殳硪픴ی뿨춃�燲ᯁﱪ뙊힓琲鯖嶑⨹갂Ѭ쳀鿜�྄䋖⭫ퟂ㪏�荾ꆺשּ붹梾麦膛
并解密回:
Barnabe Googes Information & Homepage | Search and Research on B���Ax2�!��f�M]18/01/20�;18/01[�;>َ�l?����m��*-��+��^A[=�
我尝试过的

  • 我试图更改为其他编码,但是UTF-8似乎对解密文本的影响最小。
  • 更改为不同的填充类型,但是Padding.Zeros似乎是最好的。我也不能使用Padding.None,因为它会抛出NotSupportedException: bad data length
  • Mode更改为CBC(这并不重要)。
  • 刷新/关闭CryptoStream,以便可以刷新最终块或其他内容。
  • 万一问题出在标题上,我就用WebUtility.HtmlDecode()解码了标题,但并没有影响标题。

  • 加密方式

    如您所见,下面的加密使用AES加密。我想指出的是,keyIV是与Encryption和Decryption方法相同的类中的两个全局字符串。我这样做的原因是弄乱了不同的编码和CryptographyServiceProviders,即使偶然的更改起作用了也是如此。请忽略它们,因为它们是恒定的,不会影响最终的加密/解密。
    public static byte[] EncryptStringToBytes(string plainText, Encoding Enc)
    {
    
        if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");
        byte[] encrypted;
        using (AesCryptoServiceProvider tdsAlg = new AesCryptoServiceProvider())
        {
             tdsAlg.Key = (byte[])Enc.GetBytes(key).Take(tdsAlg.Key.Length).ToArray();
             tdsAlg.IV = (byte[])Enc.GetBytes(IV).Take(tdsAlg.IV.Length).ToArray();
             tdsAlg.Padding = PaddingMode.Zeros;
             tdsAlg.Mode = CipherMode.CBC;
             ICryptoTransform encryptor = tdsAlg.CreateEncryptor(tdsAlg.Key, tdsAlg.IV);
    
             using (MemoryStream msEncrypt = new MemoryStream())
             {
                 using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                 {
                     using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                     {
                         swEncrypt.Write(plainText);
                     }
                     encrypted = msEncrypt.ToArray();
                     csEncrypt.Close();
                 }
             }
        }
    
        return encrypted;
    }
    

    解密方式
    public static string DecryptStringFromBytes(byte[] cipherText,Encoding Enc)
    {
        if (cipherText == null || cipherText.Length <= 0)
            throw new ArgumentNullException("cipherText");
    
        string plaintext = null;
    
        using (AesCryptoServiceProvider tdsAlg = new AesCryptoServiceProvider())
        {
            tdsAlg.Key = (byte[])Enc.GetBytes(key).Take(tdsAlg.Key.Length).ToArray();
            tdsAlg.IV = (byte[])Enc.GetBytes(IV).Take(tdsAlg.IV.Length).ToArray() ;
            tdsAlg.Padding = PaddingMode.Zeros;
            tdsAlg.Mode = CipherMode.CBC;
            ICryptoTransform decryptor = tdsAlg.CreateDecryptor();
    
            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt,true))
                    {
                        plaintext = srDecrypt.ReadToEnd().Replace("\0","");
                        csDecrypt.Close();
                        return plaintext.Replace("\0",string.Empty);
                    }
                }
            }
       }
       return plaintext;
    }
    

    开机提示

    以防万一,我正在使用它来获取网页的标题,但是正如我已经提到过的,使用HtmlDecode不会影响它。
    WebClient x = new WebClient();
    string source = x.DownloadString(Url);
    x.Dispose();
    string title= Regex.Match(source, @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value;
    title = title.Replace(";", " ");
    return title;
    

    最佳答案

    感谢Hans Passant,我找到了解决方案。问题是我在加密和解密时本应该使用Encoding.GetString()Encoding.GetBytes()时使用的是Convert.ToBase64String()Convert.FromBase64String()

    10-07 19:49
    查看更多