Giter Site home page Giter Site logo

schultz-is / go-threefish Goto Github PK

View Code? Open in Web Editor NEW
2.0 1.0 0.0 47 KB

An implementation of the Threefish block cipher entirely in go with no external dependencies.

License: ISC License

Go 99.42% Makefile 0.58%
threefish cryptography crypto block-cipher block-ciphers

go-threefish's Introduction

go-threefish

Tests GoDoc Go Report Card License

Threefish is a tweakable block cipher that was developed as part of the Skein hash function as a submission to the NIST hash function competition. Threefish supports block sizes of 256, 512, and 1024 bits.

The full Threefish specification is available in the footnotes1.

Test vectors were extracted from the latest reference implementation2.

Encryption and decryption loops have been unrolled to contain eight rounds in each iteration. This allows rotation constants to be embedded in the code without being repeated. This practice is described in detail in the paper1 which also provides detailed performance information.

Installation

To install as a dependency in a go project:

go get -U github.com/schultz-is/go-threefish

Usage

The cipher implementations in this package fulfill the crypto/cipher cipher.Block interface. Instances returned by this library can be used with any block ciphers modes that support 256, 512, or 1024-bit block sizes.

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)
}

Testing

Unit tests can be run and test coverage can be viewed via the provided Makefile.

make test
make cover

Benchmarking

Benchmarks can be run and CPU and memory profiles can be generated via the provided Makefile.

make benchmark
go tool pprof cpu.prof
go tool pprof mem.prof

Performance

2020 Mac Mini M1

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

2019 MacBook Pro 2.3GHz Intel i9

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

Footnotes

  1. http://www.skein-hash.info/sites/default/files/skein1.3.pdf 2

  2. http://www.skein-hash.info/sites/default/files/NIST_CD_102610.zip

go-threefish's People

Contributors

schultz-is avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.