1

Тема: Шифр з автоключем.

Вирішив полазити по форуму, заглянув в смішні картинки а там таке... Ну короче я подумав що дійсно неможна просто так взяти і не запостити лабу на реплейсі.

// це сам метод 
private string AuotkeyCipher(string text, string key)
        {
            AlfabetUtils.TextNormalize(ref text);
            AlfabetUtils.TextNormalize(ref key);
            string encrVector = (key + text).Substring(0, text.Length);
            // if first symbol in key is valid cyrilllic symbol we use cyrillic decode otherwise latin.
            bool isCyrillic = key[0].ToString(CultureInfo.InvariantCulture)
                        .IndexOfAny(AlfabetUtils.CyrillicAlfabet.ToCharArray()) > -1;
            string result = string.Empty;
            for (int i = 0; i < text.Length; i++)
                result += AlfabetUtils.GetDecrCharFrom2Chars(text[i], encrVector[i], isCyrillic);
            return result;
        }


// а це службовий клас
public static class AlfabetUtils
    {
        public static readonly string LatinAlfabet = "abcdefghijklmnopqrstuvwxyz";
        public static readonly string CyrillicAlfabet = "абвгґдеєжзиіїйклмнопрстуфхцчшщьюя";
        public static char GetDecrCharFrom2Chars(char originChar, char shiftChar, bool isCyrylicText)
        {
            string searchChars = isCyrylicText ? CyrillicAlfabet : LatinAlfabet;
            if (originChar.ToString(CultureInfo.InvariantCulture).IndexOfAny(searchChars.ToCharArray()) > -1
                && shiftChar.ToString(CultureInfo.InvariantCulture).IndexOfAny(searchChars.ToCharArray()) > -1)
            {
                int originIndex = searchChars.IndexOf(originChar);
                int shiftIndex = searchChars.IndexOf(shiftChar);
                int resultIndex = originIndex + shiftIndex - 1 > searchChars.Length
                                      ? (originIndex + shiftIndex) % searchChars.Length
                                      : originIndex + shiftIndex;
                return searchChars[resultIndex];
            }
            return originChar;
        }
        public static void TextNormalize(ref string text)
        {
            string suportedChars = LatinAlfabet + CyrillicAlfabet;
            text = text.Where(c => c.ToString(CultureInfo.InvariantCulture).IndexOfAny(suportedChars.ToCharArray()) > -1)
                .Aggregate(string.Empty, (current, c) => current + c);
        }
    }

Надіюсь комусь поможе зекономити пару годин свого часу. В мене ще є парочка лаб по теорії шифрування інформацїї як тільки дороблю викладу сюди.

2

Re: Шифр з автоключем.

Круто, викладу і своїх пару лаб. По складності вони трохи складніше :)

3

Re: Шифр з автоключем.

Було б круто. А то в неті чогось нічого нормального не знаходиться ((