Black friday Black friday
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací
Pouze tento týden slevy až 80 % na programování v Javě

Diskuze: Vysvětlení

C# .NET .NET (C# a Visual Basic) Vysvětlení American English version English version

Aktivity (3)
Avatar
Tomáš Berky:4. března 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. března 11:01
Avatar
Ilja Židkov
Člen
Avatar
Odpovídá na Tomáš Berky
Ilja Židkov:4. března 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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 4. března 12:12
Avatar
Odpovídá na Ilja Židkov
Tomáš Berky:4. března 13:58

Dává, děkuji ti moc.

 
Nahoru Odpovědět 4. března 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.