基于Go語言開發(fā)一個編解碼工具
開啟一個項目
這作為補充內(nèi)容,可忽略直接看下面的編解碼:
一開始用就按照下面的步驟即可
1.創(chuàng)建一個文件夾,你自己定義名字(建議只用英文名字
),你的項目文件夾
2.在這個文件夾里創(chuàng)建一個main.go
然后在該文件夾目錄執(zhí)行終端命令
go mod init 輸入你的文件夾名字(說白了就是你的項目名字) go mod download //檢查一下是否有沒有下載的模塊,這個我比較少用 go get -u 你的模塊 //這里是下載你需要的對應模塊 go mod tidy //可以將下載好的但是在你這項目中還沒導入的模塊進行導入使用,否則會報錯 到這里基本就可以寫代碼了,如果有的模塊還錯誤一般就是沒有執(zhí)行go mod tidy
編解碼工具開發(fā)
編解碼在安全開發(fā)中肯定是必要的一個功能,通過編解碼嘗到開發(fā)甜頭的同時也能夠為后續(xù)開發(fā)打下基礎。
Dongle包
這個包就是比較經(jīng)典的一個編解碼包,下面做一個簡單的介紹如何使用
encode / decode
要使用這個包就需要下載一下,下面提供兩個途徑,一個國外一個國內(nèi)
只需要下載一個,不建議下載兩個,不知道會不會發(fā)生沖突
//github下載 go get -u github.com/golang-module/dongle //國內(nèi)gitee下載 go get -u gitee.com/golang-module/dongle
Base64編解碼
格式:
dongle.Encode.From來源.By編碼類型.ToString轉(zhuǎn)字符
dongle.Decode.From來源.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() }
其他的可以自行操作,也就是說現(xiàn)在具備了寫一個base全家桶編解碼工具的能力了
接下來就是非?;镜拇a了,下面附上以便以后方便使用
摩斯密碼
以后我們寫好的功能都可以用函數(shù)封裝起來,以后寫工具功能的時候直接拿來就用了,當然下面的我只是作為一個test測試函數(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 加密有模式,所以要設置一個模式
與填充方式
完整代碼
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長度固定為16字節(jié),ECB模式下不需要設置iv,這里看情況用就行了,只是做一個演示 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) }
當然如果你覺得亂碼看著不舒服,還能換不同的輸出,這里簡單過一遍,知道即可
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長度固定為16字節(jié),ECB模式下不需要設置iv,這里看情況用就行了,只是做一個演示 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碰撞工具開發(fā)
需求:能夠根據(jù)一個密碼本對某個md5值進行碰撞解密
思路:就是打開文件讀取每一行,加密然后碰撞比較md5值是否正確
比如我們輸入top2k字典中最后一個密碼作為md5值
參考代碼:(注意我加了一個時間計算,那個是可以不要的,我只是想看下計算時間有多長罷遼)
func fuzzMd5(md5str string) { open, err := os.Open("top2k.txt") if err != nil { fmt.Println(err) return } defer open.Close() scanner := bufio.NewScanner(open) // 逐個讀取分割后的內(nèi)容 start := time.Now() // 獲取當前時間 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() // 獲取當前時間 fmt.Println("耗時:", end.Sub(start).Seconds()) return } } end := time.Now() // 獲取當前時間 fmt.Println("耗時:", end.Sub(start).Seconds()) if err := scanner.Err(); err != nil { fmt.Println("Error:", err) } }
main函數(shù)調(diào)用如下
運行結果如下:
這就是一個簡單的md5碰撞工具了,目前所學知識還只能做到這樣比較簡陋,后面兩期打算講一個腳手架開發(fā)工具,加速開發(fā)的同時,可以讓你自己寫的命令行工具看起來就是一個完整的hacker工具了。
以上就是基于Go語言開發(fā)一個編解碼工具的詳細內(nèi)容,更多關于Go編解碼的資料請關注腳本之家其它相關文章!