日期时间加密和解密,System.Text.Encoding.Unicode.GetBytes和System.Text.

本文关键字:System Text Encoding Unicode GetBytes 时间 加密 解密 日期 | 更新日期: 2023-09-27 18:09:41

我有一个最小的类来加密和解密没有时间组件的DateTime对象。下面的测试将在1988年1月1日工作,但在1988年1月2日失败。第一次迭代通过,但第二次迭代已经失败。

看来我的问题绝对是在字节的加密和解密之外。当调试第二次迭代(1988年1月02日)时,DateTime2EncryptedString中加密的具有以下值:

{字节[16]}[0]: 147[1]: 1[2]: 22[3]: 250[4]: 74[5]: 227[6]: 225[7]: 91[8]: 157[9]: 202[10]: 138[11]: 246[12]: 91[13]: 131[14]: 42[15]: 217

encryptedEncryptedString2DateTime中使用DateTime2EncryptedString的输出字符串作为参数时,具有以下值:

{字节[16]}[0]: 147[1]: 1[2]: 22[3]: 250[4]: 74[5]: 227[6]: 225[7]: 91[8]: 157[9]: 202[10]: 138[11]: 246[12]: 91[13]: 131[14]: 253[15]: 255

问题将来自我对字节到字符串(反之亦然)操作的误解??

测试

        public void Test1()
        {
            for (int year = 1988; year < 2010; year++)
            {
                for (int month = 1; month < 12; month++)
                {
                    for (int day = 1; day < 28; day++)
                    {
                        var dt = new DateTime(year, month, day);
                        TestDate(dt);
                    }
                }
            }
        }
        private void TestDate(DateTime dt)
        {
            var encryptedString = DateEncryption.DateTime2EncryptedString(dt);
            var output = DateEncryption.EncryptedString2DateTime(encryptedString);
            Assert.AreEqual(dt, output);
        }

这里是小实用程序类

public static class DateEncryption
{
    private static readonly byte[] Key = new byte[]
    {
        32, 29, 124, 21, 92, 18, 28,34, 74, 85, 14, 91, 51, 28, 73, 49, 54, 99, 1, 192, 211, 253, 251, 252,
        237, 142, 161, 178, 199, 208, 97, 98
    };
    private static readonly byte[] Iv = new byte[] { 19, 28, 33, 77, 131, 178, 192, 200, 215, 148, 247, 192, 184, 127, 3, 7};
    private static byte[] Decrypt(byte[] cipherData)
    {
        byte[] decryptedData;
        using (MemoryStream ms = new MemoryStream())
        {
            using (Rijndael alg = Rijndael.Create())
            {
                alg.Padding = PaddingMode.None;
                alg.Key = Key;
                alg.IV = Iv;
                using (CryptoStream cs = new CryptoStream(ms,
                    alg.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(cipherData, 0, cipherData.Length);
                }
                decryptedData = ms.ToArray();
            }
        }
        return decryptedData;
    }
    private static byte[] Encrypt(byte[] clearData)
    {
        byte[] encryptedData;
        using (MemoryStream ms = new MemoryStream())
        {
            using (Rijndael alg = Rijndael.Create())
            {
                alg.Padding = PaddingMode.None;
                alg.Key = Key;
                alg.IV = Iv;
                using (CryptoStream cs = new CryptoStream(ms,
                   alg.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearData, 0, clearData.Length);
                }
                encryptedData = ms.ToArray();
            }
        }
        return encryptedData;
    }

    #region DateTimeEncryption
    public static string DateTime2EncryptedString(DateTime dt)
    {
        var dt2str = string.Format("{0:D4}{1:D2}{2:D2}", dt.Year, dt.Month, dt.Day);
        var str2bytes = System.Text.Encoding.Unicode.GetBytes(dt2str);
        var encrypted = Encrypt(str2bytes);
        return System.Text.Encoding.Unicode.GetString(encrypted);
    }
    public static DateTime EncryptedString2DateTime(string s)
    {
        var encrypted = System.Text.Encoding.Unicode.GetBytes(s);
        var decrypted = Decrypt(encrypted);
        var bytes2str = System.Text.Encoding.Unicode.GetString(decrypted);
        return new DateTime(int.Parse(bytes2str.Substring(0, 4)),
            int.Parse(bytes2str.Substring(4, 2)),
            int.Parse(bytes2str.Substring(6, 2)));
    }
    #endregion
}

日期时间加密和解密,System.Text.Encoding.Unicode.GetBytes和System.Text.

不是每个字节序列在unicode中都有效。System.Text.Encoding.Unicode.GetString忽略这些序列。Base64字符串被设计用来转换字符串中的任何字节序列。在。net中,您可以使用base64字符串通过转换类通过方法,如ToBase64String(Byte[])FromBase64String(string)