ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Go红队开发—编解码工具
[打印本页]
作者:
泉缘泉
时间:
8 小时前
标题:
Go红队开发—编解码工具
目录
开启一个项目
编解码工具开发
Dongle包
Base64编解码
摩斯密码
URL加解密
AES加解密
MD5碰撞工具开发
开启一个项目
这作为补充内容,可忽略直接看下面的编解码:
一开始用就按照下面的步骤即可
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工具了。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4