⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rijndaeltest-fst.c

📁 非常经典的加密算法
💻 C
📖 第 1 页 / 共 2 页
字号:
/* rijndaeltest-fst.c   v2.0   August '99 * Optimised ANSI C code * authors: v1.0: Paulo Barreto *                Antoon Bosselaers *          v2.0: Vincent Rijmen */#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include "rijndael-api-fst.h"#define SUBMITTER "Joan Daemen"static void blockPrint (FILE *fp, const BYTE *block, const char *tag){	int i;	fprintf (fp, "%s=", tag);	for (i = 0; i < 16; i++) {		fprintf (fp, "%02X", block[i]);	}	fprintf (fp, "\n");	fflush (fp);} /* blockPrint */static void rijndaelVKKAT (FILE *fp, int keyLength){	int i, j, r;	BYTE block[4*4];	BYTE keyMaterial[320];	BYTE byteVal = (BYTE)'8';	keyInstance keyInst;	cipherInstance cipherInst;#ifdef TRACE_KAT_MCT	printf ("Executing Variable-Key KAT (key %d): ", keyLength);	fflush (stdout);#endif /* ?TRACE_KAT_MCT */	fprintf (fp,		"\n"		"==========\n"		"\n"		"KEYSIZE=%d\n"		"\n", keyLength);	fflush (fp);	memset (block, 0, 16);	blockPrint (fp, block, "PT");	memset (keyMaterial, 0, sizeof (keyMaterial));	memset (keyMaterial, '0', keyLength/4);	for (i = 0; i < keyLength; i++) {		keyMaterial[i/4] = byteVal; /* set only the i-th bit of the i-th test key */		r = makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial);		if (TRUE != r) {			fprintf(stderr,"makeKey error %d\n",r);			exit(-1);		}		fprintf (fp, "\nI=%d\n", i+1);		fprintf (fp, "KEY=%s\n", keyMaterial);		memset (block, 0, 16);		r = cipherInit (&cipherInst, MODE_ECB, NULL);		if (TRUE != r) {			fprintf(stderr,"cipherInit error %d\n",r);			exit(-1);		}		r = blockEncrypt(&cipherInst, &keyInst, block, 128, block);		if (128 != r) {			fprintf(stderr,"blockEncrypt error %d\n",r);			exit(-1);		}		blockPrint (fp, block, "CT");		/* now check decryption: */		makeKey(&keyInst, DIR_DECRYPT, keyLength, keyMaterial);		blockDecrypt(&cipherInst, &keyInst, block, 128, block);		for (j = 0; j < 16; j++) {			assert (block[j] == 0);		}		/* undo changes for the next iteration: */		keyMaterial[i/4] = (BYTE)'0';		byteVal =			(byteVal == '8') ?	'4' :			(byteVal == '4') ?	'2' :			(byteVal == '2') ?	'1' :		/*	(byteVal == '1') */	'8';	}	assert (byteVal == (BYTE)'8');	#ifdef TRACE_KAT_MCT	printf (" done.\n");#endif /* ?TRACE_KAT_MCT */} /* rijndaelVKKAT */static void rijndaelVTKAT (FILE *fp, int keyLength){	int i;	BYTE block[4*4];	BYTE keyMaterial[320];	keyInstance keyInst;	cipherInstance cipherInst;#ifdef TRACE_KAT_MCT	printf ("Executing Variable-Text KAT (key %d): ", keyLength);	fflush (stdout);#endif /* ?TRACE_KAT_MCT */	fprintf (fp,		"\n"		"==========\n"		"\n"		"KEYSIZE=%d\n"		"\n", keyLength);	fflush (fp);	memset (keyMaterial, 0, sizeof (keyMaterial));	memset (keyMaterial, '0', keyLength/4);	makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial);	fprintf (fp, "KEY=%s\n", keyMaterial);	for (i = 0; i < 128; i++) {		memset (block, 0, 16);		block[i/8] |= 1 << (7 - i%8); /* set only the i-th bit of the i-th test block */		fprintf (fp, "\nI=%d\n", i+1);		blockPrint (fp, block, "PT");		cipherInit (&cipherInst, MODE_ECB, NULL);		blockEncrypt(&cipherInst, &keyInst, block, 128, block);		blockPrint (fp, block, "CT");	}#ifdef TRACE_KAT_MCT	printf (" done.\n");#endif /* ?TRACE_KAT_MCT */}static void rijndaelTKAT (FILE *fp,  int keyLength, FILE *in){	int i, j;	unsigned int s;	BYTE block[4*4], block2[4*4];	BYTE keyMaterial[320];	keyInstance keyInst;	cipherInstance cipherInst;#ifdef TRACE_KAT_MCT	printf ("Executing Tables KAT (key %d): ", keyLength);	fflush (stdout);#endif /* ?TRACE_KAT_MCT */	fprintf (fp,		"\n"		"==========\n"		"\n"		"KEYSIZE=%d\n"		"\n", keyLength);	fflush (fp);	memset (keyMaterial, 0, sizeof (keyMaterial));		for(i = 0; i < 64; i++) {		fprintf (fp, "\nI=%d\n", i+1);		for(j = 0; j < keyLength/4; j++) {			fscanf(in,"%c",&keyMaterial[j]);		}		makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial);				fprintf (fp, "KEY=%s\n", keyMaterial);				for(j = 0; j < 16; j++) {			fscanf(in,"%02x",&s);			block[j] = s;		}		fscanf(in,"%c",&s);		fscanf(in,"%c",&s);		blockPrint (fp, block, "PT");		cipherInit (&cipherInst, MODE_ECB, NULL);		blockEncrypt(&cipherInst, &keyInst, block, 128, block2);		blockPrint (fp, block2, "CT");	}	for(i = 64; i < 128; i++) {		fprintf (fp, "\nI=%d\n", i+1);		for(j = 0; j < keyLength/4; j++) {			fscanf(in,"%c",&keyMaterial[j]);		}		makeKey(&keyInst, DIR_DECRYPT, keyLength, keyMaterial);				fprintf (fp, "KEY=%s\n", keyMaterial);				for(j = 0; j < 16; j++) {			fscanf(in,"%02x",&s);			block[j] = s;		}		fscanf(in,"%c",&s);		fscanf(in,"%c",&s);		cipherInit (&cipherInst, MODE_ECB, NULL);		blockDecrypt(&cipherInst, &keyInst, block, 128, block2);		blockPrint (fp, block2, "PT");		blockPrint (fp, block, "CT");	}#ifdef TRACE_KAT_MCT	printf (" done.\n");#endif /* ?TRACE_KAT_MCT */}static void rijndaelIVKAT (FILE *fp, int keyLength){	int i;	BYTE block[4*4], block2[4*4];	BYTE keyMaterial[320];	keyInstance keyInst;	cipherInstance cipherInst;	char format[10];#ifdef TRACE_KAT_MCT	printf ("Executing Intermediate value KAT (key %d): ", keyLength);	fflush (stdout);#endif /* ?TRACE_KAT_MCT */		fprintf (fp,		"\n"		"==========\n"		"\n"		"KEYSIZE=%d\n",		keyLength);	fflush (fp);	memset (keyMaterial, 0, sizeof (keyMaterial));	for (i = 0; i < keyLength/8; i++) {		sprintf (&keyMaterial[2*i], "%02X", i);	}	makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial);	fprintf (fp, "KEY=%s\n", keyMaterial);	fprintf (fp, "\nIntermediate Ciphertext Values (Encryption)\n\n");	for (i = 0; i < 16; i++) {		block[i] = i;	}	blockPrint (fp, block, "PT");	cipherInit (&cipherInst, MODE_ECB, NULL);	for(i = 1; i < ROUNDS; i++) {		cipherUpdateRounds (&cipherInst, &keyInst, block, 16, block2, i);		sprintf(format,"CT%d",i);		blockPrint (fp, block2, format);	}	cipherUpdateRounds (&cipherInst, &keyInst, block, 128, block2, ROUNDS);	blockPrint (fp, block2, "CT");		/* hack ! */	/* in order to get the same intermediate values in decryption	   as in decryption, we need to use the encryption roundkeys,	   but the key direction has to be DIR_DECRYPT	   	   consider it as a dirty trick 	 */	makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial);	keyInst.direction = DIR_DECRYPT;	/* end hack */	fprintf (fp, "\nIntermediate Ciphertext Values (Decryption)\n\n");	blockPrint (fp, block2, "CT");	cipherInit (&cipherInst, MODE_ECB, NULL);	for(i = 1; i < ROUNDS; i++) {		cipherUpdateRounds (&cipherInst, &keyInst, block2, 128,block, ROUNDS-i);		sprintf(format,"PT%d",i);		blockPrint (fp, block, format);	}	cipherUpdateRounds (&cipherInst, &keyInst, block2, 128, block, 0);	blockPrint (fp, block, "PT");	#ifdef TRACE_KAT_MCT	printf (" done.\n");#endif }static void makeKATs (const char *vkFile, const char *vtFile, const char *tblFile,                      const char *ivFile){	FILE *fp, *fp2;	/* prepare Variable Key Known Answer Tests: */	fp = fopen (vkFile, "w");	fprintf (fp,		"\n"		"=========================\n"		"\n"		"FILENAME:  \"%s\"\n"		"\n"		"Electronic Codebook (ECB) Mode\n"		"Variable Key Known Answer Tests\n"		"\n"		"Algorithm Name: Rijndael\n"		"Principal Submitter: %s\n",		vkFile,SUBMITTER);	fflush (fp);	rijndaelVKKAT (fp, 128); /* test for 128-bit key */	rijndaelVKKAT (fp, 192); /* test for 192-bit key */	rijndaelVKKAT (fp, 256); /* test for 256-bit key */	fprintf (fp,		"\n"		"==========");	fclose (fp);	/* prepare Variable Text Known Answer Tests: */	fp = fopen (vtFile, "w");	fprintf (fp,		"\n"		"=========================\n"		"\n"		"FILENAME:  \"%s\"\n"		"\n"		"Electronic Codebook (ECB) Mode\n"		"Variable Text Known Answer Tests\n"		"\n"		"Algorithm Name: Rijndael\n"		"Principal Submitter: %s\n",		vtFile,SUBMITTER);	fflush (fp);	rijndaelVTKAT (fp, 128);	rijndaelVTKAT (fp, 192);	rijndaelVTKAT (fp, 256);	fprintf (fp,		"\n"		"==========");	fclose (fp);	/* prepare Tables Known Answer Tests: */	fp = fopen (tblFile, "w");	fprintf (fp,	        "/* Description of what tables are tested:\n"		"   The provided implementations each use a different set of tables\n"		"    - Java implementation: uses no tables\n"		"    - reference C implementation: uses Logtable, Alogtable, S, Si, rcon\n"		"    - fast C implementation: uses Logtable, Alogtable,  rcon\n"		"        and additionally, T1, T2, T3, T4, T5, T6, T7, T8\n"		"   All these tables are tested.\n" 		"\n"		"=========================\n"		"\n"		"FILENAME:  \"%s\"\n"		"\n"		"Electronic Codebook (ECB) Mode\n"		"Tables Known Answer Tests\n"		"\n"		"Algorithm Name: Rijndael\n"		"Principal Submitter: %s\n",		tblFile,SUBMITTER);	fflush (fp);	if (NULL != (fp2 = fopen("table.128","r"))) {		rijndaelTKAT (fp, 128,fp2);		fclose(fp2);	} else {		printf("Table Known Answer test expects file table.128\n");		fclose(fp);		exit (EXIT_FAILURE);			}	if (NULL != (fp2 = fopen("table.192","r"))) {		rijndaelTKAT (fp, 192,fp2);		fclose(fp2);	} else {		printf("Table Known Answer test expects file table.192\n");		fclose(fp);		exit (EXIT_FAILURE);			}	if (NULL != (fp2 = fopen("table.256","r"))) {		rijndaelTKAT (fp, 256,fp2);		fclose(fp2);	} else {		printf("Table Known Answer test expects file table.192\n");		fclose(fp);		exit (EXIT_FAILURE);			}		fprintf (fp,		"\n"		"==========");	fclose (fp);	/* prepare Intermediate Values Known Answer Tests: */	fp = fopen (ivFile, "w");	fprintf (fp,		"\n"		"=========================\n"		"\n"		"FILENAME:  \"%s\"\n"		"\n"		"Electronic Codebook (ECB) Mode\n"		"Intermediate Value Known Answer Tests\n"		"\n"		"Algorithm Name: Rijndael\n"		"Principal Submitter: %s\n",		ivFile,SUBMITTER);	fflush (fp);	rijndaelIVKAT (fp, 128);	rijndaelIVKAT (fp, 192);	rijndaelIVKAT (fp, 256);	fprintf (fp,		"\n"		"==========");	fclose (fp);}static void rijndaelECB_MCT (FILE *fp, int keyLength, BYTE direction){	int i, j;	BYTE inBlock[4*4], outBlock[4*4], binKey[4*MAXKC];	BYTE keyMaterial[320];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -