/// <summary> /// 加密字符串,转换结果为 Base64 编码字符 /// 加密密匙包含在加密结果中 /// /// 加密结果最短长度为 32 /// 然后以 12 或者 8 为基数增加为 44,56,64,76 ... /// /// 原码长度在与加密结果长度 /// 0 - 7 : 32 位 /// 8 - 15 : 44 位 = 32 + 12 /// 16 - 23 : 56 位 = 44 + 12 /// 24 - 31 : 64 位 = 56 + 8 /// 32 - 39 : 76 位 = 64 + 8 /// 40 - 47 : 88 位 = 76 + 12 /// 48 - 55 : 96 位 = 88 + 8 /// 56 - 63 : 108 位 = 96 + 12 /// 64 - 71 : 120 位 = 108 + 12 /// 72 - 89 : 128 位 = 120 + 8 /// ...... /// /// 即:原码长度没超过 8 ,密码长度升一个数量级,基数为 12 或者 8 /// MIME/BASE64 的算法很简单,它将字符流顺序放入一个 24 位的缓冲区,缺 /// 字符的地方补零。然后将缓冲区截断成为 4 个部分,高位在先,每个部分 6 位, /// 用下面的64个字符重新表示:“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”。 /// 如果输入只有一个或两个字节,那么输出将用等号“=”补足。这可以隔断附加的信息造成编码的混乱。 /// 这就是BASE64。 /// </summary> /// <param name="str"> 字符串 </param> /// <returns> 加密的字符串 </returns> public static string EncryptString(string str) { DESCrypto des = new DESCrypto(); byte[] key = des.desKey; byte[] iv = des.desIV; byte[] en = des.DESEncrypt(Encoding.ASCII.GetBytes(str)); byte[] result = new byte[en.Length + 16]; result[0] = en[0]; if (result[0] % 2 == 0) { for (int i = 0; i < 8; i++) { result[i + 1] = key[i]; } for (int i = 0; i < 8; i++) { result[i + 9] = iv[i]; } for (int i = 1; i < en.Length; i++) { result[i + 16] = en[i]; } } else { for (int i = 1; i < en.Length; i++) { result[i] = en[i]; } for (int i = 0; i < 8; i++) { result[i + en.Length] = key[i]; } for (int i = 0; i < 8; i++) { result[i + en.Length + 8] = iv[i]; } } return(Convert.ToBase64String(result)); }
/// <summary> /// 解密字符串 /// </summary> /// <param name="str"> 字符串 </param> /// <returns> 解密的字符串 </returns> public static string DecryptString(string str) { byte[] data = Convert.FromBase64String(str); byte[] key = new byte[8]; byte[] iv = new byte[8]; byte[] en = new byte[data.Length - 16]; en[0] = data[0]; if (en[0] % 2 == 0) { for (int i = 0; i < 8; i++) { key[i] = data[i + 1]; } for (int i = 0; i < 8; i++) { iv[i] = data[i + 9]; } for (int i = 1; i < en.Length; i++) { en[i] = data[i + 16]; } } else { for (int i = 1; i < en.Length; i++) { en[i] = data[i]; } for (int i = 0; i < 8; i++) { key[i] = data[i + en.Length]; } for (int i = 0; i < 8; i++) { iv[i] = data[i + en.Length + 8]; } } DESCrypto des = new DESCrypto(key, iv); return(Encoding.ASCII.GetString(des.DESDecrypt(en)).TrimEnd(new char[] { '\0' })); }