我的TripleDES包装器不起作用

本文关键字:不起作用 包装 TripleDES 我的 | 更新日期: 2023-09-27 18:03:10

紧接我上一个TripleDES相关的问题,这里是我的TripleDES包装器代码,用于加密和解密整数:

public static class Crypto {
    private static Byte[]    _fixedIv = new Byte[] { /* 8 random bytes, const */ };
    private static TripleDES _tripleDes;
    private static Byte[]    _key;
    static Crypto() {
        _tripleDes = TripleDES.Create();
        _tripleDes.Mode = CipherMode.CFB;
        String key = ConfigurationManager.AppSettings["cryptoKeyId"];
        _key = Convert.FromBase64String( key );
    }
    /// <summary>Encrypts the specified integer using the configuration-stored key.</summary>
    public static String EncryptID(Int32 id) {
        Byte[] input = new Byte[8]; // 64-bit block size
        Byte[] inputLo = BitConverter.GetBytes( id );
        for(int i=0;i<inputLo.Length;i++) input[i] = inputLo[i];
        ICryptoTransform tr = _tripleDes.CreateEncryptor( _key, _fixedIv );
        Byte[] output = new Byte[8];
        tr.TransformBlock( input, 0, input.Length, output, 0 );
        return Convert.ToBase64String( output );
    }
    /// <summary>Decrypts the specified string (storing an integer) using the configuration-stored key.</summary>
    public static Int32 DecryptID(String s) {
        Byte[] ciphertext = Convert.FromBase64String(s);
        ICryptoTransform tr = _tripleDes.CreateDecryptor( _key, _fixedIv );
        Byte[] output = new Byte[8];
        tr.TransformBlock( ciphertext, 0, ciphertext.Length, output, 0 );
        Byte[] outputLo = new Byte[4] { output[0], output[1], output[2], output[3] };
        return BitConverter.ToInt32( outputLo, 0 );
    }
}

当我运行它时,我对EncryptID的每个输入都得到确定的结果,但是对DecryptID的每次调用都返回零。我进入代码,说"输出"数组的内容都是零(和tr.TransformBlock返回零)。有人知道我哪里做错了吗?

我试着调用tr.TransformFinalBlock,但我得到一个异常:

'tr.TransformFinalBlock( ciphertext, 0, ciphertext.Length )' threw an exception of type System.Security.Cryptography.CryptographicException' base {System.SystemException}: {"Bad Data.'r'n"}

我的TripleDES包装器不起作用

事实证明,对于单个块,我应该使用TransformFinalBlock进行加密和解密。

我还必须设置一个算法。Padding to None,保证8字节的clear被转换成8字节的密文