Threefish เป็นบล็อกรหัสที่ปรับแต่งได้ ซึ่งได้รับการพัฒนาโดยเป็นส่วนหนึ่งของฟังก์ชันแฮช Skein เพื่อส่งเข้าร่วมการแข่งขันฟังก์ชันแฮชของ NIST Threefish รองรับขนาดบล็อก 256, 512 และ 1024 บิต
ข้อมูลจำเพาะของ Threefish ฉบับเต็มมีอยู่ในเชิงอรรถ 1
เวกเตอร์ทดสอบถูกดึงมาจากการดำเนินการอ้างอิงล่าสุด 2
ลูปการเข้ารหัสและการถอดรหัสได้รับการคลี่ออกเพื่อให้มีแปดรอบในแต่ละรอบซ้ำ ซึ่งช่วยให้สามารถฝังค่าคงที่การหมุนลงในโค้ดได้โดยไม่ต้องทำซ้ำ แนวทางปฏิบัตินี้ได้อธิบายไว้โดยละเอียดในเอกสารฉบับ ที่ 1 ซึ่งให้ข้อมูลประสิทธิภาพโดยละเอียดด้วย
หากต้องการติดตั้งเป็นการพึ่งพาในโปรเจ็กต์ go:
go get -U github.com/schultz-is/go-threefish
การใช้งานการเข้ารหัสในแพ็คเกจนี้ตอบสนองอินเทอร์เฟซ crypto/cipher
cipher.Block
อินสแตนซ์ที่ส่งคืนโดยไลบรารีนี้สามารถใช้กับโหมด Block Ciphers ที่รองรับขนาดบล็อก 256, 512 หรือ 1024 บิต
package main
import (
"crypto/cipher"
"crypto/rand"
"fmt"
"github.com/schultz-is/go-threefish"
)
func main () {
message := make ([] byte , 128 )
copy ( message , [] byte ( "secret message" ))
// Assign a key. Generally this is derived from a known secret value. Often
// a passphrase is derived using a key derivation function such as PBKDF2.
key := make ([] byte , 128 )
_ , err := rand . Read ( key )
if err != nil {
panic ( err )
}
// Assign a tweak value. This allows customization of the block cipher as in
// the UBI block chaining mode. Support for the tweak value is not available
// in the block ciphers modes supported by the standard library.
tweak := make ([] byte , 16 )
_ , err = rand . Read ( tweak )
if err != nil {
panic ( err )
}
// Instantiate and initialize a block cipher.
block , err := threefish . New1024 ( key , tweak )
if err != nil {
panic ( err )
}
// When using CBC mode, the IV needs to be unique but does not need to be
// secure. For this reason, it can be prepended to the ciphertext.
ciphertext := make ([] byte , block . BlockSize () + len ( message ))
iv := ciphertext [: block . BlockSize ()]
_ , err = rand . Read ( iv )
if err != nil {
panic ( err )
}
mode := cipher . NewCBCEncrypter ( block , iv )
mode . CryptBlocks ( ciphertext [ block . BlockSize ():], message )
fmt . Printf ( "%x n " , ciphertext )
}
สามารถรันการทดสอบหน่วยได้ และสามารถดูความครอบคลุมของการทดสอบได้ผ่าน Makefile ที่ให้มา
make test
make cover
สามารถเรียกใช้เกณฑ์มาตรฐานและสามารถสร้างโปรไฟล์ CPU และหน่วยความจำผ่าน Makefile ที่ให้มาได้
make benchmark
go tool pprof cpu.prof
go tool pprof mem.prof
name time/op speed
Threefish256/encrypt-8 85 ns 372 MB/s
Threefish256/decrypt-8 111 ns 287 MB/s
Threefish512/encrypt-8 234 ns 272 MB/s
Threefish512/decrypt-8 363 ns 175 MB/s
Threefish1024/encrypt-8 581 ns 220 MB/s
Threefish1024/decrypt-8 685 ns 186 MB/s
name time/op speed
Threefish256/encrypt-16 124 ns 259 MB/s
Threefish256/decrypt-16 156 ns 206 MB/s
Threefish512/encrypt-16 338 ns 189 MB/s
Threefish512/decrypt-16 310 ns 206 MB/s
Threefish1024/encrypt-16 804 ns 159 MB/s
Threefish1024/decrypt-16 778 ns 165 MB/s
http://www.skein-hash.info/sites/default/files/skein1.3.pdf ↩ ↩ 2
http://www.skein-hash.info/sites/default/files/NIST_CD_102610.zip ↩