commit 531149cecf7ba7aad2d3e8594bd61f5bf50de3c7
parent 37942803e44b642ae449f35cc5e03bd59fcfda5e
Author: finwo <finwo@pm.me>
Date: Thu, 10 Aug 2017 19:28:31 +0200
functional
Diffstat:
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