вступление
Я пытаюсь шифровать и расшифровывать тексты, и иногда, особенно для больших текстов, в расшифрованном тексте появляются случайные символы. Я использую криптографию AES в пространстве имен System.Security.Cryptography
, и текст, который я пытаюсь зашифровать в данный момент, будет URL-адресом и некоторой информацией, такой как заголовок страницы. Я привел пример ниже и то, что я пытался. Я также написал два метода шифрования и дешифрования, за исключением строк, выводящихся в окно отладки. Используемые ключ и 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. Я хочу отметить, что key
и IV
— это две глобальные строки в том же классе, что и методы шифрования и дешифрования. Причина, по которой я сделал это, состоит в том, чтобы возиться с разными кодировками и 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;
Encoding.Utf8.GetString()
илиGetBytes()
, я никогда не знал о base64. - person Brownish Monster   schedule 18.01.2013