我使用此代码对字符串进行加密(基本上,这是Rijndael class on MSDN上给出的示例):
public static String AESEncrypt(String str2Encrypt, Byte[] encryptionKey, Byte[] IV)
{
Byte[] encryptedText;
using (RijndaelManaged rijAlg = new RijndaelManaged())
{
// Use the provided key and IV
rijAlg.Key = encryptionKey;
rijAlg.IV = IV;
// Create a decrytor to perform the stream transform
ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
// Create the streams used for encryption
using (MemoryStream msEncrypt = new MemoryStream())
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
// Write all data to the stream
swEncrypt.Write(str2Encrypt);
}
encryptedText = msEncrypt.ToArray();
}
}
return Encoding.Default.GetString(encryptedText);
}
我使用Encoding.Default
将字节数组转换为字符串,但是我不确定这是一个好的解决方案。我的目标是在文件中存储加密的文本(例如密码...)。我应该继续Encoding.Default
还是使用Encoding.UTF8Encoding
或其他?
如果将文件移到不同的OS上尝试对其进行加密和解密,可能会对存储的值产生负面影响吗?
您应该绝对不使用Encoding将任意二进制数据转换为文本。 Encoding
用于当您拥有真正是编码文本的二进制数据时,不是-]。
相反,使用Convert.ToBase64String
将二进制数据编码为文本,然后使用Convert.ToBase64String
进行解码。
是,Convert.FromBase64String
是您机器的当前ANSI代码页,在多台机器/语言环境之间可能会有所不同。如果数据是文本数据并使其可移植,则需要使用固定的编码格式,例如UTF8。
如果您的目标是将加密的信息存储在文件中,并且您有一个字节数组,则应直接存储它-完全不要将其转换为字符串。
不是在这里100%肯定,但我认为Encoding.Default是指系统默认编码,是的,可以在系统之间更改。
如果在我要使用的地方,我将使用UTF8或其他不会随系统而改变的编码。