刚刚开始学习用OD,反编译学到的一个简单的加密/解密程序,希望可以得到邀请码,谢谢
程序如下:
#include"iostream.h"
#include"string.h"
#include"fstream.h"
#include"stdlib.h"
#include"math.h"
int charToInt(char c)
//取一个字符的整数值
{
return int(c) & 0x000000ff;
}
int loadfile(char *ifile,char *buffer)
//加载文件
{
ifstream fi;//文件
int fsize;//文件大小
fi.open(ifile,ios::binary); //二进制方式打开文件
fi.seekg(0,ios::end); // 把文件指针到尾部
fsize=fi.tellg(); // 获得文件字节数
fi.seekg(0,ios::beg);//把文件指针到文件头
fi.read(buffer,fsize);
fi.close();
return fsize;
}
void savefile(char *ofile,char *buffer,int len)
//保存文件
{
ofstream fo;
fo.open(ofile,ios::binary);
fo.write(buffer,len);
fo.close();
}
void initcode(char *ooff,char *keyrange,int len,char *key)
//初始化加密数组
/*
先用0到255的整数填充大小为256的ooff数组,
再用密钥循环填充大小为256的keyrange数组,
取每一个ooff和keyrange的值来确定一个序号,
将ooff当前序号(k)对应的字符与计算出的序号的字符互换
*/
{
for (int k=0;k<len;k++)
//0到255
{
ooff[k]=k;
}
int t=strlen(key);//密钥长
for (k=0;k<len/t;k++)
//用密钥循环负值
{
for (int j=0;j<t;j++)
{
keyrange[k*t+j]=key[j];
}
}
//-----------------------------------
int oaddr=0;//ooff的序号
int kaddr=0;//keyrange的序号
int result=0;//计算结果初值
char ctmp;//临时字符
for (k=0;k<256;k++)
{
oaddr=k;
result+=charToInt(ooff[k]);
result+=charToInt(keyrange[k]);
result=result % 256;
result++;
//先计算出一个序号
ctmp=charToInt(ooff[k]);
ooff[k]=charToInt(ooff[result-1]);
ooff[result-1]=ctmp;//当前k位置的字符与计算出的位置的字符进行互换
}
}
void convertIT(char *ooff,char *buffer,int len)
/*
先确定ooff中的两个字符,并互换位置,
根据这两个字符的值来求得一个用来加密/解密的字符,
*/
{
int i=0,index1=0,index2=0,index_text,ctmp,result=0;
//i循环序号,index1,index2要互换的两个位置,index_text用于加密/解密的字符位置
//ctmp临时字符
for (i=0;i<len;i++)
{
result=(index1+1)%256;
index1=++result;
result=index2;
result+=charToInt(ooff[index1-1]);
result=result % 256;
index2=++result;
//通过ooff的index1字符的值确定index2
ctmp=charToInt(ooff[index1-1]);
ooff[index1-1]=ooff[index2-1];
ooff[index2-1]=ctmp;
//互换index1和index2对应的字符
ctmp=charToInt(ooff[index2-1]);
result=ctmp % 256;
ctmp=charToInt(ooff[index1-1]);
result+=ctmp % 256;
result=result++ % 256;
index_text=result;
//index1和index2对应字符的值相加后得到一个关键的位置index_text
ctmp=charToInt(ooff[index_text-1]);
buffer[i]=charToInt(buffer[i])^ctmp;//进行加密/解密
}
}
void main()
{
ofstream fo;
ifstream fi;
int flen;
char buffer[8192];
char ooff[256];
char keyrange[256];
char *key="commoo";
for (;;)
{
char choice;
cout<<"选择操作:1 加密;2 解密"<<endl;
cin>>choice;
system("cls");
if (choice=='2')
{
flen=loadfile("text2.txt",buffer);
initcode(ooff,keyrange,256,key);
convertIT(ooff,buffer,flen);
savefile("text1.txt",buffer,flen);
break;
}
else if (choice=='1')
{
flen=loadfile("text1.txt",buffer);
initcode(ooff,keyrange,256,key);
convertIT(ooff,buffer,flen);
savefile("text2.txt",buffer,flen);
break;
}
}
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课