Новые книги

The first edition of this book started with the words: ‘A modern society could no longer function without the microprocessor.’

This is certainly still true but it is even truer if we include the microcontroller. While the microprocessor is at the heart of our computers, with a great deal of publicity, the microcontroller is quietly running the rest of our world. They share our homes, our vehicles and our workplace, and sing to us from our greetings cards. They are our constant, unseen companions and billions are being installed every year with little or no publicity. The purpose of this book is to give a worry-free introduction to microprocessors and microcontrollers. It starts at the beginning and does not assume any previous knowledge of microprocessors or microcontrollers and, in gentle steps, introduces the knowledge necessary to take those vital first steps into the world of the micro. John Crisp
Слово криптография означает тайнопись.

Российская криптография имеет многовековую историю, начинающуюся с указов Петра I о «черных кабинетах». До середины 80-х годов XX века криптография в России использовалась только для военных, дипломатических и правительственных линий связи и была строго засекречена. Даже употребление слов «криптография», «шифры», «ключи к шифрам» в открытых публикациях было недопустимо. Но в мире быстро назревала потребность в гражданской криптографии, стремительно развивались информационные технологии, стали появляться компьютерные сети, Интернет, денежные электронные расчеты. Для этого требовались надежные и общедоступные криптографические методы защиты информации.

Была ли Россия готова к появлению гражданской криптографии? И да, и нет.

Да, потому что еще с советских времен в России существовала прекрасная криптографическая школа и высококлассные специалисты-криптографы, которые долгое время на равных конкурировали с американским Агентством Национальной Безопасности и обеспечивали гарантированную защиту военных, дипломатических и правительственных линий связи.

Нет, потому что синдром тотальной секретности всего, что касалось криптографии, восходил к сталинским временам и мало изменился за прошедшие десятилетия. А в подобных условиях очень хорошо себя чувствуют многочисленные чиновники от криптографии.

В 1992 году случился кризис: поток фальшивых авизо захлестнул Центральный Банк России и грозил обрушить всю финансовую систему. Потребовалась срочная помощь криптографов: в кратчайшие сроки создать, наладить и запустить в эксплуатацию систему криптографической защиты телеграфных и почтовых авизо в такой огромной структуре, как ЦБ РФ.

Эта задача была выполнена за три месяца – неимоверно короткий срок.

В России появился первый реальный пример гражданской криптографии.

О том, что представляла из себя советская криптографическая школа, о ее специалистах и начальниках, о царившей тогда в стране атмосфере, о том, как была создана система защиты для Центрального Банка России, и, наконец, о том, почему же в России так трудно пробивает себе дорогу гражданская криптография – в этой книге.

Примеры.

Пример 5

/* Программа, распечатывающая слова в строках файла в обратном порядке */
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <locale.h>
#define MAXL 255        /* макс. длина строки */
/* Если бы мы не включили ctype.h, то мы должны были бы определить
 * #define isspace(c) ((c) == ' ' || (c) == '\t' || (c) == '\f')
 */
main ( argc, argv )  char **argv;{
	setlocale(LC_ALL, "");
	if( argc == 1 ){
		/* программа вызвана без аргументов */
		munch( "" );
	}else{
	     /* аргументы программы - имена файлов */
	     while( argv[ 1 ] ){
		   munch( argv[1] );
		   argv++;
		   argc--;
	     }
	}
	total(); exit(0);
}
/* обработать файл с именем name */
munch( name ) char *name;
{
	char    l[MAXL];   /* буфер для очередной строки */
	int len;           /* длина этой строки */
	char *words[50];   /* таблица полей строки */
	char **s;          /* служебная */
	int nwords;        /* число слов в строке */
	FILE *fp;
	if( name == NULL || !*name )
	       fp = stdin;   /* стандартный ввод */
	else
	  if( (fp = fopen( name, "r" )) == NULL ){
		fprintf( stderr, "Не могу открыть файл %s\n",
			 name );
		return;
	  }
	printf( "----------------------------%s----\n", name );
	while( fgets( l, MAXL, fp ) !=  NULL ){
		len = strlen( l );
		if( len && l[len-1] == '\n' )
			   l[--len]  = '\0' ;
		if( nwords = parse( l, words)){
			/* распечатка слов в обратном порядке */
			for( --nwords; nwords >= 0; nwords-- ){
				printf( "%s ", words[ nwords] );
				add( words[ nwords ] );
			}
		}
		putchar ('\n');
	}
	if( fp != stdin ) fclose( fp );
}
/* разобрать строку на слова */
parse( s, tabl )
       register unsigned char *s;
       unsigned char *tabl[];
{
	char eol = 0;
	int nwords = 0;
	while ( !eol ){
		/* пропустить пробелы и табуляции */
		while(isspace(*s)) s++;
		if( !*s ) /* строка кончилась */
			break;
		*tabl++ = s; nwords++;
		/* начало очередного слова */
		/* пока не пробел и не конец строки */
		while( *s && !isspace(*s))s++;
		/* указатель стоит на символе,  следующем за словом */
		if( ! *s ) eol ++;
		*s = '\0';
		/* закрыли Слово, начинаем Дело */
		s++;
	}
	*tabl = NULL;
	return nwords;
}
/* построение таблицы слов, встречающихся в файле */
#define MAXWORDS 1024
struct W{
	int ctr;        /* число вхождений слова */
	char *wrd;      /* слово */
}w [MAXWORDS];          /* таблица */
int busy = 0 ;          /* занято в таблице */
extern char *malloc();
/* Добавить слово в таблицу */
add( word ) char *word;
{
	register i;
	static alert = 1;
	/* нет ли уже слова в таблице ? */
	/* если есть - просто увеличить счетчик */
	for( i = 0; i < busy ; i++ ){
		if( !strcmp( word, w[i].wrd )){
			w[i].ctr++;
			return;
		}
	}
	if( busy >= MAXWORDS ){
		if( alert ){
			fprintf( stderr, "Переполнение таблицы слов\7\n");
			alert = 0;
		}
		return;
	}
	/* нет, слова нет. Заносим: */
	w[busy].wrd = malloc( strlen( word ) + 1 );
			      /* 1 байт под символ \0 */
	if( w[busy].wrd == NULL ){
		fprintf( stderr, "Мало памяти\n");
		busy = MAXWORDS+1;  /* якобы переполнение */
		return;
	}
	w[busy].ctr = 1;
	strcpy( w[busy].wrd, word );
	busy++;
}
compare( a, b ) struct W *a, *b;
{
	return strcoll( a-> wrd, b-> wrd );
	/* strcoll сравнивает слова в алфавитном порядке */
}
/* выдача всех слов, встреченных в тексте, и числа их вхождений */
total(){
	register i;
	/* сортируем слова по алфавиту */
	qsort( w, busy, sizeof(struct W), compare );
	printf( "-----|-----------ИТОГ---------------\n");
	for( i=0; i < busy; i++ )
		printf( "%4d | %s\n",
			w[i].ctr,
			w[i].wrd
		);
}

© Copyright А. Богатырев, 1992-95
Си в UNIX

Назад | Содержание | Вперед