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

📄 main.cpp

📁 基于二进制模2除法的简单流加解密算法。要求被加密的数据至少8字节
💻 CPP
字号:
/*
基于模2运算的加密解密程序
2005-05-23 pclion
  */
typedef unsigned int uint;
typedef unsigned char byte;

#include <iostream>
#include <string>
#include <memory>
#include <sys/timeb.h>

//size must be >=8 and is 4byte boundary
int encry(byte* src, byte * des, int nsize, int key)
{
	if (nsize<8) return 1;//参数异常

	__asm {
///		push esi;
//		push edi;
		mov esi,src;
		mov edi,des;
		mov eax,[esi];
		add esi,4;

		mov ebx,nsize;
		sub ebx,4;
		mov nsize,ebx;
lp2://preload a dword
		mov edx,[esi];
		add esi,4;
		mov cl,32;
lp1:
		shr edx,1;
		rcr eax,1;
		jnc l1;
		xor eax,key;
		stc;
l1:
		rcr ebx,1;
		dec cl;
		jnz lp1;
		//save result(ebx)
		mov [edi],ebx;
		add edi,4;
		
		mov ebx,nsize;
		sub ebx,4;
		mov nsize,ebx;
		jnz lp2;
		//save remainder
		mov [edi],eax;
//		pop edi;
//		pop esi;
	}
	return 0;//成功
}

//size must be >=8 and is 4byte boundary
int decry(byte* src, byte * des, int nsize, int key)
{
	if (nsize<8) return 1;//参数异常

	__asm {
//		push esi;
//		push edi;
		mov esi,src;
		mov edi,des;
		xor eax,eax;

		mov ebx,nsize;
		sub ebx,4;
		mov nsize,ebx;

lp2://preload a dword
		mov edx,[esi];
		add esi,4;
		mov cl,32;
lp1:
		shr edx,1;
		jnc l10;//
		shr eax,1;//(eax>>1) XOR (key|1),cf->result
		cmc;
		rcr ebx,1;
		xor eax,key;
		jmp l11
l10:
		shr eax,1;//(eax>>1),cf->result
		rcr ebx,1;
l11:
		dec cl;
		jnz lp1;
		//save result(ebx)
		mov [edi],ebx;
		add edi,4;
		
		mov ebx,nsize;
		sub ebx,4;
		mov nsize,ebx;
		jnz lp2;
		
		//remaindar
		xor eax,[esi];
		mov [edi],eax;
///		pop edi;
///		pop esi;
	}
	return 0;//成功
}

//流文件加密
void encrystream(FILE *fs, FILE *fd, int key)
{
byte ibuf[128],obuf[128];
int size,n;

	fseek(fs,0L,SEEK_END);
	size = ftell(fs);
	fseek(fs,0L,SEEK_SET);
	fwrite(&size,sizeof(int),1,fd);//encry file head

	while(!feof(fs)) {
		memset(ibuf,0,128);
		n=fread(ibuf,1,128,fs);
		encry(ibuf,obuf,128,key);
		fwrite(obuf,1,128,fd);
		size-=n;
	}
}

//流文件解密
void decrystream(FILE *fs, FILE *fd, int key)
{
byte ibuf[128],obuf[128];
int size,n;

	fseek(fs,0L,SEEK_SET);
	fread(&size,sizeof(int),1,fs);

	while(!feof(fs) && size>0) {
		memset(ibuf,0,128);
		n=fread(ibuf,1,128,fs);
		decry(ibuf,obuf,128,key);
		if (size<128)
			fwrite(obuf,1,size,fd);
		else
			fwrite(obuf,1,128,fd);
		size-=n;
	}
}


const byte str1[] = "abcdefghijkmn";

main( int argc, char *argv[ ], char *envp[ ] )
{
int key;
int size;
FILE *fs,*fd;
byte ibuf[16],obuf[16];
struct timeb  start, finish;
int d;

	memset(ibuf,0,16);
	memcpy(ibuf,str1,strlen((char*)str1));

	printf("source      : ");
	for (int i=0;i<16;i++)
		printf("%02X ",ibuf[i]);
	printf("\n");
	encry(ibuf,obuf,16,0x81818181);

	printf("encry result: ");
	for (i=0;i<16;i++)
		printf("%02X ",obuf[i]);
	printf("\n");
	decry(obuf,ibuf,16,0x81818181);
	printf("decry result: ");
	for (i=0;i<16;i++)
		printf("%02X ",ibuf[i]);
	printf("\n");



	if (argc<5 || (strcmp(argv[1],"-e")!=0 && strcmp(argv[1],"-d")!=0)) {
		printf("usage: encry -e[|-d] inputfile outputfile password\n");
		printf("-e : encryption\n");
		printf("-d : decryption\n");
		exit(1);
	}

    if ((fs = fopen(argv[2],"rb"))==NULL) {
		printf("source open error\n");
		exit(1);
	}
	if ((fd = fopen(argv[3],"wb"))==NULL) {
		printf("destination open error\n");
		fclose(fs);
		exit(1);
	}

	memset(ibuf,0,16);
	//截断password to <=16 char
	size = __min(16,strlen(argv[4]));
	memcpy(ibuf,argv[4],size);
	size = (size+3) &~3;
	if (size<8) size=8;
	encry(ibuf,obuf,size,0x81818181);
	key = *(int*)(&obuf[size-4]);
	key = (key | 0x80000001) & 0xfffeffff;//避免弱密钥
	printf("key = %08X\n",key);

//计算加解密时间
	ftime( &start );
	if (strcmp(argv[1],"-e")==0) //encryption
		encrystream(fs,fd,key);
	else //decryption
		decrystream(fs,fd,key);

	ftime( &finish );
	d = finish.time*1000 + finish.millitm - (start.time*1000 + start.millitm);
	printf("encry/decry time: %d ms\n",d);
	fclose(fs);
	fclose(fd);
	return 0;
};

⌨️ 快捷键说明

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