首页
社区
课程
招聘
[旧帖] [邀请码已发][原创]一个简单加密/解密程序(申请邀请码) 0.00雪花
发表于: 2009-6-21 14:47 1495

[旧帖] [邀请码已发][原创]一个简单加密/解密程序(申请邀请码) 0.00雪花

2009-6-21 14:47
1495
刚刚开始学习用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;
  }
}  
}

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 55
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
嗯,学习了。
最近研究游戏破解的时候,发现其实使用一种容易解密但是很难加密的算法是非常有效的。因为解密过程只要通过反汇编谁都能看懂。而加密过程是反汇编看不出来的。比如我看到一个游戏的所有资源全部使用的RSA加密……
2009-6-22 09:32
0
雪    币: 74
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
资源文件都全RSA加密那加载应该比较慢吧,一般都是加密传送的少量数据
2009-6-22 14:23
0
雪    币: 55
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
那游戏我没玩过,只是看到每个文件全都对应着一个sig密钥文件,连DLL都有……里面的确是RSA的128位密钥……不过也可能不是加密整个文件……
2009-6-22 20:06
0
雪    币: 74
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
转正了,非常感谢!!
2009-7-21 22:19
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习了,唉我也想转正。
2010-2-28 18:27
0
游客
登录 | 注册 方可回帖
返回
//