c中字符串加密解密的问题
本人在csdn上看到一个cb写的字符串加密解密的例子,我将他用c写了。但是解密时有时正确,有时错误(结尾显示乱码)源代码如下(还望高手指点):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Encrypt(char* cSrc,char* cDest)
{
char c;
int i,h,l,j=0;
char *test;
test=(char *)malloc(strlen(cSrc)*2+1);
memset(test,0,strlen(cSrc)/2 +1);
for (i=0;i<(int)strlen(cSrc);i++)
{
c=cSrc[i];
h=(c>>4)&0xf; /* 高4位*/
l=c&0xf; /* 低4位*/
test[j]=h;
test[j+1]=l;
j+=2;
}
strcpy(cDest,test);
free(test);
return 0;
}
Decrypt(char* cSrc,char* cDest)
{
int i,h,l,m,n,j=0;
char* test;
test=(char*)malloc(strlen(cSrc)/2 +1);
memset(test,0,strlen(cSrc)/2 +1);
for (i=0;i<(int)strlen(cSrc);i=i+2)
{
h=(cSrc[i]);
l=(cSrc[i+1]);
m=(h<<4);
n=(l&0xf);
test[j]=m + n;
j++;
}
strcpy(cDest,test);
free(test);
return 0;
}
main(int argc, char *argv[])
{
char dest1[128]="\0";
char dest2[128]="\0";
char src[128]="\0";
printf("请输入源字符串:");
scanf("%s",src);
Encrypt(src,dest1);
printf("加密后的字符串为:%s\n",dest1);
Decrypt(dest1,dest2);
printf("还原后的字符串为:%s\n",dest2);
printf("长度为:%d\n",strlen(dest2));
return 0;
}
问题点数:10、回复次数:6Top
1 楼95533(鼠标垫)回复于 2002-09-30 17:01:45 得分 0
test=(char*)malloc(strlen(cSrc)/2 +1);
换成:
test=(char*)malloc(sizeof(cSrc)/2 +1);
试试!Top
2 楼njczm(njczm)回复于 2002-09-30 17:10:08 得分 0
还是不行:显示如下
请输入源字符串:1234567890
加密后的字符串为:[ ]
还原后的字符串为:[1234567890%襗
长度为:[14]Top
3 楼hjhwfw(wfw)回复于 2002-09-30 17:45:47 得分 0
njczm (njczm) 能否给我bcb中字符串的加密解密的程序??谢了!!Top
4 楼dxkh(沧海一粟)回复于 2002-09-30 18:29:08 得分 5
for (i=0;i<(int)strlen(cSrc);i=i+2)
{
h=(cSrc[i]);
l=(cSrc[i+1]);
m=(h<<4);
n=(l&0xf);
test[j]=m + n;
j++;
}
test[j]='\0'; // 字符串结束标记
strcpy(cDest,test);
Top
5 楼CCLIS(www.cclis.com)回复于 2002-09-30 19:00:02 得分 5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Encrypt(char* cSrc,char* cDest)
{
char c;
int i,h,l,j=0;
char *test;
test=(char *)malloc(strlen(cSrc)*2+1);
memset(test,0,strlen(cSrc)/2 +1); //此处l未赋值即使用,会有不可预料后果。
for (i=0;i<(int)strlen(cSrc);i++)
{
c=cSrc[i];
h=(c>>4)&0xf; /* 高4位*/
l=c&0xf; /* 低4位*/
test[j]=h;
test[j+1]=l;
// 难以保证h,l都不是零,如果h或者l等于0,则在后面的strcpy中会提前结束字符串。
j+=2;
}
strcpy(cDest,test); // 因为上面的错误,难以保证字符串的长度。
free(test);
return 0;
}
解密串时有相似的错误。
可以使用类似PAS程序的方式来设定字符串的长度,即字符串的第一个字节中存放字符串的长度。
Top
6 楼njczm(njczm)回复于 2002-10-08 10:03:44 得分 0
抱歉,因为国庆休息没有上网,谢谢各位的参与!现在问题已经解决!
To:hjhwfw(wfw)bcb中如此写(我也是照抄)
String __fastcall TForm1::JiaMie(String s)//加密
{
String j="";
for (int i=1;i<=s.Length();i++)
{
char c=s[i];
int h=(c>>4)&0xf;
int l=c&0xf;
j=j+(char)('a'+h)+(char)('a'+l);
}
return(j);
}
String __fastcall TForm1::JieMie(String s)//解密
{
String j="";
for (int i=1;i<=s.Length();i=i+2)
{
int h=(s[i]-'a');
int l=(s[i+1]-'a');
char c=(h<<4)+(l&0xf);
j=j+c;
}
return(j);
}
主要原因是1:结尾未加'\0'
2:一个字符分解为2个后,应该每个后面加上一个常量,以避免出现字符为0的情况
Encrypt(char* cSrc,char* cDest)
{
char c;
int i,h,l,j=0;
for (i=0;i<(int)strlen(cSrc);i++)
{
c=cSrc[i];
h=(c>>4)&0xf;
l=c&0xf;
cDest[j]=h+'x';
cDest[j+1]=l+'z';
j+=2;
}
cDest[j]='\0';
return 0;
}
Decrypt(char* cSrc,char* cDest)
{
int i,h,l,m,n,j=0;
for (i=0;i<(int)strlen(cSrc);i=i+2)
{
h=(cSrc[i]-'x');
l=(cSrc[i+1]-'z');
m=(h<<4);
n=(l&0xf);
cDest[j]=m + n;
j++;
}
cDest[j]='\0';
return 0;
}
Top




