/// <summary> /// 维吉尼亚加密与解密 /// </summary> public static class VigenereHelper { /// <summary> /// 密钥 /// </summary> private static string TableKey { get { return @"abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ"; } } /// <summary> /// 生成密钥字符串 /// </summary> /// <param name="input">明文或者密文</param> /// <returns></returns> private static string GetKey(string input) { string key = "SoftCenter"; //如果密钥长度比str短,则以不断重复密钥的方式生成密钥字符串 while (key.Length < input.Length) { key += key; } return key; } /// <summary> /// 加密算法 /// </summary> /// <param name="input">明文字符串</param> /// <returns>字符串</returns> public static string Encrypt(string input) { //密钥字符串 string K = GetKey(input); var rlt = string.Empty; for (var loop = 0; loop < input.Length; loop++) { //明文字符位置 var iP = TableKey.IndexOf(input[loop]); if (iP == -1) return "本算法暂时不能对字符:" + (input[loop]) + "进行加密"; //密钥字符位置 var iK = TableKey.IndexOf(K[loop]); if (iK == -1) return "密钥中包含非法字符:" + TableKey[loop]; rlt += TableKey[(iP + iK) % TableKey.Length]; } return rlt; } /// <summary> /// 解密 /// </summary> /// <param name="input">密文</param> /// <returns>返回解密后的字符串</returns> public static string Decrypt(string input) { //密钥字符串 string K = GetKey(input); var rlt = string.Empty; for (var loop = 0; loop < input.Length; loop++) { //密钥判断 var iK = TableKey.IndexOf(K[loop]); //密文字符 var iC = TableKey.IndexOf(input[loop]); if (iK > iC) { rlt += TableKey[iC + TableKey.Length - iK]; } else { rlt += TableKey[iC - iK]; } } return rlt; } }