C# AES加密和解密
我真的不知道如何解释这一点,所以我将添加我的代码,并尝试从那里解决它。正如您所见,这很难遵循通用编程标准。我试图从密钥和iv生成中删除所有“随机性”,因此我提供了自己的字符串,并将其适当地添加到AES值中 一旦我对该值进行了加密,我就将其转换为字符串,并将其作为密码参数存储在数据库中。我的问题是无法将其解密回原始密码值,这在以后的某些web请求中是需要的。我尝试将字符串值转换回字节数组,但出现“无效块大小”错误,后跟“错误的PKCS7填充。无效长度250”。不知道这是什么意思 有什么想法吗C# AES加密和解密,c#,.net,encryption,aes,C#,.net,Encryption,Aes,我真的不知道如何解释这一点,所以我将添加我的代码,并尝试从那里解决它。正如您所见,这很难遵循通用编程标准。我试图从密钥和iv生成中删除所有“随机性”,因此我提供了自己的字符串,并将其适当地添加到AES值中 一旦我对该值进行了加密,我就将其转换为字符串,并将其作为密码参数存储在数据库中。我的问题是无法将其解密回原始密码值,这在以后的某些web请求中是需要的。我尝试将字符串值转换回字节数组,但出现“无效块大小”错误,后跟“错误的PKCS7填充。无效长度250”。不知道这是什么意思 有什么想法吗
static public void Main()
{
string original ="{password for testing purposes}";
string originalkey = "{128 key}";
string originaliv = "{16 iv}";
byte[] enckey = Encoding.UTF8.GetBytes(originalkey);
byte[] enciv = Encoding.UTF8.GetBytes(originaliv);
using (AesManaged myAes = new AesManaged())
{
myAes.Key = enckey;
myAes.IV = enciv;
byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);
string result = Encoding.UTF8.GetString(encrypted);
string roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);
Console.WriteLine("Encrypted: {0}", result);
Console.WriteLine("Round Trip: {0}", roundtrip);
byte[] decrypted = Encoding.UTF8.GetBytes(result);
roundtrip = DecryptStringFromBytes_Aes(decrypted, myAes.Key, myAes.IV);
Console.WriteLine("Encrypted: {0}", roundtrip);
Console.WriteLine("Round Trip: {0}", result);
}
}
您将获取二进制、非文本数据并将其转换为字符串,然后尝试将其转换回二进制数据。若您想要存储加密数据的字符串表示,我建议使用二进制到文本编码算法,如Base64编码(请参阅) 如果可以将其存储为二进制(例如,在SQL Server varbinary列中),则可以完全跳过字符串编码
byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);
roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);
Console.WriteLine("Original: {0}", original);
Console.WriteLine("Decrypted: {0}", roundtrip);
您将获取二进制、非文本数据并将其转换为字符串,然后尝试将其转换回二进制数据。若您想要存储加密数据的字符串表示,我建议使用二进制到文本编码算法,如Base64编码(请参阅) 如果可以将其存储为二进制(例如,在SQL Server varbinary列中),则可以完全跳过字符串编码
byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);
roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);
Console.WriteLine("Original: {0}", original);
Console.WriteLine("Decrypted: {0}", roundtrip);
问题是您正在使用的编码。它假设字节数组是UTF8字符串,我不确定它是UTF8字符串。使用来自的Jon Skeet答案,我将使用以下方法将字节数组转换为字符串并返回:
string result = Convert.ToBase64String(encrypted);
...
byte[] decrypted = Convert.FromBase64String(result);
问题是您正在使用的编码。它假设字节数组是UTF8字符串,我不确定它是UTF8字符串。使用来自的Jon Skeet答案,我将使用以下方法将字节数组转换为字符串并返回:
string result = Convert.ToBase64String(encrypted);
...
byte[] decrypted = Convert.FromBase64String(result);
简单地将byte[]数组blob编码为字符串可能会给您带来一些问题——它可能包含零字节,这可能导致数据库无法正确处理字符(取决于数据库配置)。尝试使用文本编码不会干扰字符串的编码(例如具有字节的十六进制值的字符串,或Base64编码)简单地将byte[]数组blob编码为字符串可能会给您带来一些问题—它可能包含零字节,这可能会导致数据库无法正确处理字符(取决于数据库配置)。请尝试使用文本编码不会干扰字符串的编码(例如具有字节的十六进制值的字符串,或Base64编码)