首页
社区
课程
招聘
[原创]可变加密函数
发表于: 2008-3-29 00:04 5515

[原创]可变加密函数

2008-3-29 00:04
5515

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//#include <unistd.h>
//#include <sys/types.h>
//#include <sys/stat.h>
//#include <fcntl.h>
//#include <sys/time.h>
//#include <errno.h>
#include <stdarg.h>
//#include "Encrypt.h"

/*
*特点:无法解密,比MD5...强。不怕碰撞.
*返回:加密后的字符串
*取得字节的高4位,与低四位(一个0xD6D0==中,GB2312简体中文编码表.
*可以拆分转换成0x0D,0X06,0X0D,0X00).然后进行跳变替换.
*/
char *NZ50(char *str,...)
{
unsigned int i,j,jlen,slen,arglen;
char *copystr,*argvalue;
/*修改字符,可加强密码破解难度*/
char confidential[32]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','^','&','^',0x00};
slen=strlen(str);copystr=(char*)malloc(slen);
//复制str+初始化
for(j=0;j<slen;j++)copystr[j]=str[j];
/*提高强度*/
if(slen<16)
        {
                for(;j<slen && j<32;j++)copystr[j]=confidential[j];
        }
        copystr[j]=0x00;
/*计算参数的总数*/
for(j=0,arglen=0;j<slen;j++){if(str[j]=='%' && str[j+1]=='s'){arglen++;j++;}}
//先用参数进行加密
if(arglen>0)
{
va_list args;
va_start(args,arglen);
for(i=0;i<arglen;i++)
{
argvalue=va_arg(args,char*);
jlen=strlen(argvalue);
        for(j=0;j<jlen;j++)
                {
                        //EncryptAlgorithm(confidential,argvalue[j],j);
                }
}
va_end(args);
}

for(j=0;j<slen;j++)
{
        //EncryptAlgorithm(confidential,copystr[j],j);
}
printf("%s\n",confidential);//这里都正常了可是
free(copystr);
return confidential;
}

int main()
{
        //char *rrr="0000";
        char *rrr=NZ50("123456");
        int rlen=strlen(rrr);
        printf("=%s=\n",rrr);//这里为什么就是乱码了。
        putchar('-');
        for(int i=0;i<rlen;i++)putchar(rrr[i]);
        putchar('-');
}

哪里内存有没有控制好,晕了。
以上代码可以编译。帮忙调试下吧。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
confidential为临时变量,直接返回当然会出问题
2008-3-29 00:15
0
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PFC
3
我写过其他函数都可以的,但这个为什么不行,还有我试过用malloc分配不过只显示一半 。就有点晕了。
2008-3-29 09:22
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
4
主要问题出在这里。
slen=strlen(str);
copystr=(char*)malloc(slen);
在这里malloc申请内存,由于你还要保存字符串的结束符\0,因此在这里必须要多申请出一个字节来,
不然会产生堆溢出。

你把这句修改成copystr=(char*)malloc(slen + 1);
2008-3-29 09:42
0
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PFC
5
谢谢了。问题已解决了。

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

/*修改字符,可加强密码破解难度直接放全局去了*/
char confidential[32]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','^','&','^',0x00};

/*
*特点:无法解密,比MD5...强。不怕碰撞.
*返回:加密后的字符串
*取得字节的高4位,与低四位(一个0xD6D0==中,GB2312简体中文编码表.
*可以拆分转换成0x0D,0X06,0X0D,0X00).然后进行跳变替换.
*/
char *NZ50(char *str,...)
{
unsigned int i,j,jlen,slen,arglen;
char *copystr,*argvalue;

slen=strlen(str);copystr=(char*)malloc(slen+1);
//复制str+初始化
for(j=0;j<slen;j++)copystr[j]=str[j];
/*提高强度*/
if(slen<16)
  {
    for(;j<slen && j<32;j++)copystr[j]=confidential[j];
  }
  copystr[j]=0x00;
/*计算参数的总数*/
for(j=0,arglen=0;j<slen;j++){if(str[j]=='%' && str[j+1]=='s'){arglen++;j++;}}
//先用参数进行加密
if(arglen>0)
{
va_list args;
va_start(args,arglen);
for(i=0;i<arglen;i++)
{
argvalue=va_arg(args,char*);
jlen=strlen(argvalue);
  for(j=0;j<jlen;j++)
    {
      //EncryptAlgorithm(confidential,argvalue[j],j);
    }
}
va_end(args);
}

for(j=0;j<slen;j++)
{
  //EncryptAlgorithm(confidential,copystr[j],j);
}
printf("%s\n",confidential);//这里都正常了可是
free(copystr);
return confidential;
}

int main()
{
  //char *rrr="0000";
  char *rrr=NZ50("123456");
  int rlen=strlen(rrr);
  printf("=%s=\n",rrr);//这里为什么就是乱码了。
  putchar('-');
  for(int i=0;i<rlen;i++)putchar(rrr[i]);
  putchar('-');
}

以前编译过的都不会,不知道这次什么问题。会不会和CPU有关。我是AMD的!大家公测下吧
2008-3-29 09:56
0
游客
登录 | 注册 方可回帖
返回
//