/// <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; } }