Chinaunix首页 | 论坛 | 博客
  • 博客访问: 259409
  • 博文数量: 74
  • 博客积分: 1470
  • 博客等级: 上尉
  • 技术积分: 793
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-25 21:01
文章分类

全部博文(74)

文章存档

2011年(1)

2010年(32)

2009年(32)

2008年(9)

我的朋友

分类: LINUX

2008-12-17 16:05:10

最近由于要对一段要传输的文本进行加密,所以就想到了用linux函数库中自带的加密函数encrypt。但是实际应用中发现还是有一些小问题的,google了一下也没解决,最后总算弄明白了。

man encrypt,看一看:

#define _XOPEN_SOURCE

#include

void setkey(const char *key);


#define _XOPEN_SOURCE

#include

void encrypt(char block[64], int edflag);


These functions encrypt and decrypt 64-bit messages. The setkey()

function sets the key used by encrypt(). The key parameter used here

is an array of 64 bytes, each of which has numerical value 1 or 0. The

bytes key[n] where n=8*i-1 are ignored, so that the effective key

length is 56 bits.

The encrypt() function modifies the passed buffer, encoding if edflag

is 0, and decoding if 1 is being passed. Like the key parameter also

block is a bit vector representation of the actual value that is

encoded. The result is returned in that same vector.

可以看出,这里涉及到了两个函数setkeyencrypt。其中,setkey用来设置密钥,而encrypt当然就是来加密(edflag==0)或者解密(edflag==1)的了。但是这里有一个需要注意的地方,也就是上面用红色标出的地方,setkey的参数keyencrypt的参数block都是64位的位字符,也就是说这两个参数是一个长度为64的字符串,而字符串中每一个字符的内容不能为别的,只能为'0'或者'1'

知道了这些,就好办了。

比如要加密a这个字符,我们知道aASCALL码为0x97,二进制的表示形式为10010111。那么,我们首先得把a转化成一个字符串char asc="10010111",然后再把asc当作参数传入encrypt就行。

这里只是举一个简单的例子,当然,encrypt一次是要加密64个字符。正如man encrypt中给出的范例:
#define _XOPEN_SOURCE
#include
#include

int
main(void)
{
       char key[64];      /* bit pattern for key */
           char txt[64];      /* bit pattern for messages */

           setkey(key);
           encrypt(txt, 0);   /* encode */
           encrypt(txt, 1);   /* decode */
}

直接上测试代码:

#define _XOPEN_SOURCE

#include

#include

#include

#include

void stringtobyte(const char *sptr,int slen,char *bptr)

{

int i,j,op,tmp;

for(i=0;i
{
op=0x80;
for(j=0;j<8;j++)
{
tmp=sptr[i]&op;

if(tmp == 0)

bptr[i*8+j] = 0x0;

else

bptr[i*8+j] = 0x1;

op>>=1;
}
}
}

void bytetostring(const char* bptr,int blen,char* sptr)

{

int j,op;

op=0;
for(j=0;j
{
op|=bptr[j];

if (j%8 == 7)

{
sptr[(j+1)/8-1]=op;
op=0;
}
else
op<<=1;
}
}

char* pad(char* src,int slen)

{

char* dest;

int padlen=0,i;

if(slen%8 != 0)

padlen = 8-slen%8;

dest = (char*)malloc((slen+padlen+1)*sizeof(char));

strncpy(dest,src,slen);
for(i=0;i
dest[slen+i]='$';
dest[slen+padlen]='\0';

return dest;

}

int unpad(char *string, int slen)

{

int tlen=slen;

while(1)
{
if(string[tlen-1]=='$')
string[tlen-1]='\0';

else

return tlen;

tlen--;
}
}

void DEScrypt(char* string,int slen,const char* key,int flag)

{

char* ptr,*buffer,bytekey[64];

int i,buflen;

stringtobyte(key,8,bytekey);
setkey(bytekey);
buflen=slen*8;
buffer=(char*)malloc(buflen*sizeof(char));
stringtobyte(string,slen,buffer);
for(i=0;i
{
ptr=&buffer[i];
encrypt(ptr,flag);
}
bytetostring(buffer,buflen,string);
free(buffer);
}

int main(void)

{

char key[8];

char txt[100];

int i,len,ulen;

char *string;


for(i=0;i<8;i++)
{
if(i%2==0)

key[i] = 'a';

else

key[i] = 'b';

}
for(i=0;i<100;i++)
{
if(i%3==0)

txt[i] = 'A';

else

txt[i] = 'B';

}
string=pad(txt,100);
len=strlen(string);
printf("%s\n",string);

DEScrypt(string,len,key,0);

printf("%s\n",string);

DEScrypt(string,len,key,1);

ulen=unpad(string,len);
string[ulen]='\0';
printf("%s\n",string);
}

运行结果是:
xulei@xulei-desktop:~$ gcc -o crypt crypt.c -lcrypt

xulei@xulei-desktop:~$ ./crypt

ABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBA$$$$

]
阅读(3724) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-04-28 15:31:00

谢谢收藏了