Implementation of a Generalized-Feistel Cipher for generating random permutations.
Project description
🎲 gfc — fast & lazy random permutations
gfc is a C implementation of a Generalized-Feistel Cipher [1, alg. 3] for generating random permutations.
It uses Speck 64/128 as the random function, and can generate permutations with up to 2^64
elements.
The permutation is computed, and reversed, on-the-fly, without any mutable state and by using very little memory.
Usage
C / C++
API
#include <gfc/gfc.h>
GFC* gfc_init(uint64_t range, uint64_t rounds, uint64_t seed);
void gfc_destroy(GFC* gfc);
uint64_t gfc_decrypt(const GFC* gfc, uint64_t m);
uint64_t gfc_encrypt(const GFC* gfc, uint64_t m);
Example
// main.c
// gcc -Iinclude/ src/gfc.c main.c -o main
#include <assert.h>
#include <gfc/gfc.h>
int main() {
GFC* gfc = gfc_init(65536, 6, 42);
for (uint64_t i = 0; i < 65536; i++) {
uint64_t enc = gfc_encrypt(gfc, i);
uint64_t dec = gfc_decrypt(gfc, enc);
assert(enc != i);
assert(dec == i);
}
gfc_destroy(gfc);
return 0;
}
CMake Integration
cmake_minimum_required(VERSION 3.12)
project(example)
add_subdirectory(gfc)
add_executable(main main.c)
target_link_libraries(main PRIVATE gfc)
git submodule add https://github.com/maxmouchet/gfc.git
mkdir build && cd build
cmake .. && cmake --build .
./main
Python
pip install pygfc
from pygfc import Permutation
# Permutation(range, rounds, seed)
perm = Permutation(2 ** 16, 8, 42)
assert set(perm) == set(range(2 ** 16))
assert all(perm.inv(perm[i]) == i for i in range(2 ** 16))
Dependencies
The Speck implementation is from madmo/speck and is licensed under the ISC license (MIT-compatible).
References
[1] Black, John, and Phillip Rogaway. "Ciphers with arbitrary finite domains." Cryptographers’ track at the RSA conference. Springer, Berlin, Heidelberg, 2002. https://web.cs.ucdavis.edu/~rogaway/papers/subset.pdf
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for pygfc-1.0.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3d084840e9fb691825f032484f087019847c254774a2683fc70a6a8117819c0f |
|
MD5 | f541e8b46c776f9c93045881724e5610 |
|
BLAKE2b-256 | a67b97855362cf0f426fa3e909a4fe63c3dc6735971f12d69635e8b6600b51a6 |
Hashes for pygfc-1.0.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 48a5ab7f965e6bdedfe44472c50600419914eb62bfc1b022ae3506526f651e30 |
|
MD5 | 9ce5169e51d32f28a594bb1ef6eb62ad |
|
BLAKE2b-256 | 705e5a73f79b36df09f39f3ff787d1420c69b5b493946dcea832143ba3df273a |
Hashes for pygfc-1.0.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 71cdca5c12e7b9e5278d92590af8ae8a521a272a6ceb8ad29441323ec8e560c8 |
|
MD5 | 6379c1a9f3991ae0d600fe0eee1940a9 |
|
BLAKE2b-256 | 159fd3c6ea69c3c1d9d5ab5aa4980a8a5a7d9e336be3b9f6cabcf42fb76027ec |
Hashes for pygfc-1.0.4-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d96e9f9daffff7338f5a94b55f333fd5bc608738593847df86b71d8ba6db1323 |
|
MD5 | 36e590d736d42113433a9932b661847e |
|
BLAKE2b-256 | 2f4fb29bc5978b4f07edc8c612497298f51d5dc1d7f9b35d79f8f38e3097bbe2 |
Hashes for pygfc-1.0.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f23d6e83ee8d18d4819ee8666ae6e584dc8e1f09c909f993787627032ed51f40 |
|
MD5 | d6fb7492832115db49b484a6372ea01f |
|
BLAKE2b-256 | 565a07902f1fd0dbbd4e099338d66171c1c4b0d3d5dc6a0c8b8cd60aba5b325d |
Hashes for pygfc-1.0.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 778f7f08ee8e348d8d46fe2dde9cd35b6f10e8e8d59c4c27632c8ff05758e4f3 |
|
MD5 | 2cdd184c70945a8f94360f1ddafb365d |
|
BLAKE2b-256 | 3a22098e8ca4b8f86139c50c5d2913c5873de9628d3bbe2e704860359be008bd |
Hashes for pygfc-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7cf080415c53369537a7d17cba2eacf2c0ef51d13d9cefc7d4c66b0a0f71112d |
|
MD5 | cd7ca4d4deeb665b4edf471beaf3a19f |
|
BLAKE2b-256 | 74e1f5d068bf7d7ca84dfcf52ab4bdad7598aeaac690e5aa7f36e769cdc72752 |
Hashes for pygfc-1.0.4-cp310-cp310-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f1a616c606ac85161c9cf06a7f5cc3f1ac9464023edd36cd107dcc67ccf5ed3c |
|
MD5 | db7f23b822fe8bd01badd5ecb0645722 |
|
BLAKE2b-256 | 789e2535505fd12b4f119bdf62ea769b7119884888d81e1bfe71e9bafa1940bb |
Hashes for pygfc-1.0.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bc3457c83dd2a71d5bd449a30912be95067aad99ddcb6b666b0bd76da48c836c |
|
MD5 | b413769796ef4f1d09b97af62279fcdd |
|
BLAKE2b-256 | f93b48f465ec4b9ba182ea3d638fb4ea20ba37c6929d9b750cddb9f209e59cf7 |
Hashes for pygfc-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c5e90e07d5a80f90cc08a1790d215176635795bc8ce62fdcd9ac247ec6921945 |
|
MD5 | 5fde0ad327137b0a27c9ad05d2a0fd4c |
|
BLAKE2b-256 | f207dac750814f5619f170e04c2a25d2f8473b146d6010066889062e01f11470 |
Hashes for pygfc-1.0.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 36e7d2f707d4805fc1e0b30b09da1354cab9e8525d2d36298fbe351a06c7b637 |
|
MD5 | dcfb8f3057753c5b19a4a9e02a55e0f4 |
|
BLAKE2b-256 | e0d446d0fa40e9b693d463b164a97cbf52b4d04ebd26b8cbfb4989dc2f6505f6 |
Hashes for pygfc-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f9a7da4663555283ef394ac66da9ef224c773b7b7e34da03f166b8ac02f153f7 |
|
MD5 | 209ea03ec0b7889072e9e1f4fa206bcc |
|
BLAKE2b-256 | 61571975c056feb7b4d386729b57cf6dc3d1aae293d5e0cae92130cabebfde48 |
Hashes for pygfc-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a1327d6d4a400a7101cd555bc738f2a8fe3a72f8b3e739231af0c58fe46c66bd |
|
MD5 | 02646022c188ae55b52fb34ac0004bb2 |
|
BLAKE2b-256 | 3ff26503899c85cfd5b09f2abc043a16d58e8f78d54834967ee4b00e891bef8d |
Hashes for pygfc-1.0.4-cp39-cp39-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ec43fc83e9a90c6b571cb16770d3246cbd09c77fb1dea67e5396e95d115e7422 |
|
MD5 | ca27a3bc7d2d9ec1151d6d363cd0b124 |
|
BLAKE2b-256 | e064b714faf1fbceb0193f2934e4240ef8ce6afef3c53339da196f2e4fce8372 |
Hashes for pygfc-1.0.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 584b931540733135fc31e0e2859d588fca09f164b6f70837bebb708ae984886b |
|
MD5 | 9c32c7704454c9ab15007464e54dd6e7 |
|
BLAKE2b-256 | 9a55ebcee5b8ca7cca06e0999e144924ae66aa7111b86ec6a700458852d74fae |
Hashes for pygfc-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1c2b22b2c041cf8ea7e8e265f4221ae81ebf919f2fffc8dfd376d9158aaabcab |
|
MD5 | 3d6e44c6777696991ba5b3ce1db815c2 |
|
BLAKE2b-256 | d06b420fa35e7d71248d38d0f4cee0aa93e72f0b08024d6a18e10d2c9f6b6260 |
Hashes for pygfc-1.0.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ebc6de93bcf326e5d97fd9e2db2950737dbaab399057046a8c47086872e7aa8c |
|
MD5 | 276528e2d510edf4cef216a6edea77ee |
|
BLAKE2b-256 | f20b1f48d09559f190a531a49bad40ba89d23137c54ba67827fcaf8d660375fb |
Hashes for pygfc-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d628f706240237a9bf7ca8cf5b02e640e4bf62bdc6d578162d6215f412a20377 |
|
MD5 | 7991cb220681a42c8ac83ee018558237 |
|
BLAKE2b-256 | d80010284bbd00751a2193f459b09dc74bef74b616dabc5253eb78666d3d9708 |
Hashes for pygfc-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 694d5559b9d304f4190f347d3f45051980c5e72232e5a67397b77c4314af60ee |
|
MD5 | 9133abfc9b27b5fe1fc4a3b907408bb0 |
|
BLAKE2b-256 | 98696a2370b8ef7acbbdf1af56652b5d82d9b2d4e3c413c544065f889e6c9717 |
Hashes for pygfc-1.0.4-cp38-cp38-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 79e1d919d68a615da269f5efefea78633c75c3e03def55ee972b8fd4260de9f9 |
|
MD5 | 5e051b84aa9c8fa26567b36515486103 |
|
BLAKE2b-256 | 07d78c0bb1db443d2a73ed19234a49c54c381d06c6942e2a8292ead6f6f13972 |
Hashes for pygfc-1.0.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c676a0f49c8e731e84be5b6cb6089a804f134129caeae3a48529cbfd28e0cd91 |
|
MD5 | e743c1c5d9ce21d027a502313582d473 |
|
BLAKE2b-256 | 913c3d600b2647e61f887010509107777b4e6e39ff7abb8cbb831d24db0aa95f |
Hashes for pygfc-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 563c3493b4ff52baa2f0fa33711cc68887b3c5f708525704acdb4ef8d4e27c18 |
|
MD5 | d7541a43454324f5d46bae35a42f996b |
|
BLAKE2b-256 | 1d62138d3110f9333a6eda5a99e3575764f56cf8ef3c8ba78662c8c2135b3c0c |
Hashes for pygfc-1.0.4-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1dc16db9d8efe1dfde1989a5ea3d831678b4a4ecb46f6e10e56f5eb992e6a60f |
|
MD5 | 885b0e9211cba5869ad7a42e293227c8 |
|
BLAKE2b-256 | d8e050056e8edd08b807f8e35f22f7a954ab0b0c0250aa29231311a976e70054 |
Hashes for pygfc-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b008b429d802d2d6396b3d7357c4ee123e43857b3d027c42e33db41341704673 |
|
MD5 | 7983bd728117a7655f51111a90ab644e |
|
BLAKE2b-256 | f03a69d5f11508cd769e6254af53835a1628e044a916ff7cf1515731674bd303 |
Hashes for pygfc-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6bc3b72f4f27cf68452c867e8e03c3b9645ca20db7b3b176453dc05f1bf3dd75 |
|
MD5 | d653ac769b5b85a55501dc7cfda78857 |
|
BLAKE2b-256 | 41188727d88e413fa6f2e363e4848edcb7c203e9a7b204761388b7d18707f43f |
Hashes for pygfc-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d5502439e75b748f60f529dbad727cdb1fe6802466a4e58f4e0b71e91a3f4486 |
|
MD5 | 26bbbee8ba4915aaa6c51c7aaf3dbfbd |
|
BLAKE2b-256 | 26ced75f892bb8fb702eba33df898bbff214287120e6fd0e67eee43242cfc731 |
Hashes for pygfc-1.0.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f2db7366bde584a0335d9039942c1c346391bbc28b24a50baeb03ead142bb1aa |
|
MD5 | e0138a6704d253da0ff36560089c5718 |
|
BLAKE2b-256 | 6b2b53334534ce1e5f41fb533174492d9448409606a819c4881a7b69b516b26a |
Hashes for pygfc-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7784fdd16beb8f2b26e0a34b7d648d6df582cf7a136f57675887e4587bacf3fc |
|
MD5 | 5d1a98a7d36221558b35a8d540fdf6cb |
|
BLAKE2b-256 | 58cb3f54fb8dc1adf37ddb449072923c0990014dd44c3428bc126e4e7e82fbd2 |
Hashes for pygfc-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f2d11ccfad416aff465873e9dbb412db4a977d01e69a214e50f55028c028cb82 |
|
MD5 | 5871718577ebd941f0721e9544b8dd06 |
|
BLAKE2b-256 | bca12b4e4e252258d405e24987ddc4d91cd1cb7051aeba3b2d1bbea4bac491d7 |
Hashes for pygfc-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 51947679b66afbe198b81f5da7a8103dc592f724fc9434b8624af8d5ef85f184 |
|
MD5 | cfc8a78c1268afffac2bfd030d168823 |
|
BLAKE2b-256 | 6fcda046bfec74fc69f4e350d4314781d95af990ea3f5420ca162e98606d9fa4 |
Hashes for pygfc-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d27cdc9faece3102f27f9b7aff4ba493fd64a2f69cdb67cf74fc1f4e91b401c6 |
|
MD5 | da04619b58937583d77007ff1234e52e |
|
BLAKE2b-256 | 3895a22c044cdddb972c80d57a5f50c7fe15402926f3714b6d117bb16697b912 |
Hashes for pygfc-1.0.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2e177f042e5fce2c3aabcf91227b59659e314990befaab385d1b009123bd30da |
|
MD5 | 917de0bf0b0d10b8bd4423b9750c893f |
|
BLAKE2b-256 | 87f2eaa714567aec4a8889e3a57cb6bd4cfcb7e79739d68315209f429067bdf2 |
Hashes for pygfc-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b87d039e228df540f27f554a02c15acb23adc6208aa03e6956cd797995b3c041 |
|
MD5 | e71f2b917a7a7b0ce83e4209e8f71e14 |
|
BLAKE2b-256 | ef9d0006ff4bc4db2655962edf79827fc6ace15017946ff3f5bdacd3d7609b73 |
Hashes for pygfc-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 353ffd7d0f4a0c2a9ac0fe0405f68c5d72b783d6ff366ca0666078a1440110cd |
|
MD5 | b11da91b2052f86cd2dc4d6c4d8e40b4 |
|
BLAKE2b-256 | 83668884425464257bbadfb466ae5abe6f67e6d89b8aeab2dddb24999ff9bd3e |