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

📄 convkeys2.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <mp.h>#include <libsec.h>#include <authsrv.h>#include <bio.h>#include "authcmdlib.h"char	authkey[DESKEYLEN];int	verb;int	usepass;int	convert(char*, char*, char*, int);int	dofcrypt(int, char*, char*, int);void	usage(void);void	randombytes(uchar*, int);voidmain(int argc, char *argv[]){	Dir *d;	char *p, *np, *file, key[DESKEYLEN];	int fd, len;	ARGBEGIN{	case 'v':		verb = 1;		break;	case 'p':		usepass = 1;		break;	default:		usage();	}ARGEND	if(argc != 1)		usage();	file = argv[0];	/* get original key */	if(usepass){		print("enter password file is encoded with\n");		getpass(authkey, nil, 0, 1);	} else		getauthkey(authkey);	print("enter password to reencode with\n");	getpass(key, nil, 0, 1);	fd = open(file, ORDWR);	if(fd < 0)		error("can't open %s: %r\n", file);	d = dirfstat(fd);	if(d == nil)		error("can't stat %s: %r\n", file);	len = d->length;	p = malloc(len);	if(!p)		error("out of memory");	np = malloc((len/OKEYDBLEN)*KEYDBLEN + KEYDBOFF);	if(!np)		error("out of memory");	if(read(fd, p, len) != len)		error("can't read key file: %r\n");	len = convert(p, np, key, len);	if(verb)		exits(0);	if(pwrite(fd, np, len, 0) != len)		error("can't write key file: %r\n");	close(fd);	exits(0);}voidoldCBCencrypt(char *key7, char *p, int len){	uchar ivec[8];	uchar key[8];	DESstate s;	memset(ivec, 0, 8);	des56to64((uchar*)key7, key);	setupDESstate(&s, key, ivec);	desCBCencrypt((uchar*)p, len, &s);}intconvert(char *p, char *np, char *key, int len){	int i, off, noff;	if(len % OKEYDBLEN)		fprint(2, "convkeys2: file odd length; not converting %d bytes\n",			len % KEYDBLEN);	len /= OKEYDBLEN;	for(i = 0; i < len; i ++){		off = i*OKEYDBLEN;		noff = KEYDBOFF+i*(KEYDBLEN);		decrypt(authkey, &p[off], OKEYDBLEN);		memmove(&np[noff], &p[off], OKEYDBLEN);		memset(&np[noff-SECRETLEN], 0, SECRETLEN);		if(verb)			print("%s\n", &p[off]);	}	randombytes((uchar*)np, KEYDBOFF);	len = (len*KEYDBLEN) + KEYDBOFF;	oldCBCencrypt(key, np, len);	return len;}voidusage(void){	fprint(2, "usage: convkeys2 keyfile\n");	exits("usage");}voidrandombytes(uchar *p, int len){	int i, fd;	fd = open("/dev/random", OREAD);	if(fd < 0){		fprint(2, "convkeys2: can't open /dev/random, using rand()\n");		srand(time(0));		for(i = 0; i < len; i++)			p[i] = rand();		return;	}	read(fd, p, len);	close(fd);}

⌨️ 快捷键说明

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