Chinaunix首页 | 论坛 | 博客
  • 博客访问: 610088
  • 博文数量: 144
  • 博客积分: 5037
  • 博客等级: 大校
  • 技术积分: 1581
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-30 21:49
文章存档

2010年(16)

2009年(128)

分类: LINUX

2010-08-05 15:45:01

crypt是个密码加密函数,它是基於Data Encryption Standard(DES)演算法。

crypt基本上是One way encryption,因此它只适用於密码的使用,不适合於资料加密。

char *crypt(const char *key, const char *salt);

key 是使用者的密码。salt是两个字,每个字可从[a-zA-Z0-9./]中选出来,因此同一密码增加了4096种可能性。透过使用key中每个字的低七位元,取得 56-bit关键字,这56-bit关键字被用来加密成一组字,这组字有13个可显示的 ASCII字,包含开头两个salt。

[root@linux root]# cat crypt.c
/*
Netkiller 2003-06-27 crypt.c
char *crypt(const char *key, const char *salt);
*/

#include
main(){
char key[256];
char salt[64];
char passwd[256];
printf("key:");
scanf("%s",&key);
printf("salt:");
scanf("%s",&salt);
sprintf(passwd,"passwd:%s\n",crypt(key,salt));
printf(passwd);
}
[root@linux root]# gcc -o crypt -s crypt.c –lcrypt
[root@linux root]# ./crypt
key:chen
salt:salt
passwd:sa0hRW/W3DLvQ
[root@linux root]#



PHP crypt()

将字符串用 DES 编码加密。

语法: string crypt(string str, string [salt]);

返回值: 字符串

函数种类: 编码处理

内容说明

本函数将字符串用 UNIX 的标准加密 DES 模块加密。这是单向的加密函数,无法解密。欲比对字符串,将已加密的字符串的头二个字符放在 salt 的参数中,再比对加密后的字符串。

更详细的资料请参考 UNIX Manual (man) 中的 crypt。

在一些较新的 UNIX 版本中,除了 DES 之外还提供了其它的加密模块,如 MD5。甚至有些系统还用 MD5 取代 DES。在 salt 参数还有一些变化,端看传给 salt 参数的字符串长度而定:
* CRYPT_STD_DES - 标准的 DES 编码,输入 2 字符的 salt。
* CRYPT_EXT_DES - 延伸的 DES 编码,输入 9 字符的 salt。
* CRYPT_MD5 - MD5 编码,输入 12 字符加上 $1$ 的 salt。
* CRYPT_BLOWFISH - 延伸的 DES 编码,输入 16 字符加上 $2$ 的 salt。
此外,若不使用 salt 参数,则程序会自动产生。

eg:

/* 
skyily 2010-07-05 crypt.c
char *crypt(const char *key, const char *salt);
*/

#include
#include

#include

char * apr_cpystrn(char *dst, const char *src, size_t dst_size)
{

    char *d, *end;

    if (dst_size == 0) {
        return (dst);
    }

    d = dst;
    end = dst + dst_size - 1;

    for (; d < end; ++d, ++src) {
 if (!(*d = *src)) {
     return (d);
 }
    }

    *d = '\0'; /* always null terminate */

    return (d);
}

static void to64(char *s, unsigned long v, int n)
{
    static unsigned char itoa64[] =         /* 0 ... 63 => ASCII - 64 */
        "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    while (--n >= 0) {
        *s++ = itoa64[v&0x3f];
        v >>= 6;
    }
}
int main()
{
    char cpw[256] = "";
    char pw[256] = "";
    char salt[9] = "";

 

printf("Input passwd:");

    scanf("s", pw);

    to64(&salt[0], rand(), 8);
    salt[8] = '\0';

    apr_cpystrn(cpw, (char *)crypt(pw, salt), sizeof(cpw) - 1);

 printf("new passwd : %s\n", cpw);

}

 


阅读(1950) | 评论(0) | 转发(0) |
0

上一篇:ubuntu启动不了x server

下一篇:没有了

给主人留下些什么吧!~~