Threefish es un cifrado de bloque modificable que se desarrolló como parte de la función hash Skein como presentación a la competencia de función hash del NIST. Threefish admite tamaños de bloque de 256, 512 y 1024 bits.
La especificación completa de Threefish está disponible en las notas a pie de página 1 .
Los vectores de prueba se extrajeron de la última implementación de referencia 2 .
Los bucles de cifrado y descifrado se han desenrollado para contener ocho rondas en cada iteración. Esto permite incrustar constantes de rotación en el código sin repetirlas. Esta práctica se describe en detalle en el documento 1 , que también proporciona información detallada sobre el rendimiento.
Para instalar como una dependencia en un proyecto go:
go get -U github.com/schultz-is/go-threefish
Las implementaciones de cifrado en este paquete cumplen con la interfaz crypto/cipher
cipher.Block
. Las instancias devueltas por esta biblioteca se pueden utilizar con cualquier modo de cifrado de bloques que admita tamaños de bloques de 256, 512 o 1024 bits.
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 )
}
Se pueden ejecutar pruebas unitarias y se puede ver la cobertura de la prueba a través del Makefile proporcionado.
make test
make cover
Se pueden ejecutar puntos de referencia y se pueden generar perfiles de CPU y memoria a través del Makefile proporcionado.
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 ↩