- 论坛徽章:
- 0
|
很巧合,昨天业有人发了同样的帖子。
不过我认为我的算法安全性比他的好
其实我也是编程菜鸟
算法特性就不想多说了(打字慢手),只是有一个很重要的点就是同样的数据每次加密得到的密文都是不同的,除非随机产生的密钥......
而且不同的密码密钥隐藏在密文中的位置也不一样。
高手请指点一二
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- #include <stdlib.h>
- #include <time.h>
- #ifndef _RDEA_CPP_
- #define _RDEA_CPP_
- #define BYTE unsigned char
- #define NUM unsigned
- class Ckey {
- private:
- BYTE key[32];
- NUM GetOffset(void);
- public:
- Ckey(char*);
- BYTE *Encrypt(char*,NUM);
- BYTE *Decrypt(char*,NUM);
- };
- Ckey::Ckey(char *InputKey){
- NUM i;
- for(i=0;i<32;i++){
- if ((*InputKey)!=0) {
- key[i]=(BYTE)(*InputKey++);
- }else{
- key[i]=0;
- }
- }
- }
-
- BYTE *Ckey::Encrypt(char *text,NUM size){
- BYTE RandomKey[32],*Codec;
- NUM i,Offset;
- srand((NUM)time(NULL));
-
- for(i=0;i<32;i++){
- RandomKey[i]=rand()%256;
- }
-
- if (text==NULL) {
- return 0;
- }
-
- Codec = new BYTE[32+size];
- Offset=((size-1)*(GetOffset()-1))%(size);
-
- for(i=0;i<31+size;i++){
- if (i<Offset) {
- if (RandomKey[i%32]%2==1) {
- Codec[i]=(BYTE)text[i]^RandomKey[i%32];
- }else{
- Codec[i]=(BYTE)text[i]^key[i%32];
- }
- }else if(i>=Offset+32){
- if (RandomKey[i%32]%2==1) {
- Codec[i]=(BYTE)text[i-32]^RandomKey[i%32];
- }else{
- Codec[i]=(BYTE)text[i-32]^key[i%32];
- }
- }else{
- Codec[i]=RandomKey[i-Offset]^key[i-Offset];
- }
- }
-
- Codec[size+31]='\0';
-
- return Codec;
- }
- BYTE *Ckey::Decrypt(char *Codec,NUM size){
- BYTE RandomKey[32],*text;
- NUM i,Offset,;
-
- if (size<32||Codec==NULL) {
- return NULL;
- }
-
- text=new BYTE[size-32];
- Offset=((size-33)*(GetOffset()-1))%(size-32);
-
- for(i=0;i<size-1;i++){
- if ((Offset<=i)&&(i<Offset+32)){
- RandomKey[i-Offset]=(BYTE)Codec[i]^key[i-Offset];
- }
- }
-
- for(i=0;i<size-1;i++){
- if (i<Offset){
- if (RandomKey[i%32]%2==1) {
- text[i]=(BYTE)Codec[i]^RandomKey[i%32];
- }else{
- text[i]=(BYTE)Codec[i]^key[i%32];
- }
- }else if(i>=Offset+32){
- if (RandomKey[i%32]%2==1) {
- text[i-32]=(BYTE)Codec[i]^RandomKey[i%32];
- }else{
- text[i-32]=(BYTE)Codec[i]^key[i%32];
- }
- }
- }
-
- text[size-33]='\0';
-
- return text;
- }
- NUM Ckey::GetOffset(){
- NUM i,Offset;
-
- for(i=0,Offset=0;i<32;i++)
- Offset+=key[i];
-
- for(i=0;i<16;i++)
- Offset+=key[i*2]^key[i*2+1];
-
- for(i=0;i<8;i++)
- Offset+=(key[i*4]&key[i*4+1])
- ^(key[i*4+2]&key[i*4+3]);
-
- for(i=0;i<4;i++)
- Offset+=((key[i*8]|key[i*8+1])
- &(key[i*8+2]|key[i*8]+3))
- ^((key[i*8+4]|key[i*8+5])
- &(key[i*8+6]|key[i*8+7]));
-
- return Offset;
- }
- #undef BYTE
- #undef NUM
- #endif
- #define _DEBUG_
- /**********************************For Debug**************************************/
- #ifdef _DEBUG_
- #include <iostream.h>
- int main(){
- Ckey ckey("1234567890123456789012345678901");
- char *a="this is a program written by THYNSON.it is use for encrypt or decrypt data.";
- unsigned len=strlen(a)+1,i;
- char *b,*c;
-
- b=(char*)ckey.Encrypt(a,len);//加密得到密文
- c=(char*)ckey.Decrypt(b,len+32); //解密密文得到明文
-
- cout<<"密文: \n\n";
- for(i=0;i<len+32;i++) cout<<b[i]; //之所以采用循环输出字符方式
- cout<<"\n\n明文: \n\n"; //打出密文是因为加密是可能在
- cout<<c; //某一位产生字符串结束标志,
- cout<<"\n\n"; //导致密文输出与实际不符。
-
- delete []b;
- delete []c;
-
- cin.get();
- cin.get();
- return 0;
- }
- #endif
复制代码
[ 本帖最后由 thynson 于 2007-8-16 09:10 编辑 ] |
|