一尘不染

Go等同于Python的crypt.crypt?

go

我目前正在玩《暴力Python》一书中的示例。你可以在这里看到我的实现

我现在正在尝试在Go中实现相同的脚本以比较性能,请注意我对Go来说是全新的。打开文件并遍历各行很好,但是我无法弄清楚如何使用“
crypto”库以与Python的crypt.crypt(str_to_hash,salt)相同的方式对字符串进行哈希处理。我想可能是这样的

import "crypto/des"
des.NewCipher([]byte("abcdefgh"))

但是,没有雪茄。任何帮助将不胜感激,因为将Go的并行性能与Python的多线程进行比较非常有趣。

编辑: crypt.crypt的Python文档


阅读 249

收藏
2020-07-02

共1个答案

一尘不染

crypt 非常容易用cgo包装,例如

package main

import (
    "fmt"
    "unsafe"
)

// #cgo LDFLAGS: -lcrypt
// #define _GNU_SOURCE
// #include <crypt.h>
// #include <stdlib.h>
import "C"

// crypt wraps C library crypt_r
func crypt(key, salt string) string {
    data := C.struct_crypt_data{}
    ckey := C.CString(key)
    csalt := C.CString(salt)
    out := C.GoString(C.crypt_r(ckey, csalt, &data))
    C.free(unsafe.Pointer(ckey))
    C.free(unsafe.Pointer(csalt))
    return out
}

func main() {
    fmt.Println(crypt("abcdefg", "aa"))
}

运行时会产生这个

aaTcvO819w3js

与python相同 crypt.crypt

>>> from crypt import crypt
>>> crypt("abcdefg","aa")
'aaTcvO819w3js'
>>>

(已更新,以释放CStrings-感谢@ james-henstridge)

2020-07-02