Threefish adalah cipher blok yang dapat diubah yang dikembangkan sebagai bagian dari fungsi hash Skein sebagai pengajuan ke kompetisi fungsi hash NIST. Threefish mendukung ukuran blok 256, 512, dan 1024 bit.
Spesifikasi lengkap Threefish tersedia di catatan kaki 1 .
Vektor uji diekstraksi dari implementasi referensi terbaru 2 .
Loop enkripsi dan dekripsi telah dibuka gulungannya untuk memuat delapan putaran di setiap iterasi. Hal ini memungkinkan konstanta rotasi untuk tertanam dalam kode tanpa diulang. Praktek ini dijelaskan secara rinci dalam makalah 1 yang juga memberikan informasi kinerja rinci.
Untuk menginstal sebagai dependensi dalam proyek go:
go get -U github.com/schultz-is/go-threefish
Implementasi cipher dalam paket ini memenuhi antarmuka crypto/cipher
cipher.Block
. Instans yang dikembalikan oleh perpustakaan ini dapat digunakan dengan mode cipher blok apa pun yang mendukung ukuran blok 256, 512, atau 1024-bit.
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 )
}
Tes unit dapat dijalankan dan cakupan tes dapat dilihat melalui Makefile yang disediakan.
make test
make cover
Benchmark dapat dijalankan dan profil CPU dan memori dapat dihasilkan melalui Makefile yang disediakan.
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 ↩