首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go相当于Python的crypt.crypt是什么?

Go相当于Python的crypt.crypt是什么?
EN

Stack Overflow用户
提问于 2013-01-01 19:11:32
回答 4查看 1.4K关注 0票数 5

我目前正在研究“暴力巨蟒”一书中的一个例子。您可以查看我的实现here

我现在正在尝试在Go中实现相同的脚本来比较性能,注意我是一个全新的Go。打开文件并遍历每行代码都很好,但是我不知道如何使用"crypto“库以与Python的crypt.crypt(str_to_hash,salt)相同的方式对字符串进行散列。我想也许是这样的

代码语言:javascript
复制
import "crypto/des"
des.NewCipher([]byte("abcdefgh"))

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

编辑:Python docs for crypt.crypt

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-02 02:41:01

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

代码语言:javascript
复制
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"))
}

它会在运行时生成以下代码

代码语言:javascript
复制
aaTcvO819w3js

,它与python crypt.crypt相同。

代码语言:javascript
复制
>>> from crypt import crypt
>>> crypt("abcdefg","aa")
'aaTcvO819w3js'
>>> 

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

票数 3
EN

Stack Overflow用户

发布于 2013-01-02 01:59:20

我相信目前还没有任何可公开使用的Go包,它实现了老式的Unix“加盐”的基于DES的crypt()功能。这不同于通常的对称DES加密/解密,后者是在"crypto/des"包中实现的(正如您已经发现的那样)。

你必须自己去实现它。有很多不同语言的现有实现(主要是C语言),例如FreeBSD sourcesglibc。如果你在Go中实现它,请发布它。:)

对于新项目,最好使用一些更强的密码散列算法,例如bcryptgo.crypto存储库中提供了一个很好的实现。文档可以在here上找到。不幸的是,如果您需要使用预先存在的遗留密码散列,这并没有什么帮助。

编辑后添加:我查看了Python实现,发现它只是crypt.crypt()实现的包装器。为Go实现相同的包装器会很简单。但是,将Python实现与Go实现进行比较的想法已经付诸东流:您必须自己实现和Go,才能进行有意义的比较。

票数 3
EN

Stack Overflow用户

发布于 2013-01-01 19:28:52

例如。

代码语言:javascript
复制
package main

import (
        "crypto/des"
        "fmt"
        "log"
)

func main() {
        b, err := des.NewCipher([]byte("abcdefgh"))
        if err != nil {
                log.Fatal(err)
        }

        msg := []byte("Hello!?!")
        fmt.Printf("% 02x: %q\n", msg, msg)
        b.Encrypt(msg, msg)
        fmt.Printf("% 02x: %q\n", msg, msg)
        b.Decrypt(msg, msg)
        fmt.Printf("% 02x: %q\n", msg, msg)
}

(另请参阅:http://play.golang.org/p/czYDRjtWNR)

输出:

代码语言:javascript
复制
48 65 6c 6c 6f 21 3f 21: "Hello!?!"
3e 41 67 99 2d 9a 72 b9: ">Ag\x99-\x9ar\xb9"
48 65 6c 6c 6f 21 3f 21: "Hello!?!"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14109915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档