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);
}
|