加密/解密不返回原始数据长度

时间:2015-07-06 17:33:26

标签: c# .net cryptography rijndael

我不明白为什么下面的代码失败了。

public string Encrypt(System.Byte value)
{
    return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(value)));
}

public bool Decrypt(string encryptedValue, out System.Byte value)
{
    byte[] data = Decrypt(Convert.FromBase64String(encryptedValue));
    if (data.Length != sizeof(System.Byte))  // <===== THIS IS TRUE!!!
    {
        value = default(System.Byte);
        return false;
    }
    value = data[0];
    return true;
}

具体来说,从byte返回的Decrypt(byte[], out byte)数组长度为2个字节,而不是预期的1个字节长度。

请注意,第二个字节似乎始终为零,第一个字节的值正确。所以我可以通过取第一个字节来使代码工作。但有谁知道为什么我得到额外的字节。我猜这可能与Convert.FromBase64String有关。

以下是我的基础EncryptDecrypt方法。

public virtual byte[] Encrypt(byte[] data)
{
    using (Rijndael algorithm = Rijndael.Create())
    using (ICryptoTransform encryptor = algorithm.CreateEncryptor(Key.KeyString, Key.KeyBytes))
    {
        MemoryStream ms = new MemoryStream();
        using (Stream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
        {
            cs.Write(data, 0, data.Length);
        }
        return ms.ToArray();
    }
}

public virtual byte[] Decrypt(byte[] data)
{
    using (Rijndael algorithm = Rijndael.Create())
    using (ICryptoTransform decryptor = algorithm.CreateDecryptor(Key.KeyString, Key.KeyBytes))
    {
        MemoryStream ms = new MemoryStream();
        using (Stream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
        {
            cs.Write(data, 0, data.Length);
        }
        return ms.ToArray();
    }
}

1 个答案:

答案 0 :(得分:2)

BitConverter.GetBytes方法不提供需要byte的重载。我的猜测是它将它提升为(2字节)ushort然后加密,因此解密时会产生2字节的结果。