[英]Encrypt and Decrypt String in C# .net 3.5
我知道有与此相关的几个问题,但是大多数答案都为.net 4.0及更高版本提供了解决方案。 对于我的用途,我必须以.net 3.5为目标。 我正在寻找简单地加密和解密字符串以存储在文件中的问题,该文本不是敏感的用户/个人信息。
我到目前为止的代码是
public static string EncryptString(this string text)
{
string result = null;
if(!String.IsNullOrEmpty(text))
{
byte [] plaintextBytes = Encoding.Unicode.GetBytes ( text );
SymmetricAlgorithm symmetricAlgorithm = DES.Create ();
symmetricAlgorithm.Key = new byte [8] { 1, 2, 3, 4, 5, 6, 7, 8 };
MemoryStream memoryStream = new MemoryStream ();
CryptoStream cryptoStream = new CryptoStream ( memoryStream, symmetricAlgorithm.CreateEncryptor (), CryptoStreamMode.Write );
cryptoStream.Write ( plaintextBytes, 0, plaintextBytes.Length );
result = Encoding.Unicode.GetString ( memoryStream.ToArray () );
}
return result;
}
和
public static string DecryptString(this string text)
{
string result = null;
if ( !String.IsNullOrEmpty ( text ) )
{
byte [] encryptedBytes = Encoding.Unicode.GetBytes ( text );
SymmetricAlgorithm symmetricAlgorithm = DES.Create ();
symmetricAlgorithm.Key = new byte [8] { 1, 2, 3, 4, 5, 6, 7, 8 };
MemoryStream memoryStream = new MemoryStream ( encryptedBytes );
CryptoStream cryptoStream = new CryptoStream ( memoryStream, symmetricAlgorithm.CreateDecryptor (), CryptoStreamMode.Read );
byte [] decryptedBytes = new byte [encryptedBytes.Length];
cryptoStream.Read ( decryptedBytes, 0, decryptedBytes.Length );
result = Encoding.Unicode.GetString ( decryptedBytes );
}
return result;
}
加密有效,但是尝试解密时会收到以下错误消息:
CryptographicException: Bad PKCS7 padding. Invalid length 0.
我想出的答案需要对我的代码进行全面检查,但是可以,并且是:
public static string EncryptString(this string text, string passPhrase)
{
string result = null;
if(!String.IsNullOrEmpty(text))
{
byte [] initVectorBytes = Encoding.UTF8.GetBytes ( m_InitVector );
byte [] plainTextBytes = Encoding.UTF8.GetBytes ( text );
PasswordDeriveBytes password = new PasswordDeriveBytes ( passPhrase, null );
byte [] keyBytes = password.GetBytes ( m_Keysize / 8 );
RijndaelManaged symmetricKey = new RijndaelManaged ();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform encryptor = symmetricKey.CreateEncryptor ( keyBytes, initVectorBytes );
MemoryStream memoryStream = new MemoryStream ();
CryptoStream cryptoStream = new CryptoStream ( memoryStream, encryptor, CryptoStreamMode.Write );
cryptoStream.Write ( plainTextBytes, 0, plainTextBytes.Length );
cryptoStream.FlushFinalBlock ();
byte [] cipherTextBytes = memoryStream.ToArray ();
memoryStream.Close ();
cryptoStream.Close ();
result = Convert.ToBase64String ( cipherTextBytes );
}
return result;
}
和
public static string DecryptString(this string text, string passPhrase)
{
string result = null;
if ( !String.IsNullOrEmpty ( text ) )
{
byte [] initVectorBytes = Encoding.UTF8.GetBytes ( m_InitVector );
byte [] cipherTextBytes = Convert.FromBase64String ( text );
PasswordDeriveBytes password = new PasswordDeriveBytes ( passPhrase, null );
byte [] keyBytes = password.GetBytes ( m_Keysize / 8 );
RijndaelManaged symmetricKey = new RijndaelManaged ();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform decryptor = symmetricKey.CreateDecryptor ( keyBytes, initVectorBytes );
MemoryStream memoryStream = new MemoryStream ( cipherTextBytes );
CryptoStream cryptoStream = new CryptoStream ( memoryStream, decryptor, CryptoStreamMode.Read );
byte [] plainTextBytes = new byte [cipherTextBytes.Length];
int decryptedByteCount = cryptoStream.Read ( plainTextBytes, 0, plainTextBytes.Length );
memoryStream.Close ();
cryptoStream.Close ();
result = Encoding.UTF8.GetString ( plainTextBytes, 0, decryptedByteCount );
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.