Skip to content

Цезарова шифра (програмски језик C)

Задатак

Креирајте конзолну апликацију у програмском језику С за шифровање и дешифровање порука Цезаровом шифром. Дозвољена азбука за поруке (отворени текст и шифрат) су мала слова енглеског алфабета Σ = { a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z }. Размаци, велика слова и бројеви нису дозвољени.

Решење

Подсетимо се знаковног типа у програмском језику С. За памћење карактера користи се стандардни ASCII бинарни 7 битни кôд који се у меморији представља једним бајтом. Вредност карактера знаковног типа задаје се његовим навођењем између два апострофа, а карактер се може задати и помоћу декадне вредности – на пример int x = 'a'; (целобројној променљивој x додели смо вредност 97), односно char y = 98; (знаковној променљивој y додели смо знак b). Вредности свих 26 малих слова енглеског алфабета дефинисани су у ASCII табели декадним вредностима – од 97 за карактер a, до 122 за карактер z.

Ако корисник наше апликације одабере операцију шифровања, потребно је да унесе отворени текст и кључ, а апликација да “израчуна” шифрат. Поступак је прилично једноставан. Вредност првог карактера у шифрату биће једнак збиру вредности првог карактера у отвореном тексту и кључа, под условом да тај збир није већи од 122 (слово z). Ако јесте већи, од збира је потребно одузети 26.

Ако корисник наше апликације одабере операцију дешифровања, потребно је да унесе шифрат и кључ, а апликација да “израчуна” отворени текст. У овом случају, вредност првог карактера у отвореном тексту биће једнак разлици вредности првог карактера у шифрату и кључа, под условом да та разлика није мања од 97 (слово a). Ако јесте мања, разлику је потребно сабрати са 26.

Програмско решење

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main(void)
{
    int operacija, kljuc, i, slovo;
    char tekst[100];
    printf("+-----------------------------------+\n");
    printf("|   ZASTITA INFORMACIONIH SISTEMA   |\n");
    printf("|          Cezarova sifra           |\n");
    printf("+-----------------------------------+\n");
    printf("\nUnesite 1 za sifrovanje ili 2 za desifrovanje : ");
    scanf("%d", &operacija);
    if (operacija == 1)
    {
        printf("\nUnesite otvoreni tekst : ");
        scanf("%s", tekst);
        printf("\nUnesite kljuc : ");
        scanf("%d", &kljuc);
        for (i = 0; i < strlen(tekst); i++)
        {
            slovo = tekst[i] + kljuc;
            if (slovo > 'z')
                slovo -= 26;
            tekst[i] = slovo;
        }
    }
    else
    {
        printf("\nUnesite sifrat : ");
        scanf("%s", tekst);
        printf("\nUnesite kljuc : ");
        scanf("%d", &kljuc);
        for (i = 0; i < strlen(tekst); i++)
        {
            slovo = tekst[i] - kljuc;
            if (slovo < 'a')
                slovo += 26;
            tekst[i] = slovo;
        }
    }
    printf("\nRezultat : %s\n", tekst);
    return 0;
}

Тест примери

Шифровање:

+-----------------------------------+
|   ZASTITA INFORMACIONIH SISTEMA   |
|            Cezarov kod            |
+-----------------------------------+

Unesite 1 za sifrovanje ili 2 za desifrovanje : 1

Unesite otvoreni tekst : nikolatesla

Unesite kljuc : 3

Rezultat : qlnrodwhvod

Дешифровање

+-----------------------------------+
|   ZASTITA INFORMACIONIH SISTEMA   |
|            Cezarov kod            |
+-----------------------------------+

Unesite 1 za sifrovanje ili 2 za desifrovanje : 2

Unesite sifrat : qlnrodwhvod

Unesite kljuc : 3

Rezultat : nikolatesla