Go红队开发—编解码工具

文章目录

开启一个项目

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

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

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

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

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

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

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

编解码工具开发

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

Dongle包

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

encode / decode

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

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

go 复制代码
//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转字符

go 复制代码
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测试函数。

go 复制代码
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加解密

参考代码

go 复制代码
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 加密有模式,所以要设置一个模式填充方式

完整代码

go 复制代码
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)

}

当然如果你觉得乱码看着不舒服,还能换不同的输出,这里简单过一遍,知道即可

go 复制代码
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值

参考代码:(注意我加了一个时间计算,那个是可以不要的,我只是想看下计算时间有多长罢辽)

go 复制代码
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工具了。

相关推荐
DevSecOps选型指南4 分钟前
2025软件供应链安全最佳实践︱证券DevSecOps下供应链与开源治理实践
网络·安全·web安全·开源·代码审计·软件供应链安全
ABB自动化5 分钟前
for AC500 PLCs 3ADR025003M9903的安全说明
服务器·安全·机器人
军训猫猫头7 分钟前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
恰薯条的屑海鸥15 分钟前
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
数据库·学习·安全·web安全·渗透测试·网络安全学习
咖啡啡不加糖18 分钟前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
liuyang-neu22 分钟前
java内存模型JMM
java·开发语言
大鸡腿同学42 分钟前
纳瓦尔宝典
后端
阿部多瑞 ABU1 小时前
主流大语言模型安全性测试(三):阿拉伯语越狱提示词下的表现与分析
人工智能·安全·ai·语言模型·安全性测试
roman_日积跬步-终至千里2 小时前
【Go语言基础【14】】defer与异常处理(panic、recover)
golang