Harpocrates - An Efficient Encryption for Data-at-rest
harpocrates
is an implementation of an efficient algorithm for encrypting data-at-rest. Each message block ( 16 -bytes ) can be independently encrypted/ decrypted, given that (inverse) look up table ( read LUT ) has already been generated. State size of this lightweight cipher is only 128 -bit & it's powered by substitution convolution network ( read SCN ). Only substitution, bit shifting, bit rotation & XOR are used as primitive operations.
Note, (inv) LUT generation is one-time operation.
Here I'm keeping a zero-dependency, easy-to-use C++ header-only library ( using C++20 features ), implementing Harpocrates specification, as described here. This implementation can be compiled targeting both CPUs, GPUs ( using SYCL ).
- Ensure you've C++ compiler such as
g++
/clang++
, along with C++20 standard library
I'm using
$ g++ --version
g++ (Ubuntu 11.2.0-19ubuntu1) 11.2.0
- You'll also need to have standard system development utilities such as
make
/cmake
I'm using
$ make --version
GNU Make 4.3
$ cmake --version
cmake version 3.22.1
- For benchmarking Harpocrates implementation on CPU, you need to have
google-benchmark
library globally installed; see this
For testing functional correctness of Harpocrates cipher implementation, issue following command, which runs two kinds of tests
- Asserting results against Known Answer Tests ( read KATs ) supplied with Harpocrates specification [ Correctness & Conformance ]
- With randomly generated message blocks, attempt to execute encrypt -> decrypt cycle [ Correctness ]
make
For benchmarking Harpocrates cipher implementation, using single message block ( 16 -bytes ), on CPU, issue
make benchmark
2022-05-12T20:24:55+05:30
Running ./bench/a.out
Run on (4 X 1800 MHz CPU s)
Load Average: 3.25, 0.98, 0.57
------------------------------------------------------------------------------
Benchmark Time CPU Iterations UserCounters...
------------------------------------------------------------------------------
harpocrates_encrypt 2349 ns 2349 ns 296555 bytes_per_second=6.49583M/s
harpocrates_decrypt 2317 ns 2317 ns 302110 bytes_per_second=6.58582M/s
harpocrates
being C++ header-only library, using it's as easy as including ./include/harpocrates.hpp
in your program, while asking your compiler to include ./include
in its INCLUDE_PATH ( using -I
flag ).
- Ideally you'd want to use
harpocrates_utils::
namespace for generating (inv)LUT, which is one-time process ( in pre-compute phase ) - After that you'll only need
harpocrates::
namespace, which implementsencrypt
/decrypt
routines - You may also want to see
harpocrates_common::
namespace, which defines some constants
I've kept harpocrates
API usage example here.