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

📄 nvxor.c

📁 写专属或加密程序。 程序应该采取作为输入由程序然后加密的文件名。 程序应该要求用户输入密钥
💻 C
字号:
// // **********************************************************************// *                           Code Challenge                           *// **********************************************************************//// Challenge:////	Write an exclusive-OR encryption program.//	The program should take as input a filename that//	is then encrypted by the program.  The program//	should ask the user to input an encryption key,//	which should be used to encrypt the file.//	The output of the program should go into a file//	with the same filename but a .ENC extension//	(for simplicity sake).//	All programs should run under DOS. //// Comments and voluntary changes:// //	Added a second argument for output filename,//  as you cannot encrypt/decrypt a file that already//	is encrypted and has the .enc extension following//	the given guidelines. This change to the specifications//	is optional, so it works as per the specifications as//	well.//	The program encrypts the file, not the filename like //	stated above, I think it's obvious that this passage //	should not be taken by the word.//	This application uses ANSI commands and standard headers,//	it should be able to run as a .c file as well. However,//	I was too lazy to test it on anything but VC as a windows//	console application.//	My other programs would probably be commented differently,//	but as all of us are working at the same problem, much of//	it will be quite clear from own experience.//  Edit: Tested ok as pure C.// // Time:////	I received the mail Tuesday, 08.01.2002 15:27.//  Started coding at roughly 18:00//  Finished coding at about 18:45, starting to write comment.//  Sent the reply mail: 19:30//// Facts:////	Author:		Niels Voigt//  EMail:		nvoigt@saz.net //	Username:	nvoigt from cprogramming//	Compiler:	VC 6 SP 5//	Project:	Console Application, should be 100% DOS compatible//	Libraries:	ANSI C//// Testing://  //  Encrypting a file twice and checking with the FC utility //	gives a 100% match. So if there are still mistakes, at //	least they are consistent ;-)//// standard includes for io and strings#include <stdio.h>#include <string.h>// constants#define MAX_PATH			1000#define MAX_ENCRYPT_KEY		100#define XOR_FILE_EXT		".enc"#define ERROR_NOERROR		0#define ERROR_READERROR		1#define ERROR_WRITEERROR	2// prototypes, description see belowint CreateFileName( const char* szOldFile, char* szNewFile );int RemoveUnwantedCharacters( char* szBuffer );//// main////	the encryption program itself//int main( int argc, char* argv[] ) {	// variable declaration	FILE*	fpInput;	FILE*	fpOutput;	char	szFileName[MAX_PATH+1];	char	szEncryptionKey[MAX_ENCRYPT_KEY+1];	int		nEncryptKeyLength;	int		nByte;	int     nCount;	int     nError;	// check for arguments	if( argc == 2 )	{		// create filename if only source was given		CreateFileName( argv[1], szFileName );	}	else if( argc == 3 )	{		// copy given destination 		strcpy( szFileName, argv[2] );	}	else	{		// print help if number of arguments are illegal		printf( "\nWrong number of arguments\n" );		printf( "USAGE: %s Source [Destination]\n\n", argv[0] );		return 1;	}	// ask for encryption key	do	{		printf( "Please enter encryption key ( 1 - %d characters ):",MAX_ENCRYPT_KEY );		memset( szEncryptionKey, MAX_ENCRYPT_KEY+1, 0 );		fgets( szEncryptionKey, MAX_ENCRYPT_KEY, stdin );		RemoveUnwantedCharacters( szEncryptionKey );		nEncryptKeyLength = strlen( szEncryptionKey );	}		while( nEncryptKeyLength == 0 );	// print status and data	printf( "\n" );	printf( "Encrypting [%s]\n",argv[1] );	printf( "        to [%s]\n",szFileName );	printf( "     using [%s]\n",szEncryptionKey );	printf( "\n" );		// open input file	fpInput = fopen( argv[1], "rb" );	if( fpInput == NULL )	{		printf( "Error: Unable to open %s for reading.\n\n", argv[1] );		return 2;	}	// open output	fpOutput = fopen( szFileName, "wb" );	if( fpOutput == NULL )	{		printf( "Error: Unable to open %s for writing.\n\n", szFileName );		return 3;	}	nCount = 0;	nError = ERROR_NOERROR;	// encryption loop:	// read a byte, encrypt, write, next until no more bytes	// each byte is encrypted with one letter from the key,	// when the end of the key is reached, the next byte is	// encrypted with the first one again.	while( ( nByte = fgetc( fpInput ) ) != EOF )	{		if( fputc( nByte ^ szEncryptionKey[nCount], fpOutput ) == EOF )		{			nError = ERROR_WRITEERROR;			break;		}		nCount++;		if( nCount >= nEncryptKeyLength ) nCount = 0;	}	// check if the loop terminated with an end-of-file.	// after all, somebody may have pulled the	// plug or the network cable, which will also result 	// in an EOF condition for fgetc.	if( ! feof( fpInput ) ) nError = ERROR_READERROR;	// print end message	switch( nError )	{		case ERROR_NOERROR:			printf( "Encryption complete.\n\n" );			break;		case ERROR_READERROR:			printf( "Error: unable to perform READ operation on file [%s]\n\n", argv[1] );			break;		case ERROR_WRITEERROR:			printf( "Error: unable to perform WRITE operation on file [%s]\n\n", szFileName );			break;		default:			printf( "Error: Unknown Error, please contact your support.\n\n" );			break;	}	// close files	fclose( fpInput );	fclose( fpOutput );	// done ;-)	return 0; }//// CreateFileName////	creates the destination filename from the source//	by replacing the file extension or adding it if//	no other extension is found.//int CreateFileName( const char* szOldFile, char* szNewFile ){	char* szReplace;	strcpy( szNewFile, szOldFile );	szReplace = szNewFile + strlen( szNewFile );	while( szReplace > szNewFile && *szReplace != '\\' && *szReplace != '/' )	{		if( *szReplace == '.' )		{			strcpy( szReplace, XOR_FILE_EXT );			return 0;		}		szReplace--;	}	strcat( szNewFile, XOR_FILE_EXT );	return 1;}//// RemoveUnwantedCharacters////	removes the 0D characters that are left in the buffer //  when reading... I wish there was ONE out-of-the-box//	simple-to-use input function.//int RemoveUnwantedCharacters( char* szBuffer ){	while( *szBuffer != 0 )	{		if( *szBuffer == 0x0a || *szBuffer == 0x0d ) *szBuffer = 0;		szBuffer++;	}	return 0;}//// END OF FILE// 

⌨️ 快捷键说明

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