首页 > 系统相关 >linux下c语言的crypt函数怎么用?

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

时间:2023-04-04 23:56:07浏览次数:32  
标签:加密 函数 crypt 明文 密码 linux include salt

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

标签:加密,函数,crypt,明文,密码,linux,include,salt
From: https://www.cnblogs.com/ivanlee717/p/17288313.html

相关文章

  • splunk配置windows和linux的配置过程和事项
    主服务器安装splunkrpm-ivhsplunk.xxx.rpm--force--nodeps#因为这里可能会有报错说/bin/shisneededbyxx#安装在/opt目录下,解压完成后进入splunk的bin目录cd/opt/splunk/bin1.启动splunk/opt/splunk/bin$./splunkstart###开始一段协议###一直回车然后输入y同意......
  • 函数模板
    一:基本范例 a)模板的定义是以template关键字开头的 b)类型模板参数T前面用typename来修饰,遇到typename就该知道其后面跟的是一个类型。typename可以被class取代 c)类型模板参数T(代表一个类型),前面的修饰符typename/class都用<>括起来 d)T这个名字可以换成任意其他标识符  二:实......
  • 函数
    '''函数的意义'''#求每个字符串的长度str1="fqs123"str2="doudou"count=0foriinstr1:count+=1print(str(count))count=0foriinstr2:count+=1print(str(count))'''函数def函数名(传入参数):......
  • Kotlin中函数式编程的详解
     一、函数式编程理解我们一直在学习面向对象编程范式,另个一个较知名的编程范式是诞生于20世纪50年代,基于抽象数学的λ(lambda)演算发展而来的函数式编程,尽管函数式编程更常用在学术而非软件领域,但它的一些原则适用于任何编程语言。函数式编程范式主要依赖于高阶函数(以函数为参数或......
  • 如何编写高质量的 JS 函数(3) --函数式编程[理论篇]
    作者:杨昆 【编写高质量函数系列】中,《如何编写高质量的JS函数(1)--敲山震虎篇》介绍了函数的执行机制,此篇将会从函数的命名、注释和鲁棒性方面,阐述如何通过JavaScript编写高质量的函数。 《如何编写高质量的JS函数(2)--命名/注释/鲁棒篇》从函数的命名、注释和鲁棒性方面,阐......
  • Linux Page Cache调优在Kafka中的应用
    作者:YangYijun本文主要描述LinuxPageCache优化的背景、PageCache的基本概念、列举之前针对Kafka的IO性能瓶颈采取的一些解决方案、如何进行PageCache相关参数调整以及性能优化前后效果对比。一、优化背景当业务快速增长,每天需要处理万亿记录级数据量时。在读写数据方面,Kafka......
  • linux下安装数据库
    1、查看是否有安卓数据库输入命令:mysql   2、查看是否存在rpm-qa|grepmariadb  3、将其卸载命令:rpm-e--nodepsmariadb-libs-5.5.68-1.el7.x86_64  4、如果没权限,输入suroot超级管理员账号  5、装依赖包命令:yuminstall-yperlnet-tools......
  • Linux服务器部署前后端项目-SQL Father为例
    Linux服务器部署前后端项目-SQLFather为例项目介绍项目的Github地址:https://github.com/liyupi/sql-father-frontend-public1.下载前后端项目到本地我这里使用Gitclone,也可以直接下载压缩包。gitclonehttps://github.com/liyupi/sql-father-frontend-public.git2......
  • linux上安装.net 5.0
    一、CentOS8.2在线安装.net5.0直接执行命令:sudodnfinstalldotnet-sdk-5.0二、centos7.6在线安装.net5.0首先,配置仓库:sudorpm-Uvhhttps://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm然后,执行安装命令:sudoyuminstalldotn......
  • linux部署.NET6.0项目
    一、CentOS7.9配置SSH实现远程连接方法过程 1.确认是否安装sshyumlistinstalled|grepopenssh-server有输出内容,说明已安装;2.安装SSH服务yuminstallopenssh-server已安装的可以直接跳过。3.编辑配置vim/etc/ssh/sshd_config4.Port2222PermitRootLoginn......