-3

我在 C# 中使用普通 DES 加密有问题,我想要一个 16 字符长度(16 字节 128 位)的输出字符串,它只包含字母和数字字符。

4

1 回答 1

1

如果您被限制为仅包含字母数字字符的 16 字符输出,则意味着您有大约 95 位可用的输出空间(如果您可以使用 Base-64 编码,则正好是 96 位,即包括 2 个非字母数字字符)。

因此,您无法使用此限制加密超过 95 位。如果这对你来说足够了,那是可能的。

像这样的东西(CTR 模式下的 3DES)是它如何工作的一个例子(使用 Base-64),但正如评论中所述,它真的取决于你真正想要做什么。

void Main()
{
    var data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
    var key = new byte[] { 01, 12, 23, 34, 45, 56, 67, 78, 89, 90, 09, 98, 87, 76, 65, 54, 43, 32, 21, 10, 11, 22, 33, 44 };
    var encrypted = Encrypt(data, key, 0);
    Console.WriteLine(encrypted);
    var decrypted = Decrypt(encrypted, key, 0);
    // decrypted should be equal to data here
}

public string Encrypt(byte[] data, byte[] key, long nonce)
{
    return Convert.ToBase64String(Transform(data, key, nonce));
}

public byte[] Decrypt(string data, byte[] key, long nonce)
{
    return Transform(Convert.FromBase64String(data), key, nonce);
}

byte[] Transform(byte[] data, byte[] key, long nonce)
{
    if (data.Length > 96/8) throw new ArgumentException("Too much data");

    using (var des = new TripleDESCryptoServiceProvider())
    {
        des.Key = key;
        des.Mode = CipherMode.ECB;
        using (var encryptor = des.CreateEncryptor())
        {
            var output = new byte[data.Length];
            var offset = 0;
            for(int counter = 0; counter <= data.Length / 8; ++counter)
            {
                var counterData = BitConverter.GetBytes(((long)counter) ^ nonce);
                var counterEncryption = new byte[des.BlockSize / 8];
                var counterEncryptionLen = encryptor.TransformBlock(counterData, 0, counterData.Length, counterEncryption, 0);
                Debug.Assert(counterEncryptionLen == counterEncryption.Length);
                for (var i = 0; i < des.BlockSize / 8 && offset < output.Length; ++i, ++offset)
                {
                    output[offset] = (byte)(data[offset] ^ counterEncryption[i]);
                }
            }
            return output;
        }
    }
}
于 2012-05-10T18:21:14.790 回答