【问题标题】:My TripleDES wrapper doesn't work我的 TripleDES 包装器不起作用
【发布时间】:2011-07-20 18:33:03
【问题描述】:

紧接着my last TripleDES-related question,这是我的 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"}

【问题讨论】:

    标签: c# tripledes


    【解决方案1】:

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

    我还必须将 algo.Padding 设置为 None 以确保将 8 个字节的明文转换为 8 个字节的密文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      相关资源
      最近更新 更多