linux下c语言的crypt函数怎么用?

linux的crypt

最近学校布置了一个网安的小作业,要用到linux里面的这个crypt函数,写一篇总结一下。首先我们要了解这个函数是用来做什么的。

image-20230404230218492

密码影子文件中存储了每一个用户的用户明文和其单向哈希过的秘文

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./中的“随机”字符串,具体最小长度和最大长度根据加密方法的不同而不同。

image-20230404233332711

官方给出的crypt的用法是要传入一个密钥和一个salt,这个密钥就是用户密码。在编译c语言文件时,我们主要写成"gcc -o crypt crypt.c -lcrypt"去调用crypt这个库

现在题目给出了12位密钥中的前五位和后两位,中间5个都是数字,我们可以使用爆破的方式去实现一下crypt方法。

image-20230404234247466

直接给出代码

```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依次拼接进去进行加密,半分钟左右就爆出密码了

image-20230404234704340

posted @ 2023-04-04 23:49  ivanlee717  阅读(530)  评论(1编辑  收藏  举报