读书人

数据加密解密时 出现 “填充无效无法

发布时间: 2013-04-07 12:50:11 作者: rapoo

数据加密解密时 出现 “填充无效,无法被移除”错误
当解密数据是报“填充无效,无法被移除”错误 ,加密解密类 如下,求高手解惑!!!


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();
}

解密 加密
[解决办法]
恭喜恭喜,接分接分。

读书人网 >C#

热点推荐