欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Go語言開發(fā)一個編解碼工具

 更新時間:2025年03月05日 09:42:14   作者:竹等寒  
這篇文章主要為大家詳細介紹了如何基于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編解碼的資料請關注腳本之家其它相關文章!

相關文章

  • Go?mod?replace使用方法及常見問題分析

    Go?mod?replace使用方法及常見問題分析

    這篇文章主要為大家介紹了Go?mod?replace使用方法及常見問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • golang內(nèi)置函數(shù)len的小技巧

    golang內(nèi)置函數(shù)len的小技巧

    len是很常用的內(nèi)置函數(shù),可以測量字符串、slice、array、channel以及map的長度/元素個數(shù)。本文就來介紹一下其他小技巧,感興趣的可以了解一下
    2021-07-07
  • Go語言連接Oracle數(shù)據(jù)庫的方法

    Go語言連接Oracle數(shù)據(jù)庫的方法

    這篇文章主要介紹了Go語言連接Oracle數(shù)據(jù)庫的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Golang泛型與反射的應用詳解

    Golang泛型與反射的應用詳解

    如果我想編寫一個可以輸出任何給定類型的切片并且不使用反射的打印功能,則可以使用新的泛型語法。文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Gin框架中參數(shù)校驗優(yōu)化詳解

    Gin框架中參數(shù)校驗優(yōu)化詳解

    這篇文章主要為大家詳細介紹了Gin框架中參數(shù)校驗優(yōu)化的相關知識,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解下
    2023-08-08
  • Go單例模式與Once源碼實現(xiàn)

    Go單例模式與Once源碼實現(xiàn)

    這篇文章主要介紹了Go單例模式與Once源碼實現(xiàn),本文結合示例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • 淺談Golang是如何讀取文件內(nèi)容的(7種)

    淺談Golang是如何讀取文件內(nèi)容的(7種)

    這篇文章主要介紹了淺談Golang是如何讀取文件內(nèi)容的,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • 基于golang的輕量級工作流框架Fastflow

    基于golang的輕量級工作流框架Fastflow

    這篇文章主要介紹了基于golang的輕量級工作流框架Fastflow,fastflow 執(zhí)行任務的過程會涉及到幾個概念:Dag, Task, Action, DagInstance,本文給大家分享完整流程,需要的朋友可以參考下
    2022-05-05
  • Go基礎教程系列之WaitGroup用法實例詳解

    Go基礎教程系列之WaitGroup用法實例詳解

    這篇文章主要介紹了Go基礎教程系列之WaitGroup用法實例詳解,需要的朋友可以參考下
    2022-04-04
  • 詳解Go?將在下個版本支持新型排序算法pdqsort

    詳解Go?將在下個版本支持新型排序算法pdqsort

    這篇文章主要介紹了Go?將在下個版本支持新型排序算法:pdqsort,而就Go支持pdqsort算法,在HN上引起了不少的討論,有人表示,我們研究排序算法這么久了,很驚訝我們還能想出能產(chǎn)生實際改進的優(yōu)化方案。對此,你怎么看,快快上手體驗一下吧
    2022-04-04

最新評論