/* From: prometheus@olympus.uucp (prometheus) this program is a compact implementation of goppa codes with parameters m=10, t=37 for 32-bit machines. the decoding is due to nicholas patterson, algebraic decoding of goppa codes, itit 21 (1975), 203-207. the encoding is somewhat older. encoding takes a 654-bit message and produces a 1024-bit message. decoding can correct up to 37 bit errors. goppa g gfile sfile pfile mfile < gen: generates a code determined by gen. writes code to gfile (7k), sfile (53k), pfile (4k), mfile (82k). takes some time. encoding needs mfile. decoding needs gfile sfile pfile. gen should be roughly a quarter megabyte of random data. gen without enough random data may fail to generate a code. goppa will warn you in that case. goppa e mfile < plain > coded: encodes plain using mfile. plain is any number of 82-byte blocks. actually the two high bits of the last byte of each block are ignored: only 81 3/4 real bytes. you have to handle padding. coded is same number of 128-byte blocks. goppa d gfile sfile pfile < coded > plain: decodes coded using gfile, sfile, pfile. will correct up to 37 bit errors in each 128-byte block. goppa D gives some indication where bit errors are being corrected. this program can trivially be used as a public-key system, where mfile is the public key. all you have to do is add exactly 37 bit errors to each 128-byte block. without gfile sfile pfile, the best known method of decoding the result takes roughly 2^75 operations: millions of years even if you put thousands of computers together. of course if gen is known then gfile sfile pfile are known, so make sure gen is random. make sure it is cryptographically random because it is partly determined by mfile which is public. also anyone who can guess the placement of bit errors can decode the result. so make sure to place the bit errors very randomly. also anyone who can guess your input can check to see whether his guess is right. that's true of all public-key systems. the above use of goppa coding is credited to mceliece. see a public-key cryptosystem based on algebraic coding theory, deep space network progress report 42-44 (1978), jpl, 114-116. [stuff deleted. RMZ 1995] prometheus */ #define sf(a,b) (sc[a^b]^sx[sc[a^sx[b]]]^sy[sc[a^sy[b]]]) #include #define O 1024 #define K 654 #define L 82 #define T 37 typedef unsigned short us;int sy[O],sx[O],sc[O],si[O],ss[O];us g[T+1]; us sq[T][T];int pe[1024];char st[K][L],su[K][L],sv[K][L];sm(a,b){a= (a*(b&1))^(a*(b&2))^(a*(b&4))^(a*(b&8))^(a*(b&16))^(a*(b&32))^(a*(b&64)) ^(a*(b&128))^(a*(b&256))^(a*(b&512));b=(a>>10)^((a>>7)&8184)^(a&1023); return(b>>10)^((b>>7)&8184)^(b&1023);} natsex(h,a)us*h;{int i,b,c;b=0;c=ss[a];for(i=T;i>=0;--i)b=h[i]^sf(b,c); return b;}recsex(h,a)us*h;{int i,b,c;b=g[T];c=ss[a];for(i=T-1;i>=0;--i) {h[i]=b;b=g[i]^sf(b,c);}return b;}snmsex(h,f,q)us*h,*f,*q;{us t[T+T+T]; int i,j;for(i=0;i=T;--j)if(t[j])for(i=1;i<=T;++i)t[j-i ]^=sf(g[T-i],ss[t[j]]);for(i=0;i0;--i)if(h[i])break;d=ss[si[h[i]]];for (j=T;j>=T-i;--j)v[j]^=sf(h[j-T+i],d);q[T-i]=sf(1,d);for(;;){for(i=T-1;i >0;--i)if(v[i])break;if(i=0;--k){ w[k]=sf(h[i+k],d);if(w[k]){for(j=T-1;j>=k;--j){h[j]^=sf(v[j-k],ss[w[k]] );f[j]^=sf(q[j-k],ss[w[k]]);}}}for(i=0;i