基于Go語(yǔ)言開(kāi)發(fā)一個(gè)編解碼工具
開(kāi)啟一個(gè)項(xiàng)目
這作為補(bǔ)充內(nèi)容,可忽略直接看下面的編解碼:
一開(kāi)始用就按照下面的步驟即可
1.創(chuàng)建一個(gè)文件夾,你自己定義名字(建議只用英文名字),你的項(xiàng)目文件夾
2.在這個(gè)文件夾里創(chuàng)建一個(gè)main.go
然后在該文件夾目錄執(zhí)行終端命令
go mod init 輸入你的文件夾名字(說(shuō)白了就是你的項(xiàng)目名字) go mod download //檢查一下是否有沒(méi)有下載的模塊,這個(gè)我比較少用 go get -u 你的模塊 //這里是下載你需要的對(duì)應(yīng)模塊 go mod tidy //可以將下載好的但是在你這項(xiàng)目中還沒(méi)導(dǎo)入的模塊進(jìn)行導(dǎo)入使用,否則會(huì)報(bào)錯(cuò) 到這里基本就可以寫代碼了,如果有的模塊還錯(cuò)誤一般就是沒(méi)有執(zhí)行g(shù)o mod tidy
編解碼工具開(kāi)發(fā)
編解碼在安全開(kāi)發(fā)中肯定是必要的一個(gè)功能,通過(guò)編解碼嘗到開(kāi)發(fā)甜頭的同時(shí)也能夠?yàn)楹罄m(xù)開(kāi)發(fā)打下基礎(chǔ)。
Dongle包
這個(gè)包就是比較經(jīng)典的一個(gè)編解碼包,下面做一個(gè)簡(jiǎn)單的介紹如何使用
encode / decode
要使用這個(gè)包就需要下載一下,下面提供兩個(gè)途徑,一個(gè)國(guó)外一個(gè)國(guó)內(nèi)
只需要下載一個(gè),不建議下載兩個(gè),不知道會(huì)不會(huì)發(fā)生沖突
//github下載 go get -u github.com/golang-module/dongle //國(guó)內(nèi)gitee下載 go get -u gitee.com/golang-module/dongle
Base64編解碼

格式:
dongle.Encode.From來(lái)源.By編碼類型.ToString轉(zhuǎn)字符
dongle.Decode.From來(lái)源.By編碼類型.ToString轉(zhuǎn)字符
package main
import (
"fmt"
"github.com/dromara/dongle"
)
func baseTest() {
fmt.Println("==========Base64==========")
baseStr := dongle.Encode.FromString("666").ByBase64().ToString()
fmt.Println(baseStr)
rawStr := dongle.Decode.FromString(baseStr).ByBase64().ToString()
fmt.Println(rawStr)
}
func main() {
baseTest()
}
其他的可以自行操作,也就是說(shuō)現(xiàn)在具備了寫一個(gè)base全家桶編解碼工具的能力了

接下來(lái)就是非?;镜拇a了,下面附上以便以后方便使用
摩斯密碼
以后我們寫好的功能都可以用函數(shù)封裝起來(lái),以后寫工具功能的時(shí)候直接拿來(lái)就用了,當(dāng)然下面的我只是作為一個(gè)test測(cè)試函數(shù)。
func moreTest() {
fmt.Println("==========More==========")
morseStr := dongle.Encode.FromString("666").ByMorse().ToString()
fmt.Println(morseStr)
rawStr := dongle.Decode.FromString(morseStr).ByMorse().ToString()
fmt.Println(rawStr)
}URL加解密
參考代碼
func urlTest() {
fmt.Println("==========URL==========")
urlStr := dongle.Encode.FromString("hack=123").BySafeURL().ToString()
fmt.Println("加密后的url數(shù)據(jù):", urlStr)
rawStr := dongle.Decode.FromString(urlStr).BySafeURL().ToString()
fmt.Println("解密后的url數(shù)據(jù):", rawStr)
}
AES加解密
AES 加密有模式,所以要設(shè)置一個(gè)模式與填充方式
完整代碼
func aesTest() {
fmt.Println("==========AES==========")
aesCipher := dongle.NewCipher()
aesCipher.SetMode(dongle.CBC) //CBC、CFB、OFB、CTR、ECB
aesCipher.SetPadding(dongle.Zero) //No、Empty、Zero、PKCS5、PKCS7、AnsiX923、 ISO97971
aesCipher.SetKey("1234567890123456") // key?度可以是16、24或32字節(jié)
aesCipher.SetIV("1234567890123456") // iv長(zhǎng)度固定為16字節(jié),ECB模式下不需要設(shè)置iv,這里看情況用就行了,只是做一個(gè)演示
aesStr := dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToRawString()
fmt.Println("加密后的數(shù)據(jù):", aesStr)
rawStr := dongle.Decrypt.FromRawString(aesStr).ByAes(aesCipher).ToString()
fmt.Println("解密后的數(shù)據(jù):", rawStr)
}
當(dāng)然如果你覺(jué)得亂碼看著不舒服,還能換不同的輸出,這里簡(jiǎn)單過(guò)一遍,知道即可
func aesTest() {
fmt.Println("==========AES==========")
aesCipher := dongle.NewCipher()
aesCipher.SetMode(dongle.CBC) //CBC、CFB、OFB、CTR、ECB
aesCipher.SetPadding(dongle.Zero) //No、Empty、Zero、PKCS5、PKCS7、AnsiX923、 ISO97971
aesCipher.SetKey("1234567890123456") // key?度可以是16、24或32字節(jié)
aesCipher.SetIV("1234567890123456") // iv長(zhǎng)度固定為16字節(jié),ECB模式下不需要設(shè)置iv,這里看情況用就行了,只是做一個(gè)演示
aesStr := dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToRawString()
fmt.Println("加密后的raw數(shù)據(jù):", aesStr)
rawStr := dongle.Decrypt.FromRawString(aesStr).ByAes(aesCipher).ToString()
fmt.Println("解密后的raw數(shù)據(jù):", rawStr)
aesStr = dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToBase64String()
fmt.Println("加密后的base64數(shù)據(jù):", aesStr)
rawStr = dongle.Decrypt.FromBase64String(aesStr).ByAes(aesCipher).ToString()
fmt.Println("解密后的base64數(shù)據(jù):", rawStr)
aesStr = dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToHexString()
fmt.Println("加密后的hex數(shù)據(jù):", aesStr)
rawStr = dongle.Decrypt.FromHexString(aesStr).ByAes(aesCipher).ToString()
fmt.Println("解密后的hex數(shù)據(jù):", rawStr)
}
MD5碰撞工具開(kāi)發(fā)
需求:能夠根據(jù)一個(gè)密碼本對(duì)某個(gè)md5值進(jìn)行碰撞解密
思路:就是打開(kāi)文件讀取每一行,加密然后碰撞比較md5值是否正確
比如我們輸入top2k字典中最后一個(gè)密碼作為md5值


參考代碼:(注意我加了一個(gè)時(shí)間計(jì)算,那個(gè)是可以不要的,我只是想看下計(jì)算時(shí)間有多長(zhǎng)罷遼)
func fuzzMd5(md5str string) {
open, err := os.Open("top2k.txt")
if err != nil {
fmt.Println(err)
return
}
defer open.Close()
scanner := bufio.NewScanner(open)
// 逐個(gè)讀取分割后的內(nèi)容
start := time.Now() // 獲取當(dāng)前時(shí)間
for scanner.Scan() {
passwd := scanner.Text()
passwdMD5 := dongle.Encrypt.FromString(passwd).ByMd5().ToHexString()
if string(passwdMD5) == md5str {
fmt.Printf("%v:%v\n", passwdMD5, passwd)
end := time.Now() // 獲取當(dāng)前時(shí)間
fmt.Println("耗時(shí):", end.Sub(start).Seconds())
return
}
}
end := time.Now() // 獲取當(dāng)前時(shí)間
fmt.Println("耗時(shí):", end.Sub(start).Seconds())
if err := scanner.Err(); err != nil {
fmt.Println("Error:", err)
}
}main函數(shù)調(diào)用如下

運(yùn)行結(jié)果如下:

這就是一個(gè)簡(jiǎn)單的md5碰撞工具了,目前所學(xué)知識(shí)還只能做到這樣比較簡(jiǎn)陋,后面兩期打算講一個(gè)腳手架開(kāi)發(fā)工具,加速開(kāi)發(fā)的同時(shí),可以讓你自己寫的命令行工具看起來(lái)就是一個(gè)完整的hacker工具了。
以上就是基于Go語(yǔ)言開(kāi)發(fā)一個(gè)編解碼工具的詳細(xì)內(nèi)容,更多關(guān)于Go編解碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go?mod?replace使用方法及常見(jiàn)問(wèn)題分析
這篇文章主要為大家介紹了Go?mod?replace使用方法及常見(jiàn)問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Go語(yǔ)言連接Oracle數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Go語(yǔ)言連接Oracle數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解
這篇文章主要介紹了Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解,需要的朋友可以參考下2022-04-04
詳解Go?將在下個(gè)版本支持新型排序算法pdqsort
這篇文章主要介紹了Go?將在下個(gè)版本支持新型排序算法:pdqsort,而就Go支持pdqsort算法,在HN上引起了不少的討論,有人表示,我們研究排序算法這么久了,很驚訝我們還能想出能產(chǎn)生實(shí)際改進(jìn)的優(yōu)化方案。對(duì)此,你怎么看,快快上手體驗(yàn)一下吧2022-04-04

