Скачиваний:
18
Добавлен:
01.05.2014
Размер:
2.47 Кб
Скачать
// vernam1.cpp : Defines the entry point for the console application.
// Lab. rab#1 Vernam encryption
// Students: Agamov Z.G., Belkin I.A., Soultakov M.A.
// Group: 4305

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <cctype>

#define ENTO	"Key entropy error"		/* entropy too short */

int al_dec = 0;

void fault(char *TYPE, char *problem)
{
	void *empty=0;
	printf("%s: %s\n", TYPE, problem);
	exit(1);
} 

char* vernam (char *org, char *key_f) {
	unsigned int itra = 0, sem = 1, pad = 0;
	char *hlpr, *dst;
	
	dst = (char *) calloc (strlen (org), sizeof (char));
	hlpr = (char *) calloc (strlen (org), sizeof (char));
	
	for (itra = 0, pad = 0; itra < strlen (key_f); itra++)
		if (isalpha (key_f[itra]))
			hlpr[pad++] = key_f[itra];
		
		if (strlen (org) > strlen (hlpr))
			fault(ENTO, "key too small or invalid symbols.");
		
		for (itra = 0, pad = 0; itra < strlen (key_f); itra++)
		{
			
			if (isupper (org[itra]))
			{
				org[itra] = tolower (org[itra]);
				sem--;
			}
			if (!isalpha (org[itra]))
				dst[itra] = org[itra];
			else if (!al_dec)
			{
				if (hlpr[itra]-'a'<0 && org[itra]-'a'<0)
					pad = 'a' + (org[itra]-'a')*-1 + (hlpr[itra]-'a')*-1;          
				else if (hlpr[itra]-'a'<0)
					pad = 'a' + (org[itra]-'a') + (hlpr[itra]-'a')*-1;
				else if(org[itra]-'a'<0)
					pad = 'a' + (org[itra]-'a')*-1 + (hlpr[itra]-'a');
				else 
					pad = 'a' + (org[itra] - 'a') + (hlpr[itra] - 'a');
				if (pad > 'z')
					pad -= 26;
				dst[itra] = pad;
			}
			else if (al_dec)
			{
				if (hlpr[itra]-'a'<0 && org[itra]-'a'<0)
					pad = 'a' + (org[itra]-'a')*-1 - (hlpr[itra]-'a')*-1;          
				else if (hlpr[itra]-'a'<0)
					pad = 'a' + (org[itra]-'a') - (hlpr[itra]-'a')*-1;
				else if(org[itra]-'a'<0)
					pad = 'a' + (org[itra]-'a')*-1 - (hlpr[itra]-'a');
				else 
					pad = 'a' + (org[itra] - 'a') - (hlpr[itra] - 'a');
				if (pad < 'a')
					pad += 26;
				dst[itra] = pad;
			}
			if (!sem)
			{
				dst[itra] = toupper (dst[itra]);
				sem++;
			}
		}
		
		return dst;
		
}

int main(int argc, char* argv[])
{
	//printf("Lab #1. Vernam encryption\nGroup:4305\nStudents: Agamov Z., Belkin I., Soultakov M\n");
	if (argc!=4) {
		printf("Usage: vernam.exe <mode: 0-encrypt; 1-decrypt> <message> <key>\n");
		exit(1);
	}
	al_dec = atoi(argv[1]);
	
	printf(vernam(argv[2], argv[3]));
	return 0;
}
Соседние файлы в папке vernam1