Шифр Цезаря на C#



Если я хочу написать шифр Цезаря C# , должен ли я пройти через каждый случай? Для меня нет смысла конвертировать в ASCII или UTF (вероятно, потому, что я не понимаю, как это будет работать). Мне просто нужна точка в правильном направлении.



Должен ли я присвоить каждой букве числа 1-26?

672   4  

4 ответов:

Вы можете поместить каждую букву в массив и использовать индекс массива (обертывание в конце) или вы можете просто использовать значение asccii буквы и обертывать до первого, когда достигнете последнего. Фокус здесь в том, что все символы конически отсортированы, начиная с A=0x41

Возможно, намеки будут полезны - вы говорите, что не хотите копировать или получать ответ:

    Рассмотрим, что C# имеет оператор модуля в виде a = b % c-то есть остаток от b, разделенный на c. Когда c = n и b = n, a = 0. Когда c = n и b = n+1, a = 1. Поэкспериментируйте с поведением этого оператора.
  • массивы можно объявлять статически в C# с помощью инициализаторов: char[] chars = new char[]{'a', 'b',...};

Для традиционного шифра Цезаря вы бы проверили, что символ находится в диапазоне [a-z] или [A-Z], и просто передали бы его в противном случае.

Альтернативой является обращение со всеми символами одинаково, так что не только a становится b, но и µ становится ¶ , и вы оборачиваетесь вокруг U+10FFFF (самая высокая кодовая точка в Unicode) становится U+0000 (первый не является символом, а второй-нулевым символом, но нет никаких причин, почему a string не может удерживать их для передачи в другое место.

Между ними во-вторых, это действовать на UTF-16. То есть вы просто добавляете 1 к значению каждого char и переносите U+FFFF через U+0000. Вывод может стать недопустимой строкой UTF-16 (потому что она может иметь неправильно подобранные суррогаты, но это не помешает вам передать ее в string, а затем расшифровать ее снова. В конце концов, современное шифрование также не приводит к допустимым строкам.

Это мой подход.

    public static string Encrypt(string str, int n)
    {
        return string.Join("", str.Select(x => Encrypt(x, n)));
    }

    public static string Decrypt(string str, int n)
    {
        return string.Join("", str.Select(x => Decrypt(x, n)));
    }

    public static char Encrypt(char chr, int n)
    {
        int x = chr - 65;

        return (char)((65) + ((x + n) % 26));
    }

    public static char Decrypt(char chr, int n)
    {
        int x = chr - 65;

        return (char)((65) + ((x - n) % 26));
    }

P.S.

Работает только для прописных букв.

Прочитайте статью Википедии: шифр Цезаря

Comments

    Ничего не найдено.