加密
一、主要函数:crypt();
二、
1、注意:crypt加密,GCC编译时要加上参数-lcrypt
2、char *res = (char *)crypt(argv[1], "abc");
三、例程:
1、
/*crypt.c*/
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
char *res = (char *)crypt(argv[1], "abc");
printf("%s/n", res);
return 0;
}
/*crypt("123456","abc");返回的是密文res;
GCC编译的时候要加上 -lcrypt*/
2、
/*getpwuid*/
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
struct passwd* res=getpwuid(1000);
printf("pw_passwd=%s/n",res->pw_passwd);
printf("pw_name=%s/n",res->pw_name);
exit(0);
}
/*运行结果:
* pw_passwd=x//密码是看不到的
* pw_name=luo
* */
3、
/*passwd.c*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define SALT "abc"
struct userInfo { //定义一个结构体型变量
char *username;
char *passwd;
};
struct userInfo defaultInfo = {
"zhangsan",
"ab01FAX.bQRSU"//对应的密码是123456
};
int check(void)
{
char buf[100];
int ret;
int val = 0;
write(1, "UserName:", 9);
ret = read(0, buf, 99);
if (buf[ret] == '/n')
buf[ret - 1] = '/0';//为什么要这样写呢?因为read会将回车(/n)也读进出
else //比如说用户名输入luo,则read的返回值ret=4
buf[ret - 1] = '/0';//这样的目的是将/n砍掉
if (strcmp(buf,
defaultInfo.username) == 0) {//如果用户名通过,则提示输入密码
write(1, "Password:", 9);
ret = read(0, buf, 99);
if (buf[ret] == '/n')
buf[ret - 1] = '/0';
else
buf[ret - 1] = '/0';
if (strcmp((char *)crypt(buf, SALT), //加密
defaultInfo.passwd)
== 0) {
val = 1;
} else {
val = 0;
}
} else {
val = 0;
}
return val;
}
int main(void)
{
int i, flag = 0;
for (i = 0; i < 3; i++) {//最多只能输三次
if (check() == 0) {
flag = 0;
continue;
} else {
flag = 1;
break;
}
}
if (flag == 1) {
printf("check ok!/n");
} else {
printf("check NG!/n");
}
}
/*要处理掉输入时的"/n"*/