基于Go语言开发一个编解码工具

 更新时间:2025年03月05日 09:42:14   作者:竹等寒  
这篇文章主要为大家详细介绍了如何基于Go语言开发一个编解码工具,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起了解一下

开启一个项目

这作为补充内容,可忽略直接看下面的编解码:

一开始用就按照下面的步骤即可

1.创建一个文件夹,你自己定义名字(建议只用英文名字),你的项目文件夹

2.在这个文件夹里创建一个main.go

然后在该文件夹目录执行终端命令

go mod init 输入你的文件夹名字(说白了就是你的项目名字)
go mod download  //检查一下是否有没有下载的模块,这个我比较少用
go get -u 你的模块 //这里是下载你需要的对应模块
go mod tidy //可以将下载好的但是在你这项目中还没导入的模块进行导入使用,否则会报错

到这里基本就可以写代码了,如果有的模块还错误一般就是没有执行go mod tidy

编解码工具开发

编解码在安全开发中肯定是必要的一个功能,通过编解码尝到开发甜头的同时也能够为后续开发打下基础。

Dongle包

这个包就是比较经典的一个编解码包,下面做一个简单的介绍如何使用

encode / decode

要使用这个包就需要下载一下,下面提供两个途径,一个国外一个国内

只需要下载一个,不建议下载两个,不知道会不会发生冲突

//github下载
go get -u github.com/golang-module/dongle


//国内gitee下载
go get -u gitee.com/golang-module/dongle

Base64编解码

格式:

dongle.Encode.From来源.By编码类型.ToString转字符

dongle.Decode.From来源.By编码类型.ToString转字符

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()
}

其他的可以自行操作,也就是说现在具备了写一个base全家桶编解码工具的能力了

接下来就是非常基本的代码了,下面附上以便以后方便使用

摩斯密码

以后我们写好的功能都可以用函数封装起来,以后写工具功能的时候直接拿来就用了,当然下面的我只是作为一个test测试函数。

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数据:", urlStr)
    rawStr := dongle.Decode.FromString(urlStr).BySafeURL().ToString()
    fmt.Println("解密后的url数据:", 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字节
    aesCipher.SetIV("1234567890123456")  // iv长度固定为16字节,ECB模式下不需要设置iv,这里看情况用就行了,只是做一个演示
    aesStr := dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToRawString()
    fmt.Println("加密后的数据:", aesStr)
    rawStr := dongle.Decrypt.FromRawString(aesStr).ByAes(aesCipher).ToString()
    fmt.Println("解密后的数据:", 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字节
    aesCipher.SetIV("1234567890123456")  // iv长度固定为16字节,ECB模式下不需要设置iv,这里看情况用就行了,只是做一个演示
    aesStr := dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToRawString()
    fmt.Println("加密后的raw数据:", aesStr)
    rawStr := dongle.Decrypt.FromRawString(aesStr).ByAes(aesCipher).ToString()
    fmt.Println("解密后的raw数据:", rawStr)
    aesStr = dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToBase64String()
    fmt.Println("加密后的base64数据:", aesStr)
    rawStr = dongle.Decrypt.FromBase64String(aesStr).ByAes(aesCipher).ToString()
    fmt.Println("解密后的base64数据:", rawStr)
    aesStr = dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToHexString()
    fmt.Println("加密后的hex数据:", aesStr)
    rawStr = dongle.Decrypt.FromHexString(aesStr).ByAes(aesCipher).ToString()
    fmt.Println("解密后的hex数据:", rawStr)
}

MD5碰撞工具开发

需求:能够根据一个密码本对某个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)
    // 逐个读取分割后的内容
    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函数调用如下

运行结果如下:

这就是一个简单的md5碰撞工具了,目前所学知识还只能做到这样比较简陋,后面两期打算讲一个脚手架开发工具,加速开发的同时,可以让你自己写的命令行工具看起来就是一个完整的hacker工具了。

以上就是基于Go语言开发一个编解码工具的详细内容,更多关于Go编解码的资料请关注脚本之家其它相关文章!

相关文章

  • golang实现mysql数据库事务的提交与回滚

    golang实现mysql数据库事务的提交与回滚

    这篇文章主要介绍了golang实现mysql数据库事务的提交与回滚,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Golang使用archive/zip包实现ZIP压缩与解压

    Golang使用archive/zip包实现ZIP压缩与解压

    Golang 中的 archive/zip 包用于处理 ZIP 格式的压缩文件,提供了一系列用于创建、读取和解压缩 ZIP 格式文件的函数和类型,使用起来非常方便,下面就跟随小编一起了解一下具体使用方法吧
    2023-08-08
  • 关于Gin框架中的Cookie和Session的使用方法

    关于Gin框架中的Cookie和Session的使用方法

    为了实现跨请求的数据共享,我们可以使用Cookie和Session,本文将结合实际案例,详细介绍在Go语言的Gin框架中如何使用Cookie和Session,并通过代码示例介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • goweb原生实现HTTP文件上传功能

    goweb原生实现HTTP文件上传功能

    在Go语言中,使用原生net/http包实现HTTP文件上传功能,主要依赖multipart/form-data编码解析和文件流处理, 下面就来详细的介绍一下如何实现,感兴趣的可以了解一下
    2026-02-02
  • Go语言中的包Package详解

    Go语言中的包Package详解

    本文详细讲解了Go语言中的包Package,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Go语言leetcode题解953验证外星语词典示例详解

    Go语言leetcode题解953验证外星语词典示例详解

    这篇文章主要为大家介绍了Go语言leetcode题解953验证外星语词典示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • GPT回答 go语言和C语言数组操作对比

    GPT回答 go语言和C语言数组操作对比

    这篇文章主要为大家介绍了GPT回答的go语言和C语言数组操作方法对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • golang实现读取excel数据并导入数据库

    golang实现读取excel数据并导入数据库

    Go 语言是一门适合用于编写高效且并发的 Web 应用程序的编程语言,同时也可以使用它进行数据处理和分析,本文主要介绍了如何通过go语言实现读取excel数据并导入数据库,感兴趣的小伙伴可以了解下
    2025-04-04
  • Go进阶并发控制channel和WaitGroup的实现

    Go进阶并发控制channel和WaitGroup的实现

    本篇文章详细介绍了Go语言中的channel、WaitGroup和信号量三种并发控制机制,分别从实现原理、使用示例和优缺点等方面进行了深入解析,帮助开发者更好地掌握Go语言的并发编程技巧
    2026-06-06
  • Go 日志封装实战示例详解

    Go 日志封装实战示例详解

    这篇文章主要为大家介绍了Go 日志封装实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论