linux下c语言的crypt函数怎么用?
Posted WELCOME TO ivanlee717!!!!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下c语言的crypt函数怎么用?相关的知识,希望对你有一定的参考价值。
linux的crypt
最近学校布置了一个网安的小作业,要用到linux里面的这个crypt
函数,写一篇总结一下。首先我们要了解这个函数是用来做什么的。
密码影子文件中存储了每一个用户的用户明文和其单向哈希过的秘文
cipher = "$1$C68vnJ27$1ttFZ1/Rylq/xi350A0NI0";
密码字段用\\(id\\)salt$hashed的格式存储,其中id字段是1,salt是C68vnJ27,hash为1ttFZ1/Rylq/xi350A0NI0
其中$id表示计算密码密文所用的哈希算法,对应关系如下:
$1$
表示 MD5$5$
表示 SHA-256$6$
表示 SHA-512$2a$
和$2y$
表示Blowfish算法
那这个由明文加密的过就是由crypt()函数完成的,crypt()是一个密码加密函数(将密码加密,明文变成密文),该函数基于数据加密标准(DES,Data Encryption Standard )算法以及基于DES的其他变种算法,该函数不依赖于计算机硬件实现数据加密。DES算法仅适合于加密字符串,也就是用于生成密码。尽管密码的生成有很多种方法。
salt的定义是在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”。
Salt 可以是任意字母、数字、或是字母或数字的组合,但必须是随机产生的,每个用户的 Salt 都不一样,用户注册的时候,数据库中存入的不是明文密码,也不是简单的对明文密码进行散列,而是 MD5( 明文密码 + Salt)。salt是一种混淆key的一段范围在abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./中的“随机”字符串,具体最小长度和最大长度根据加密方法的不同而不同。
官方给出的crypt的用法是要传入一个密钥和一个salt,这个密钥就是用户密码。在编译c语言文件时,我们主要写成"gcc -o crypt crypt.c -lcrypt"去调用crypt这个库
现在题目给出了12位密钥中的前五位和后两位,中间5个都是数字,我们可以使用爆破的方式去实现一下crypt方法。
直接给出代码
```c
//
// Created by ivanlee on 2023/3/26.
//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <crypt.h>
const char* ans_cipher = "$1$XwynSv0a$qgSbP2GtPyeEyq6ZVWPUZ1";
const char* first5 = "*CMS";
const char* last2 = "c#";
const char* salt = "$1$XwynSv0a$";
int main(int argc, char* argv[])
for(int a=0; a<10;a++)
char str[30];
strcpy(str,first5);
char tmpa;
tmpa = \'0\' + a;
str[5] = tmpa;
for(int b=0; b<10;b++)
char tmpb;
tmpb = \'0\' + b;
str[6] = tmpb;
for(int c=0; c<10;c++)
char tmpc;
tmpc = \'0\' + c;
str[7] = tmpc;
for(int d=0; d<10;d++)
char tmpd;
tmpd = \'0\' + d;
str[8] = tmpd;
for(int e=0; e<10;e++)
char tmpe;
tmpe = \'0\'+e;
str[9]=tmpe;
str[10]=\'c\';
str[11]=\'#\';
char cipher[50];
char new[12];
strncpy(new,str,12);
strcpy(cipher,crypt(new,salt));
if(strcmp(cipher,ans_cipher)==0)
printf("the ans is: %s\\n", new);
return 0;
return 0;
主要当我们了解了盐是什么,crypt是怎么加密的,这个判断爆破密码的很简单了,从00000开始到99999依次拼接进去进行加密,半分钟左右就爆出密码了
本文来自博客园,作者:ivanlee717,转载请注明原文链接:https://www.cnblogs.com/ivanlee717/p/17288313.html
linux c语言编程
一.编写一个C语言程序,用open函数在当前目录下创建一个文件test.txt,然后将数字1~100按顺序写入文件, 之后分别读出第50(从文件开始处计算)、第100个字节处的数字, 并输出该数字到标准输出。然后关闭并删除文件。
要求:.
i. 在Linux操作系统下调试通过后,在试卷上填写你的程序,并写好完整的注释。
ii. 写下你对程序中所使用的open,、write、close等文件系统调用的功能的理解。
iii. 雷同的程序两者都按零分处理。
二. 首先用shell命令在用户主目录下创建一个文件myfile, 然后用C语言编写一个程序打印出该文件的类型和组权限位, 判断该用户对该文件是否有执行权限。如果没有,请通过chmod函数给它加上执行权限。
要求和问题:
i. 你是如何用shell命令创建一个文件的?什么是用户的主目录?
ii. 在Linux操作系统下调试通过后,在试卷上填写你的程序,并写好完整的注释。
iii. 雷同的程序两者都按零分处理。
作业需要两个C程序,应该不难,哪位大哥帮我看看,调试成功后把程序发给我qq6920391 邮箱6920391@qq.com并留下回答者昵称。成功后直接给分。
PS:不要把程序贴到知道上,以免别人复制。程序要原创的。是linux下的C语言编程不是PC下的。有想做的请在知道后跟贴,方便我给您分数。本人linux小白+_+,还有第一题要用到open、write、close等文件系统调用的功能。
起码是linux 下的C语言编程,搞嵌入式开发的吧。
我也来试试,正想向这个方向研究呢。呵呵
另:公司只能上百度,只能这里给你了.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#define LEN 100
main()
int fd, len;
int i;
char ch[LEN];
fd=open("test.txt",O_CREAT|O_RDWR,10705);
if(fd)
for(i=1;i<101;i++)
sprintf(ch,"%d",i);
write(fd,ch,strlen(ch));
close(fd);
fd = open("test.txt",O_RDWR);
lseek(fd,50,SEEK_SET);
if(fd)
len = read(fd,ch,1);
ch[len] = '\0';
printf("%s\n",ch);
lseek(fd,100,SEEK_SET);
if(fd)
len = read(fd,ch,1);
ch[len] = '\0';
printf("%s\n",ch);
close(fd);
if(!remove("test.txt"))
printf("test.txt have remove\n");
else
printf("can't remove\n");
这是第一题. 参考技术A 我贴个第二题的吧。
#/bin/sh
cd
touch myfile
============================================================
#include<stdio.h>
#include<sys/stat.h>
#include<stdib.h>
main()
struct stat file;
stat("myfile",&file);
print("The file type is :");
if(S_ISREG(file.st_mode))
print("regular file.");
else if(S_ISREK(file.st_mode))
print("directory.");
else if(S_ISDIR(file.st_mode))
print("block special file.");
else if(S_ISLNK(file.st_mode))
print("symbolic link.");
else
print("other type file.");
printf("\nThe group permission is:");
if(file.st_mode & S_IRGRP)
print("read.");
if(file.st_mode & S_IWGRP)
print ("write.");
if(file.st_mode & S_IXGRP)
print ("execute.");
else
chmod("myfile",file.st_mode|S_IXGRP);
print("\nAdded execute permission.");
参考技术B 雷同的程序两者都按零分处理 参考技术C 有一本《Linux C函数大全》的小册子,Linux的API大多数都有,和MSDN有点相似,LZ看看这个。 参考技术D linux的环境你要是认识了 简单的编程是一样的 第5个回答 2009-04-21 退学吧……
以上是关于linux下c语言的crypt函数怎么用?的主要内容,如果未能解决你的问题,请参考以下文章