CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

c中字符串加密解密的问题

楼主njczm(njczm)2002-09-30 16:52:19 在 C++ Builder / 基础类 提问

本人在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

相关问题

  • 在winform中加密解密一个字符串用什麽方法??
  • 一个字符串加密解密程序(Delphi版),谁能将他翻译成C++Builder版?
  • [求救]php中有没有简单的可以对字符串加密解密的函数?
  • 我要字符串加密解密源代码!
  • 跪求!!!字符串加密解密函数
  • 请教如何加密解密字符串
  • 如何对字符串加密解密?(des,md5等等都可以)
  • 有没有这样的字符串加密解密算法!
  • 关于C#中字符串的问题。
  • C中能否声明字符串?

关键词

  • 解密
  • 字符串
  • cdest
  • csrc
  • xf
  • strlen
  • 长度
  • memset
  • strcpy
  • malloc

得分解答快速导航

  • 帖主:njczm
  • dxkh
  • CCLIS

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo