📄 main.cpp.txt
字号:
/*
基于模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 + -