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

📄 pscrypt.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* * * Adobe's encryption/decryption algorithm for eexec and show. Runs in * eexec mode unless told otherwise. Use, * *		pscrypt file.cypher > file.clear * * to decrypt eexec input. Assumes file.cypher is hex with the key as the * first four bytes, and writes file.clear as binary (omitting the key). * Use * *		pscrypt -e12ab34ef file.clear >file.cypher * * to encrypt file.clear (for eexec) using 12ab34ef as the key. Input is * binary and output is hex. The key must be given as a hex number. Use * -sshow to encrypt or decrypt a CharString or Subr, * *		pscrypt -sshow file.cypher > file.clear * * Use -b or -x to read binary or hex input, and -B or -X to output binary * or hex. * */#include <stdio.h>#include <ctype.h>#define ENCRYPT		0#define DECRYPT		1#define NOTSET		-1#define BINARY		0#define HEX		1#define LINELENGTH	40#define CHARSTRING	4330#define EEXEC		55665#define MAGIC1		52845#define MAGIC2		22719int	argc;char	**argv;int	mode = DECRYPT;int	input = NOTSET;int	output = NOTSET;int	outoffset = NOTSET;int	inoffset = NOTSET;int	cryptkey = 0;			/* encryption key set with -e */int	linelength = LINELENGTH;	/* only for hex output */int	lastchar = 0;unsigned long	seed = EEXEC;unsigned long	key;FILE	*fp_in = stdin;/*****************************************************************************/main(agc, agv)    int		agc;    char	*agv[];{/* * * Implementation of the encryption/decryption used by eexec and show. * */    argc = agc;    argv = agv;    options();    initialize();    arguments();    exit(0);}   /* End of main *//*****************************************************************************/options(){    int		ch;    char	*names = "bde:l:os:xBSX";    extern char	*optarg;    extern int	optind;/* * * Command line options. * */    while ( (ch = getopt(argc, argv, names)) != EOF )	switch ( ch ) {	    case 'b':			/* binary input */		    input = BINARY;		    break;	    case 'd':			/* decrypt */		    mode = DECRYPT;		    break;	    case 'e':			/* encrypt */		    mode = ENCRYPT;		    if ( *optarg == '0' && *optarg == 'x' )			optarg += 2;		    sscanf(optarg, "%8x", &cryptkey);		    break;	    case 'l':			/* line length hex output */		    linelength = atoi(optarg);		    break;	    case 'o':			/* output all bytes - debugging */		    outoffset = 0;		    break;	    case 's':			/* seed */		    if ( *optarg == 'e' )			seed = EEXEC;		    else if ( *optarg == 's' )			seed = CHARSTRING;		    else if ( *optarg == '0' && *(optarg+1) == 'x' )			sscanf(optarg+2, "%x", &seed);		    else if ( *optarg == '0' )			sscanf(optarg, "%o", &seed);		    else sscanf(optarg, "%d", &seed);		    break;	    case 'x':			/* hex input */		    input = HEX;		    break;	    case 'B':			/* binary output */		    output = BINARY;		    break;	    case 'X':			/* hex output */		    output = HEX;		    break;	    case '?':			/* don't understand the option */		    fprintf(stderr, "bad option -%c\n", ch);		    exit(1);		    break;	    default:			/* don't know what to do for ch */		    fprintf(stderr, "missing case for option -%c\n", ch);		    exit(1);		    break;	}   /* End switch */    argc -= optind;			/* get ready for non-option args */    argv += optind;}   /* End of options *//*****************************************************************************/initialize(){/* * * Initialization that has to be done after the options. * */    key = seed;    if ( mode == DECRYPT ) {	input = (input == NOTSET) ? HEX : input;	output = (output == NOTSET) ? BINARY : output;	inoffset = (inoffset == NOTSET) ? 0 : inoffset;	outoffset = (outoffset == NOTSET) ? -4 : outoffset;    } else {	input = (input == NOTSET) ? BINARY : input;	output = (output == NOTSET) ? HEX : output;	inoffset = (inoffset == NOTSET) ? 4 : inoffset;	outoffset = (outoffset == NOTSET) ? 0 : outoffset;    }	/* End else */    if ( linelength <= 0 )	linelength = LINELENGTH;}   /* End of initialize *//*****************************************************************************/arguments(){/* * * Everything left is an input file. No arguments or '-' means stdin. * */    if ( argc < 1 )	crypt();    else	while ( argc > 0 ) {	    if ( strcmp(*argv, "-") == 0 )		fp_in = stdin;	    else if ( (fp_in = fopen(*argv, "r")) == NULL ) {		fprintf(stderr, "can't open %s\n", *argv);		exit(1);	    }	/* End if */	    crypt();	    if ( fp_in != stdin )		fclose(fp_in);	    argc--;	    argv++;	}   /* End while */}   /* End of arguments *//*****************************************************************************/crypt(){    unsigned int	cypher;    unsigned int	clear;/* * * Runs the encryption/decryption algorithm. * */    while ( lastchar != EOF ) {	cypher = nextbyte();	clear = ((key >> 8) ^ cypher) & 0xFF;	key = (key + (mode == DECRYPT ? cypher : clear)) * MAGIC1 + MAGIC2;	if ( ++outoffset > 0 && lastchar != EOF ) {	    if ( output == HEX ) {		printf("%.2X", clear);		if ( linelength > 0 && (outoffset % linelength) == 0 )		    putchar('\n');	    } else putchar(clear);	}   /* End if */    }	/* End while */}   /* End of crypt *//*****************************************************************************/nextbyte(){    int		val = EOF;/* * * Returns the next byte. Uses cryptkey (i.e. what followed -e) while inoffset is * positive, otherwise reads (hex or binary) from fp_in. * */    if ( inoffset-- > 0 )	val = (cryptkey >> (inoffset*8)) & 0xFF;    else if ( input == HEX ) {	if ( (val = nexthexchar()) != EOF )	    val = (val << 4) | nexthexchar();    } else if ( input == BINARY )	val = Getc(fp_in);    return(val);}   /* End of nextbyte *//*****************************************************************************/nexthexchar(){    int		ch;/* * * Reads the next hex character. * */    while ( (ch = Getc(fp_in)) != EOF && ! isxdigit(ch) ) ;    if ( isdigit(ch) )	ch -= '0';    else if ( isupper(ch) )	ch -= 'A' - 10;    else if ( islower(ch) )	ch -= 'a' - 10;    return(ch);}   /* End of nexthexchar *//*****************************************************************************/Getc(fp)    FILE	*fp;{/* * * Reads the next byte from *fp, sets lastchar, and returns the character. * */    return(lastchar = getc(fp));}   /* End of Getc *//*****************************************************************************/

⌨️ 快捷键说明

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