IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Tomáš Berky:4.3.2019 11:01

Potřeboval bych vysvětlit následující kód, jedná se o Ceasarovu šifru. Kód není můj, program jsem našel pro inspiraci seminární práce do školy, ale rád bych ten kód chápal.

Zkusil jsem: using System;
using System.Collec­tions.Generic;
using System.Linq;
using System.Text;

namespace Caesar_Cipher
{
class Program
{

public static char cipher(char ch, int key)
{
if (!char.IsLetter(ch))
{

return ch;
}

char d = char.IsUpper(ch) ? 'A' : 'a';
return (char)((((ch + key) - d) % 26) + d);

}

public static string Encipher(string input, int key)
{
string output = string.Empty;

foreach (char ch in input)
output += cipher(ch, key);

return output;
}

public static string Decipher(string input, int key)
{
return Encipher(input, 26 - key);
}

static void Main(string[] args)
{

Console.Write­Line("Zadejte retezec k zasifrovani:");
Console.Write­Line("\n");
string UserString = Console.ReadLine();

Console.Write­Line("\n");

Console.Write("Za­dejte klic (ciselna hodnota): \t");
int key = Convert.ToInt32(Con­sole.ReadLine());
Console.Write­Line("\n");

Console.Write­Line("Zasifro­vana data:");

string cipherText = Encipher(User­String, key);
Console.Write("\n");
Console.Write­Line(cipherTex­t);
Console.Write("\n");

Console.Write­Line("Desifro­vana data:");

string t = Decipher(cipher­Text, key);
Console.Write("\n");
Console.Write­Line(t);

Console.ReadKey();

}
}
}

 
Odpovědět
4.3.2019 11:01
Avatar
Ilja Židkov
Člen
Avatar
Odpovídá na Tomáš Berky
Ilja Židkov:4.3.2019 12:12

Snad teď to dává trochu smysl. Není to nic jiného, než pochopení ASCII tabulky. Cokoliv není jasné - ptej se.

using System;

namespace CaesarCipher
{
    class Program
    {
        /// <summary>
        /// Provádí šifrování řetězce pomocí algoritmu "Caeserova šifra".
        /// </summary>
        /// <param name="ch">Znak, určený k zašifrování.</param>
        /// <param name="key">Celočíselná hodnota, která udává ASCII posun.</param>
        /// <returns>Zašifrovaný řetězec.</returns>
        public static char Cipher(char ch, int key)
        {
            // Jestliže dodaný argument není znak...
            if (!char.IsLetter(ch))
                // vrať původní argument.
                return ch;

            // Rozlišuj velká a malá písmena šifry a ulož jejich ASCII hodnotu.
            var asciiValue = char.IsUpper(ch) ? 'A' : 'a';

            // Proveď posun písmen.
            // 26 značí typickou anglickou abecedu.
            // Např. a se změní na b apod.
            return (char)((((ch + key) - asciiValue) % 26) + asciiValue);

        }

        /// <summary>
        /// Šifruje požadovaný řetězec.
        /// </summary>
        /// <param name="message">Zpráva k zašifrování.</param>
        /// <param name="key">Posun písmen (ASCII hodnoty) o požadovaný celočíselný klíč.</param>
        /// <returns>Dešifrovanou zprávu.</returns>
        public static string Encipher(string message, int key)
        {
            // Výchozí zpráva je prázdna.
            string encrypted = string.Empty;

            // Iteruj skrz každý znak v původní zprávě.
            foreach (char ch in message)
                // zašifruj zprávu a proveď posun znaků v abecedě (zaměň znaky).
                encrypted += Cipher(ch, key);

            // Vrať zašifrovaný řetezec (zprávu).
            return encrypted;
        }

        /// <summary>
        /// Dešifruje zašifrovanou šifru.
        /// </summary>
        /// <param name="input">Zpráva k dešifrování.</param>
        /// <param name="key">Posun písmen (ASCII hodnoty) o požadovaný celočíselný klíč.</param>
        /// <returns>Dešifrovanou šifru.</returns>
        public static string Decipher(string input, int key) => Encipher(input, 26 - key);

        static void Main(string[] args)
        {

            Console.WriteLine("Zadejte retezec k zasifrovani:");
            Console.WriteLine("\n");
            string UserString = Console.ReadLine();

            Console.WriteLine("\n");

            Console.Write("Zadejte klic (ciselna hodnota): \t");
            int key = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("\n");

            Console.WriteLine("Zasifrovana data:");

            string cipherText = Encipher(UserString, key);
            Console.Write("\n");
            Console.WriteLine(cipherText);
            Console.Write("\n");

            Console.WriteLine("Desifrovana data:");

            string t = Decipher(cipherText, key);
            Console.Write("\n");
            Console.WriteLine(t);

            Console.ReadKey();
        }
    }
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
4.3.2019 12:12
Avatar
Odpovídá na Ilja Židkov
Tomáš Berky:4.3.2019 13:58

Dává, děkuji ti moc.

 
Nahoru Odpovědět
4.3.2019 13:58
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.