cryptest

Cryptography-related scribbles
git clone git://git.finwo.net/misc/cryptest
Log | Files | Refs | README

commit 531149cecf7ba7aad2d3e8594bd61f5bf50de3c7
parent 37942803e44b642ae449f35cc5e03bd59fcfda5e
Author: finwo <finwo@pm.me>
Date:   Thu, 10 Aug 2017 19:28:31 +0200

functional

Diffstat:
Minc/base.h | 3+++
Msrc/decrypt.c | 35+++++++++++++++++++++++++++++++++++
Msrc/encrypt.c | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 108 insertions(+), 0 deletions(-)

diff --git a/inc/base.h b/inc/base.h @@ -2,6 +2,9 @@ extern "C" { #endif +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)>(b))?(a):(b)) + unsigned int atoui( char *in ); int encrypt( unsigned int mult, unsigned int modulo, unsigned int padding ); diff --git a/src/decrypt.c b/src/decrypt.c @@ -2,10 +2,45 @@ extern "C" { #endif +#include <stdio.h> + #include "base.h" int decrypt( unsigned int mult, unsigned int modulo, unsigned int padding ) { + // Initialize variables + unsigned long long seed = 0; + unsigned long long obuf = 0; + int obuf_len = 0; + int i, c; + + // Read padding & build seed + padding--; + seed = fgetc(stdin); + while( padding-- ) { + seed = seed * mult; + seed = seed % modulo; + c = (seed%256) ^ fgetc(stdin); + seed ^= c; + } + + while( 1 ) { + c = fgetc(stdin); + if(c==EOF) break; + seed *= mult; + seed += c; + seed = seed % modulo; + obuf = obuf << 7; + obuf &= ~127; + obuf |= seed%128; + obuf_len += 7; + if(obuf_len>=8) { + fputc( (obuf>>(obuf_len-8))%256, stdout ); + obuf_len-=8; + } + } + + return 0; } #ifdef __cplusplus diff --git a/src/encrypt.c b/src/encrypt.c @@ -2,10 +2,80 @@ extern "C" { #endif +#include <stdio.h> + #include "base.h" int encrypt( unsigned int mult, unsigned int modulo, unsigned int padding ) { + // Initialize variables + unsigned long long seed = 0; + unsigned long long ibuf = 0; + int flags = 2; // 1=running, 2=input + int c,e, ibuf_len = 0; + + // Randomize the 'rand' call + srandom((unsigned)time(NULL)); + for( seed = 5000; seed; rand(), seed-- ); + + // Ensure padding + while( padding-- ) { + if ( flags & 1 ) { + seed = seed * mult; + seed = seed % modulo; + seed = seed ^ ( random() % 256 ); + fputc( seed % 256, stdout ); + } else { + seed = random() % 256; + fputc( seed, stdout ); + flags |= 1; + } + } + + // Start encoding + while( flags & 1 ) { + + // Handle stdin + if ( ( flags & 2 ) && ( ibuf_len < 7 ) ) { + if ( (c=fgetc(stdin)) == EOF ) { + flags &= ~2; + } else { + ibuf = ibuf << 8; + ibuf &= ~255; + ibuf |= c; + ibuf_len += 8; + } + } + + // Pre-step seed + seed *= mult; + + // Fetch input + c = ( (ibuf%(1<<ibuf_len)) << 7 ) >> ibuf_len; + ibuf_len -= 7; + + // Try the fast method + e = ( ((seed+c)%modulo)%128 ) - c; + + // Feedback-based encoding + if( ( (seed+e)%modulo)%128 != c ) { + e = 0; + while( ( (seed+e)%modulo)%128 != c ) e++; + } + + // Output + fputc( e, stdout ); + + // Post-step seed + seed = (seed+e)%modulo; + + // EOF detection + if( ibuf_len <= 0 && !(flags&2) ) { + flags &= ~1; + } + } + + return 0; } #ifdef __cplusplus