維吉尼亞加密與解密

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章