Go与Python的crypt.crypt等价吗? [英] What is Go's equivalent to Python's crypt.crypt?

查看:204
本文介绍了Go与Python的crypt.crypt等价吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在玩暴力Python一书中的一个例子。您可以在这里



我现在试图在Go中执行相同的脚本来比较性能,注意我对Go完全陌生。打开文件并遍历行很好,但是我不知道如何使用加密库来加密字符串,就像Python的crypt.crypt(str_to_hash,salt)一样。我认为它可能类似于

  importcrypto / des
des.NewCipher([] byte(abcdefgh ))

然而,没有雪茄。任何帮助将非常值得赞赏,因为将Go的并行性能与Python的多线程进行比较将会非常有趣。

编辑:
Python文档crypt.crypt

解决方案

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

 包主

导入(
fmt
unsafe


// #cgo LDFLAGS:-lcrypt
// #define _GNU_SOURCE
// #include< crypt。 h取代;
//#包括< stdlib.h>
导入C

// crypt封装C库crypt_r
func crypt(键,盐串)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))
返回
}

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

运行时产生此结果

  aaTcvO819w3js 

这与python crypt.crypt

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

(更新为释放CStrings - thanks @ james-henstridge)


I am currently playing around with an example from the book Violent Python. You can see my implementation here

I am now trying to implement the same script in Go to compare performance, note I am completely new to Go. Opening the file and iterating over the lines is fine, however I cannot figure out how to use the "crypto" library to hash the string in the same way as Python's crypt.crypt(str_to_hash, salt). I thought it maybe something like

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

However, no cigar. Any help would be much appreciated as it'd be really interesting to compare Go's parallel performance to Python's multithreaded.

Edit: Python docs for crypt.crypt

解决方案

crypt is very easy to wrap with cgo, eg

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"))
}

Which produces this when run

aaTcvO819w3js

Which is identical to python crypt.crypt

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

(Updated to free the CStrings - thanks @james-henstridge)

这篇关于Go与Python的crypt.crypt等价吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆