日期时间加密和解密,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
当encrypted在EncryptedString2DateTime中使用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
}
不是每个字节序列在unicode中都有效。System.Text.Encoding.Unicode.GetString
忽略这些序列。Base64字符串被设计用来转换字符串中的任何字节序列。在。net中,您可以使用base64字符串通过转换类通过方法,如ToBase64String(Byte[])
和FromBase64String(string)
。