• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 涵韵3588 | 发布时间: 2025-8-14 08:35| 查看数: 52| 评论数: 0|帖子模式

    开启一个项目

    这作为补充内容,可忽略直接看下面的编解码:
    一开始用就按照下面的步骤即可
    1.创建一个文件夹,你自己定义名字(
    1. 建议只用英文名字
    复制代码
    ),你的项目文件夹
    2.在这个文件夹里创建一个main.go
    然后在该文件夹目录执行终端命令
    1. go mod init 输入你的文件夹名字(说白了就是你的项目名字)
    2. go mod download  //检查一下是否有没有下载的模块,这个我比较少用
    3. go get -u 你的模块 //这里是下载你需要的对应模块
    4. go mod tidy //可以将下载好的但是在你这项目中还没导入的模块进行导入使用,否则会报错

    5. 到这里基本就可以写代码了,如果有的模块还错误一般就是没有执行go mod tidy
    复制代码
    编解码工具开发

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

    Dongle包

    这个包就是比较经典的一个编解码包,下面做一个简单的介绍如何使用
    encode / decode
    要使用这个包就需要下载一下,下面提供两个途径,一个国外一个国内
    只需要下载一个,不建议下载两个,不知道会不会发生冲突
    1. //github下载
    2. go get -u github.com/golang-module/dongle


    3. //国内gitee下载
    4. go get -u gitee.com/golang-module/dongle
    复制代码
    Base64编解码

    格式:
    1. dongle.Encode.From来源.By编码类型.ToString转字符
    复制代码
    1. dongle.Decode.From来源.By编码类型.ToString转字符
    复制代码
    1. package main
    2. import (
    3.     "fmt"
    4.     "github.com/dromara/dongle"
    5. )
    6.   func baseTest() {
    7.     fmt.Println("==========Base64==========")
    8.     baseStr := dongle.Encode.FromString("666").ByBase64().ToString()
    9.     fmt.Println(baseStr)
    10.     rawStr := dongle.Decode.FromString(baseStr).ByBase64().ToString()
    11.     fmt.Println(rawStr)
    12. }
    13. func main() {
    14.     baseTest()
    15. }
    复制代码

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

    接下来就是非常基本的代码了,下面附上以便以后方便使用
    摩斯密码
    以后我们写好的功能都可以用函数封装起来,以后写工具功能的时候直接拿来就用了,当然下面的我只是作为一个test测试函数。
    1. func moreTest() {
    2.     fmt.Println("==========More==========")
    3.     morseStr := dongle.Encode.FromString("666").ByMorse().ToString()
    4.     fmt.Println(morseStr)
    5.     rawStr := dongle.Decode.FromString(morseStr).ByMorse().ToString()
    6.     fmt.Println(rawStr)
    7. }
    复制代码
    URL加解密
    参考代码
    1. func urlTest() {
    2.     fmt.Println("==========URL==========")
    3.     urlStr := dongle.Encode.FromString("hack=123").BySafeURL().ToString()
    4.     fmt.Println("加密后的url数据:", urlStr)
    5.     rawStr := dongle.Decode.FromString(urlStr).BySafeURL().ToString()
    6.     fmt.Println("解密后的url数据:", rawStr)
    7. }
    复制代码

    AES加解密
    AES 加密有模式,所以要设置一个
    1. 模式
    复制代码
    1. 填充方式
    复制代码
    完整代码
    1. func aesTest() {
    2.     fmt.Println("==========AES==========")
    3.     aesCipher := dongle.NewCipher()
    4.     aesCipher.SetMode(dongle.CBC)        //CBC、CFB、OFB、CTR、ECB
    5.     aesCipher.SetPadding(dongle.Zero)    //No、Empty、Zero、PKCS5、PKCS7、AnsiX923、  ISO97971
    6.     aesCipher.SetKey("1234567890123456") // key⻓度可以是16、24或32字节
    7.     aesCipher.SetIV("1234567890123456")  // iv长度固定为16字节,ECB模式下不需要设置iv,这里看情况用就行了,只是做一个演示
    8.     aesStr := dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToRawString()
    9.     fmt.Println("加密后的数据:", aesStr)
    10.     rawStr := dongle.Decrypt.FromRawString(aesStr).ByAes(aesCipher).ToString()
    11.     fmt.Println("解密后的数据:", rawStr)
    12. }
    复制代码

    当然如果你觉得乱码看着不舒服,还能换不同的输出,这里简单过一遍,知道即可
    1. func aesTest() {
    2.     fmt.Println("==========AES==========")
    3.     aesCipher := dongle.NewCipher()
    4.     aesCipher.SetMode(dongle.CBC)        //CBC、CFB、OFB、CTR、ECB
    5.     aesCipher.SetPadding(dongle.Zero)    //No、Empty、Zero、PKCS5、PKCS7、AnsiX923、  ISO97971
    6.     aesCipher.SetKey("1234567890123456") // key⻓度可以是16、24或32字节
    7.     aesCipher.SetIV("1234567890123456")  // iv长度固定为16字节,ECB模式下不需要设置iv,这里看情况用就行了,只是做一个演示
    8.     aesStr := dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToRawString()
    9.     fmt.Println("加密后的raw数据:", aesStr)
    10.     rawStr := dongle.Decrypt.FromRawString(aesStr).ByAes(aesCipher).ToString()
    11.     fmt.Println("解密后的raw数据:", rawStr)
    12.     aesStr = dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToBase64String()
    13.     fmt.Println("加密后的base64数据:", aesStr)
    14.     rawStr = dongle.Decrypt.FromBase64String(aesStr).ByAes(aesCipher).ToString()
    15.     fmt.Println("解密后的base64数据:", rawStr)
    16.     aesStr = dongle.Encrypt.FromString("hack").ByAes(aesCipher).ToHexString()
    17.     fmt.Println("加密后的hex数据:", aesStr)
    18.     rawStr = dongle.Decrypt.FromHexString(aesStr).ByAes(aesCipher).ToString()
    19.     fmt.Println("解密后的hex数据:", rawStr)
    20. }
    复制代码


    MD5碰撞工具开发

    需求:能够根据一个密码本对某个md5值进行碰撞解密
    思路:就是打开文件读取每一行,加密然后碰撞比较md5值是否正确
    比如我们输入top2k字典中最后一个密码作为md5值


    参考代码:(注意我加了一个时间计算,那个是可以不要的,我只是想看下计算时间有多长罢辽)
    1. func fuzzMd5(md5str string) {
    2.     open, err := os.Open("top2k.txt")
    3.     if err != nil {
    4.         fmt.Println(err)
    5.         return
    6.     }
    7.     defer open.Close()
    8.     scanner := bufio.NewScanner(open)
    9.     // 逐个读取分割后的内容
    10.     start := time.Now() // 获取当前时间
    11.     for scanner.Scan() {
    12.         passwd := scanner.Text()
    13.         passwdMD5 := dongle.Encrypt.FromString(passwd).ByMd5().ToHexString()
    14.         if string(passwdMD5) == md5str {
    15.             fmt.Printf("%v:%v\n", passwdMD5, passwd)
    16.             end := time.Now() // 获取当前时间
    17.             fmt.Println("耗时:", end.Sub(start).Seconds())
    18.             return
    19.         }
    20.     }
    21.     end := time.Now() // 获取当前时间
    22.     fmt.Println("耗时:", end.Sub(start).Seconds())
    23.     if err := scanner.Err(); err != nil {
    24.         fmt.Println("Error:", err)
    25.     }
    26. }
    复制代码
    main函数调用如下

    运行结果如下:

    这就是一个简单的md5碰撞工具了,目前所学知识还只能做到这样比较简陋,后面两期打算讲一个脚手架开发工具,加速开发的同时,可以让你自己写的命令行工具看起来就是一个完整的hacker工具了。
    以上就是基于Go语言开发一个编解码工具的详细内容,更多关于Go编解码的资料请关注脚本之家其它相关文章!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表