AES encryption and decryption
我不太确定如何解释这个问题,所以我要添加我的代码,并尝试从那里完成它。正如您所看到的,这几乎不符合常见的编程标准。我正在尝试从密钥和IV代中删除所有"随机性",因此我提供了自己的字符串并将其适当地添加到AES值中。
一旦我对该值进行了加密,我就将其转换为字符串,并将其作为密码参数存储在数据库中。我的问题是能够将它解密回原始密码值,这在以后的某些Web请求中是需要的。我尝试将字符串值转换回字节数组,但得到一个"块大小无效"错误,后跟"pkcs7填充错误"。长度250"无效。不知道这意味着什么。
有什么想法吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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); } } |
问题是您使用的编码。它假设字节数组是一个utf8字符串,我不确定它是否是。使用这个问题的jon-skeet答案,我将使用以下方法将字节数组转换为字符串并返回:
1 2 3 | string result = Convert.ToBase64String(encrypted); ... byte[] decrypted = Convert.FromBase64String(result); |
您将获取二进制、非文本数据并将其转换为字符串,然后尝试将其转换回二进制数据。如果要存储加密数据的字符串表示形式,我建议使用二进制到文本编码算法,如base64编码(请参阅base64编码字节数组的有效方法?).
如果可以将其存储为二进制(例如,在SQL Server varbinary列中),则可以完全跳过字符串编码。
1 2 3 4 5 | 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); |