C#加密/解密

时间:2018-02-13 12:21:50

标签: c# encryption

我正在尝试创建一个简单的系统来加密字符串,将加密的字节数组转换为字符串并将其存储在数据库中。稍后,可以从数据库中检索值(作为字符串),转换为字节数组,解密,然后再次转换为字符串。我也使用256位密钥。但是,我似乎做错了什么,我对这个概念不够熟悉,无法提出修复。

加密代码:

private static string EncryptString(SymmetricAlgorithm symAlg, string inString)
{
    byte[] inBlock = Encoding.Unicode.GetBytes(inString);
    ICryptoTransform xfrm = symAlg.CreateEncryptor();
    return Convert.ToBase64String(xfrm.TransformFinalBlock(inBlock, 0, inBlock.Length));
}

解密代码:

private static byte[] DecryptString(SymmetricAlgorithm symAlg, string inBytes)
{
    ICryptoTransform xfrm = symAlg.CreateDecryptor();
    return xfrm.TransformFinalBlock(Convert.FromBase64String(inBytes), 0, inBytes.Length);
}

我在解密时遇到的错误:

  

System.ArgumentOutOfRangeException:尝试转换超出缓冲区的结尾。
  参数名称:inputCount
  在
  System.Security.Cryptography.CapiSymmetricAlgorithm.TransformFinalBlock(Byte [] inputBuffer,Int32 inputOffset,Int32 inputCount)
  在
  CDMEncryptionLibrary.SyncEncryption.SecureCDM.DecryptString(SymmetricAlgorithm symAlg,String inBytes)

据我所知,问题是从字节到字节的转换,但我该如何解决呢?

- 编辑

解密代码现在是:

    private static string DecryptString(SymmetricAlgorithm symAlg, string inBytesString)
    {

        var inBytes = Convert.FromBase64String(inBytesString);
        ICryptoTransform xfrm = symAlg.CreateDecryptor();
        byte[] outBlock= xfrm.TransformFinalBlock(inBytes, 0, inBytes.Length);
        return Encoding.Unicode.GetString(outBlock);
    }

有错误输入数据不是一个完整的块。

1 个答案:

答案 0 :(得分:3)

您传递字符串的长度,而不是您将字符串转换为字节数组的长度。

即。您将Convert.FromBase64String(inBytes)作为第一个参数传递,但将inBytes.Length作为最后一个参数传递。在取长度之前简单转换;

private static byte[] DecryptString(SymmetricAlgorithm symAlg, string inBytes)
{
    ICryptoTransform xfrm = symAlg.CreateDecryptor();
    return xfrm.TransformFinalBlock(Convert.FromBase64String(inBytes), 0, Convert.FromBase64String(inBytes).Length);
}

或更具可读性;

private static byte[] DecryptString(SymmetricAlgorithm symAlg, string inBytesString)
{
    var inBytes = Convert.FromBase64String(inBytesString);
    ICryptoTransform xfrm = symAlg.CreateDecryptor();
    return xfrm.TransformFinalBlock(inBytes, 0, inBytes.Length);
}