中文字符加密解密

fiyaa 2009-06-10 12:57:46
wxdev编译器
控制台程序

#include <iostream>
#include <fstream>




using namespace std;

#ifdef WIN32
#define IN_FILE "c:\\code.txt"
#define OUT_FILE "c:\\decode.txt"
#else
#define IN_FILE "/tmp/code.txt"
#define OUT_FILE "/tmp/decode.txt"
#endif

using namespace std;

void get()
{
ifstream ifs(IN_FILE);
ofstream ofs(OUT_FILE);
//while (ifs.good()) cout << (char) ifs.get();//simple
while (!ifs.eof())
{
char ch = 0;
//ch = ifs.get();
ifs.get(ch);
ch=ch<<1; //or ch=ch*2+5 //or ch=ch+5000
ofs.write(&ch,sizeof(char));

// cout << ch;
}
ifs.close();
}

/*void getline()
{
//ifstream ifs;
//ifs.open(TEST_FILE);
ifstream ifs(IN_FILE);
while (ifs.good())
{
char buf[1024] =
{
0
};
ifs.getline(buf, sizeof(buf));
cout << buf << endl;

}
*/

ifs.close();
}

int main(int argc, char *argv[])
{
get();
//getline();
system("PAUSE");
return EXIT_SUCCESS;
}

想做一个简单的加密解密程序,加密就是把中文字符移一下位或都加乘一个数,解密就是在移回来...
做了半天,不行,加密后成为乱码,但无法解密...
或只能解密一部分,网上找了半天,好像是和字符的编码有关系...哪位牛人指条明路帮帮忙吧...



...全文
190 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouzhipen 2009-06-10
  • 打赏
  • 举报
回复
ch=ch < <1; //or ch=ch*2+5
移位:数据据丢了一位
*可以能造成数据溢出,丢失数据.
如果一定要用移位那就来点牛的.


#include <stdio.h>
#include <stdlib.h>

#ifdef WIN32
#define IN_FILE "c:\\code.txt"
#define OUT_FILE "c:\\decode.txt"
#else
#define IN_FILE "/tmp/code.txt"
#define OUT_FILE "/tmp/decode.txt"
#endif

void get()
{
FILE *ifp=fopen(IN_FILE,"rb");
FILE *ofp=fopen(OUT_FILE,"wb");

fseek(ifp,0,SEEK_END);
long int ifl=ftell(ifp);
fseek(ifp,0,SEEK_SET);
char ch=0;
unsigned int ich=0;
for(long int i=0;i<ifl;i++)
{
fread(&ch,1,1,ifp);
ich=ch;
ich=((ich<<2)+0x12);
fwrite(&ich,sizeof(ich),1,ofp);
}
fclose(ifp);
fclose(ofp);
}

void getline()
{
FILE *ofp=fopen(IN_FILE,"wb");
FILE *ifp=fopen(OUT_FILE,"rb");

fseek(ifp,0,SEEK_END);
long int ifl=ftell(ifp)/sizeof(unsigned int);
fseek(ifp,0,SEEK_SET);
char ch=0;
unsigned int ich=0;
for(long int i=0;i<ifl;i++)
{
fread(&ich,sizeof(ich),1,ifp);
ch=(char)((ich-0x12)>>2);
fwrite(&ch,1,1,ofp);
}
fclose(ifp);
fclose(ofp);
}

int main(int argc, char *argv[])
{
get();
// getline();
return 0;
}


本段代码绝对可行.可实现加解密文本文件,一定要是文本文件.
机智的呆呆 2009-06-10
  • 打赏
  • 举报
回复
学习 up~~
killbug2004 2009-06-10
  • 打赏
  • 举报
回复
常用的加密配对指令还有xor/xor add/sub inc/dec rol/ror
ltc_mouse 2009-06-10
  • 打赏
  • 举报
回复
用移位的话,可以考虑循环移位~
lambert_s 2009-06-10
  • 打赏
  • 举报
回复
楼上正解,你解密的时候右移回来,最高的一位加密时左移丢失了,所以解密就出问题了
建议用异或的方法,密码学很多的加密算法,例如:DES,AES都大量使用了异或,不但加解密
还原方便,而且效率也很高!
majun01 2009-06-10
  • 打赏
  • 举报
回复
ch=ch<<1;这句话会导致字符的最高位数据丢失,从而使字符无法再还原。

其实不用移位,可以试一试通过字符“异或”的方式来对字符“加密”。
写了个小例子如下:
#include <iostream> 
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
{
char ch='g';//将要加密的字符
cout<<ch<<endl;

char ghx=0x0b;//加密码

ch=ch^ghx;//加密
cout<<ch<<endl;

ch=ch^ghx;//解密
cout<<ch<<endl;

return 0;
}

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧