5

私は現在、ViolentPythonという本の例で遊んでいます。ここで私の実装を見ることができます

私は現在、パフォーマンスを比較するためにGoで同じスクリプトを実装しようとしていますが、Goはまったく新しいことに注意してください。ファイルを開いて行を繰り返すことは問題ありませんが、Pythonのcrypt.crypt(str_to_hash、salt)と同じように、「crypto」ライブラリを使用して文字列をハッシュする方法がわかりません。多分それは次のようなものだと思いました

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

しかし、葉巻はありません。Goの並列パフォーマンスをPythonのマルチスレッドと比較することは非常に興味深いので、どんな助けでも大歓迎です。

編集: crypt.cryptのPythonドキュメント

4

4 に答える 4

3

現在、昔ながらのUnixの「ソルト」DESベースのcrypt()機能を実装するGo用の公開パッケージはないと思います。これは、"crypto/des"パッケージに実装されている通常の対称DES暗号化/復号化とは異なります(ご存知のとおり)。

自分で実装する必要があります。FreeBSDソースglibcなど、さまざまな言語(主にC)での既存の実装はたくさんあります。Goで実装する場合は、公開してください。:)

新しいプロジェクトでは、 bcryptなどのより強力なパスワードハッシュアルゴリズムを使用することをお勧めします。優れた実装はgo.cryptoリポジトリで利用できます。ドキュメントはこちらから入手できます。残念ながら、既存のレガシーパスワードハッシュを使用する必要がある場合、これは役に立ちません。

追加するために編集:Pythonのcrypt.crypt()実装を調べたところ、それがlibc実装の単なるラッパーであることがわかりました。Goに同じラッパーを実装するのは簡単です。ただし、Python実装をGo実装と比較するというあなたの考えはすでに台無しになっています。意味のある比較を行うには、両方を自分で実装する必要があります。

于 2013-01-01T17:59:20.323 に答える
3

cryptcgoでラップするのは非常に簡単です。

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に感謝します)

于 2013-01-01T18:41:00.723 に答える
2

例えば

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


出力:

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!?!"
于 2013-01-01T11:28:52.117 に答える
2

朗報です!実際には、探しているもののオープンソース実装があります。Osutilcryptには、純粋なGoで再実装するcryptパッケージがあります。

https://github.com/kless/osutil/tree/master/user/crypt

于 2016-03-25T21:53:01.980 に答える