数据加密解密时 出现 “填充无效,无法被移除”错误
当解密数据是报“填充无效,无法被移除”错误 ,加密解密类 如下,求高手解惑!!!
解密 加密
using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using Snail.Common.Extensions;
namespace Snail.Common.Security
{
public class EncryptionService:IEncryptionService
{
public byte[] Decode(byte[] encodedData)
{
using (var symmetricAlgorithm = CreateSymmetricAlgorithm())
{
using (var hashAlgorithm = CreateHashAlgorithm())
{
var iv = new byte[symmetricAlgorithm.BlockSize / 8];
var signature = new byte[hashAlgorithm.HashSize / 8];
var data = new byte[encodedData.Length - iv.Length - signature.Length];
Array.Copy(encodedData, 0, iv, 0, iv.Length);
Array.Copy(encodedData, iv.Length, data, 0, data.Length);
Array.Copy(encodedData, iv.Length + data.Length, signature, 0, signature.Length);
// validate the signature
var mac = hashAlgorithm.ComputeHash(iv.Concat(data).ToArray());
if (!mac.SequenceEqual(signature))
{
// message has been tampered
throw new ArgumentException();
}
symmetricAlgorithm.IV = iv;
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, symmetricAlgorithm.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(data, 0, data.Length);
cs.FlushFinalBlock();//此处报 “填充无效,无法被移除”错误
}
return ms.ToArray();
}
}
}
}
public byte[] Encode(byte[] data)
{
byte[] encryptedData;
byte[] iv;
using (var ms = new MemoryStream())
{
using (var symmetricAlgorithm = CreateSymmetricAlgorithm())
{
// generate a new IV each time the Encode is called
symmetricAlgorithm.GenerateIV();
iv = symmetricAlgorithm.IV;
using (var cs = new CryptoStream(ms, symmetricAlgorithm.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(data, 0, data.Length);
cs.FlushFinalBlock();
}
encryptedData = ms.ToArray();
}
}
byte[] signedData;
// signing IV || encrypted data
using (var hashAlgorithm = CreateHashAlgorithm())
{
signedData = hashAlgorithm.ComputeHash(iv.Concat(encryptedData).ToArray());
}
var test=iv.Concat(encryptedData).Concat(signedData).ToArray();
return test;
}
private SymmetricAlgorithm CreateSymmetricAlgorithm()
{
var algorithm = SymmetricAlgorithm.Create();
return algorithm;
}
private HMAC CreateHashAlgorithm()
{
var algorithm = HMAC.Create();
algorithm.Key = "3c2d1f".ToByteArray();
return algorithm;
}
}
}
//ToByteArray 扩展方法
public static byte[] ToByteArray(this string hex)
{
return Enumerable.Range(0, hex.Length).
Where(x => 0 == x % 2).
Select(x => Convert.ToByte(hex.Substring(x, 2), 16)).
ToArray();
}