linux的crypt 最近學校佈置了一個網安的小作業,要用到linux裡面的這個crypt函數,寫一篇總結一下。首先我們要瞭解這個函數是用來做什麼的。 密碼影子文件中存儲了每一個用戶的用戶明文和其單向哈希過的秘文 cipher = "$1$C68vnJ27$1ttFZ1/Rylq/xi350A0N ...
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