免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2043 | 回复: 3
打印 上一主题 下一主题

[算法] 大家看看我的加密算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-15 21:33 |只看该作者 |倒序浏览
很巧合,昨天业有人发了同样的帖子。
不过我认为我的算法安全性比他的好
其实我也是编程菜鸟
算法特性就不想多说了(打字慢手),只是有一个很重要的点就是同样的数据每次加密得到的密文都是不同的,除非随机产生的密钥......
而且不同的密码密钥隐藏在密文中的位置也不一样。
高手请指点一二
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  1. #include <stdlib.h>
  2. #include <time.h>



  3. #ifndef _RDEA_CPP_

  4. #define _RDEA_CPP_


  5. #define BYTE unsigned char
  6. #define NUM unsigned

  7. class Ckey  {
  8.         private:
  9.         BYTE key[32];
  10.         NUM GetOffset(void);
  11.         public:
  12.         Ckey(char*);
  13.         BYTE *Encrypt(char*,NUM);
  14.         BYTE *Decrypt(char*,NUM);
  15. };

  16. Ckey::Ckey(char *InputKey){
  17.         NUM i;

  18.         for(i=0;i<32;i++){
  19.         if ((*InputKey)!=0) {
  20.             key[i]=(BYTE)(*InputKey++);
  21.         }else{
  22.             key[i]=0;
  23.         }
  24.     }
  25. }
  26.             
  27. BYTE *Ckey::Encrypt(char *text,NUM size){                                                
  28.     BYTE RandomKey[32],*Codec;                   
  29.     NUM i,Offset;
  30.     srand((NUM)time(NULL));
  31.    
  32.     for(i=0;i<32;i++){
  33.         RandomKey[i]=rand()%256;
  34.     }
  35.    
  36.     if (text==NULL) {        
  37.         return 0;
  38.     }
  39.    
  40.     Codec = new BYTE[32+size];
  41.     Offset=((size-1)*(GetOffset()-1))%(size);
  42.      
  43.     for(i=0;i<31+size;i++){        
  44.         if (i<Offset) {            
  45.             if (RandomKey[i%32]%2==1) {               
  46.                 Codec[i]=(BYTE)text[i]^RandomKey[i%32];               
  47.             }else{               
  48.                 Codec[i]=(BYTE)text[i]^key[i%32];               
  49.             }            
  50.         }else if(i>=Offset+32){            
  51.             if (RandomKey[i%32]%2==1) {               
  52.                 Codec[i]=(BYTE)text[i-32]^RandomKey[i%32];
  53.             }else{
  54.                 Codec[i]=(BYTE)text[i-32]^key[i%32];
  55.             }
  56.         }else{
  57.             Codec[i]=RandomKey[i-Offset]^key[i-Offset];
  58.         }  
  59.     }
  60.    
  61.     Codec[size+31]='\0';
  62.    
  63.     return Codec;
  64. }

  65. BYTE *Ckey::Decrypt(char *Codec,NUM size){
  66.     BYTE RandomKey[32],*text;
  67.     NUM i,Offset,;                                
  68.    
  69.     if (size<32||Codec==NULL) {        
  70.         return NULL;
  71.     }
  72.    
  73.     text=new BYTE[size-32];   
  74.     Offset=((size-33)*(GetOffset()-1))%(size-32);
  75.    
  76.     for(i=0;i<size-1;i++){        
  77.         if ((Offset<=i)&&(i<Offset+32)){            
  78.             RandomKey[i-Offset]=(BYTE)Codec[i]^key[i-Offset];
  79.         }
  80.     }
  81.    
  82.     for(i=0;i<size-1;i++){        
  83.         if (i<Offset){            
  84.             if (RandomKey[i%32]%2==1) {               
  85.                 text[i]=(BYTE)Codec[i]^RandomKey[i%32];               
  86.             }else{               
  87.                 text[i]=(BYTE)Codec[i]^key[i%32];
  88.             }            
  89.         }else if(i>=Offset+32){            
  90.             if (RandomKey[i%32]%2==1) {               
  91.                 text[i-32]=(BYTE)Codec[i]^RandomKey[i%32];               
  92.             }else{               
  93.                 text[i-32]=(BYTE)Codec[i]^key[i%32];
  94.             }
  95.         }
  96.     }
  97.    
  98.     text[size-33]='\0';
  99.    
  100.     return text;
  101. }

  102. NUM Ckey::GetOffset(){
  103.     NUM i,Offset;
  104.    
  105.     for(i=0,Offset=0;i<32;i++)
  106.         Offset+=key[i];
  107.         
  108.     for(i=0;i<16;i++)
  109.         Offset+=key[i*2]^key[i*2+1];
  110.         
  111.     for(i=0;i<8;i++)
  112.         Offset+=(key[i*4]&key[i*4+1])
  113.                         ^(key[i*4+2]&key[i*4+3]);
  114.                        
  115.     for(i=0;i<4;i++)
  116.         Offset+=((key[i*8]|key[i*8+1])
  117.                 &(key[i*8+2]|key[i*8]+3))
  118.                     ^((key[i*8+4]|key[i*8+5])
  119.                     &(key[i*8+6]|key[i*8+7]));
  120.                    
  121.     return Offset;
  122. }
  123. #undef BYTE
  124. #undef NUM

  125. #endif


  126.       #define _DEBUG_

  127. /**********************************For Debug**************************************/
  128. #ifdef _DEBUG_

  129. #include <iostream.h>

  130. int main(){
  131.         Ckey ckey("1234567890123456789012345678901");
  132.         char *a="this is a program written by THYNSON.it is use for encrypt or decrypt data.";
  133.         unsigned len=strlen(a)+1,i;
  134.         char *b,*c;
  135.        
  136.         b=(char*)ckey.Encrypt(a,len);//加密得到密文   
  137.         c=(char*)ckey.Decrypt(b,len+32);    //解密密文得到明文
  138.    
  139.         cout<<"密文: \n\n";
  140.         for(i=0;i<len+32;i++) cout<<b[i];    //之所以采用循环输出字符方式
  141.         cout<<"\n\n明文: \n\n";            //打出密文是因为加密是可能在   
  142.         cout<<c;                            //某一位产生字符串结束标志,
  143.         cout<<"\n\n";                         //导致密文输出与实际不符。
  144.    
  145.         delete []b;
  146.         delete []c;
  147.    
  148.         cin.get();
  149.         cin.get();
  150.         return 0;
  151. }
  152. #endif
复制代码

[ 本帖最后由 thynson 于 2007-8-16 09:10 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-08-16 06:33 |只看该作者
没仔细看。

1,如果size等于1会怎么样?

2,应该是
delete [] b;
delete [] c;

3,看了函数的定义,就不想用。
像这种全放内存不行的,
C语言一般是一块一块干的,
如果面向对象,建议你看一下java的流的思想。

论坛徽章:
0
3 [报告]
发表于 2007-08-16 09:08 |只看该作者
谁较偶是菜鸟呢,其实自己刚刚从C转到C++面向对象的思想还不成熟
就连语法可能都有问题
已经按你的改过来了

[ 本帖最后由 thynson 于 2007-8-16 09:11 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-08-16 09:09 |只看该作者
原帖由 spibit 于 2007-8-16 06:33 发表
没仔细看。

1,如果size等于1会怎么样?

2,应该是
delete [] b;
delete [] c;

3,看了函数的定义,就不想用。
像这种全放内存不行的,
C语言一般是一块一块干的,
如果面向对象,建议你看一下ja ...

size=1的话就只加密字符串的第一个字节
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP