Задатак
Креирајте конзолну апликацију у програмском језику C или C# за One-time pad шифровање. Улаз треба да буде отворени текст P (стринг) и кључ K (стринг), а излаз шифрат C (битови).
Домаћи задатак
Креирајте конзолну апликацију у програмском језику C или C# за One-time pad дешифровање. Улаз треба да буде шифрат С (битови из ове апликације) и кључ K (стринг), а излаз дешифровани отворени текст P (стринг).
Решење
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
const char *bajt_u_bitove(int x)
{
static char b[9];
b[0] = '\0';
char *p = b;
int z;
for (z = 128; z > 0; z >>= 1)
*p++ = (x & z) ? '1' : '0';
return b;
}
int main(void)
{
printf("+-----------------------------------+\n");
printf("| ZASTITA INFORMACIONIH SISTEMA |\n");
printf("| One-time pad sifrovanje |\n");
printf("+-----------------------------------+\n");
int i;
char P[100], K[100], C[100];
printf("\nUnesite otvoreni tekst: ");
gets(P);
printf("P: ");
for (i = 0; i < strlen(P); i++)
printf("%s", bajt_u_bitove(P[i]));
printf("\n\nUnesite kljuc: ");
gets(K);
printf("K: ");
for (i = 0; i < strlen(K); i++)
printf("%s", bajt_u_bitove(K[i]));
if (strlen(P) != strlen(K))
printf("\n\nGRESKA: Duzina otvorenog teksta i kljuca nije ista!");
else
{
printf("\n\nC = P XOR K");
printf("\nC: ");
for (i = 0; i < strlen(K); i++)
{
C[i] = P[i] ^ K[i];
printf("%s", bajt_u_bitove(C[i]));
}
}
return 0;
}
Тест примери
Шифровање:
+-----------------------------------+
| ZASTITA INFORMACIONIH SISTEMA |
| One-time pad sifrovanje |
+-----------------------------------+
Unesite otvoreni tekst: velimir
P: 01110110011001010110110001101001011011010110100101110010
Unesite kljuc: program
K: 01110000011100100110111101100111011100100110000101101101
C = P XOR K
C: 00000110000101110000001100001110000111110000100000011111
Ако се не слаже дужина отвореног текста и кључа:
+-----------------------------------+
| ZASTITA INFORMACIONIH SISTEMA |
| One-time pad sifrovanje |
+-----------------------------------+
Unesite otvoreni tekst: velimir
P: 01110110011001010110110001101001011011010110100101110010
Unesite kljuc: radlovacki
K: 01110010011000010110010001101100011011110111011001100001011000110110101101101001
GRESKA: Duzina otvorenog teksta i kljuca nije ista!