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
. يمكن استخدام المثيلات التي تم إرجاعها بواسطة هذه المكتبة مع أي أوضاع تشفير كتلة تدعم أحجام كتلة 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
يمكن تشغيل المعايير وإنشاء ملفات تعريف وحدة المعالجة المركزية والذاكرة عبر ملف 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 ↩