A data base B contains four files
Let the prime divisors be the read sub keys.
Encipher the data base using the Chinese remainder theorem and determine the Cipher text
Convert each in base 2 to base 10 prior to doing the problem, then set up each congruence where and solve for .
Given files in a database and prime divisors(read sub keys), write a general program(in any language) to encipher the data base using the Chinese remainder theorem and determine the Cipher text . Do not use any predefined functions or procedures.
This section requires Javascript.
You are seeing this because something didn't load right. We suggest you, (a) try
refreshing the page, (b) enabling javascript if it is disabled on your browser and,
finally, (c)
loading the
non-javascript version of this page
. We're sorry about the hassle.
I wrote the program in Free Pascal:
B e g i n p r o b l e m
I moved functions, procedures and types from my unit(mathunit) into the main program.
Solve each congruence X ≡ b j m o d m j where ( 1 < = j < = n ) and ( m j , m k ) = 1 for j < > k and each b j has been converted to base 1 0 .
program Applicationextensionforcheckingfunctions;
uses crt;
type chinesearray = array[1 .. 10000] of longint;
var n:longint;
function INTpower(base,exponent:integer):longint;
var product,k:longint;
begin{INTpower}
product:= 1;
end;{INTpower}
function prime(p:integer):boolean;
var n:integer;
procedure safeguard;
var j,k:longint;
begin
bool:= true;
for j:= 1 to n do
begin
for k:= j + 1 to n do
begin
if m[j] = m[k] then
bool:= false;
end;
end;
end;
procedure checkprimes;
var k,j:longint;
begin
bool2:= true;
for j:= 1 to n do
begin
if not(prime(m[j])) then
begin
bool2:= false;
end;
end;
end;
PROCEDURE GETSTRLIST(STRVAR:string; VAR STRITEM:STRTYPE; NUMTERMS:INTEGER);
VAR STR,STRSUM:string;
BEGIN
STR:= STRVAR;
SIZESTR:= LENGTH(STR);
N:= 1;
FOR K:= 1 TO NUMTERMS DO
BEGIN
STRSUM:= '';
IF STR[N] = ' ' THEN N:= N + 1;
WHILE (STR[N] <> ' ') AND (N <= SIZESTR) DO
BEGIN
STRSUM:= STRSUM + STR[N];
N:= N + 1;
END;
STRITEM[K]:= STRSUM;
END;
END;
procedure getinput;
var j:longint;
begin
writeln('Enter base b <= 35');
readln(base); {use safeguard here}
writeln('Enter number of prime divisors');
readln(n);
n:= abs(trunc(n)); {play safe}
writeln('Enter list of distinct prime divisors m(j)_(1 <= j <= ',n,')');
for j:= 1 to n do
begin
read(m[j]);
m[j]:= abs(trunc(m[j])); {play safe}
end;
checkprimes;
while not(bool2) do
begin
writeln('Renter list of prime divisors');
for j:= 1 to n do
begin
read(m[j]);
m[j]:= abs(trunc(m[j]));
end;
checkprimes;
end;
if bool2 then
begin
safeguard;
while not(bool) do
begin
writeln('Renter list of prime divisors');
for j:= 1 to n do
begin
read(m[j]);
m[j]:= abs(trunc(m[j]));
end;
safeguard;
end;
end;
readln;
writeln('Enter list of numbers in base ',base);
read(strdata);
getstrlist(strdata,c,n);
end;
procedure changeback(k:char; var j:string);
{Not needed for this problem since using base 2}
begin{change}
IF upcase(K) = '0' then J:= '0';
IF upcase(K) = '1' THEN J:= '1';
IF upcase(K) = '2' THEN J:= '2';
IF upcase(K) = '3' THEN J:= '3';
IF upcase(K) = '4' THEN J:= '4';
IF upcase(K) = '5' THEN J:= '5';
IF upcase(K) = '6' THEN J:= '6';
IF upcase(K) = '7' THEN J:= '7';
IF upcase(K) = '8' THEN J:= '8';
IF upcase(K) = '9' THEN J:= '9';
IF upcase(K) = 'A' THEN J:= '10';
IF upcase(K) = 'B' THEN J:= '11';
IF upcase(K) = 'C' THEN J:= '12';
IF upcase(K) = 'D' THEN J:= '13';
IF upcase(K) = 'E' THEN J:= '14';
IF upcase(K) = 'F' THEN J:= '15';
IF upcase(K) = 'G' THEN J:= '16';
IF upcase(K) = 'H' THEN J:= '17';
IF upcase(K) = 'I' THEN J:= '18';
IF upcase(K) = 'J' THEN J:= '19';
IF upcase(K) = 'K' THEN J:= '20';
IF upcase(K) = 'L' THEN J:= '21';
IF upcase(K) = 'M' THEN J:= '22';
IF upcase(K) = 'N' THEN J:= '23';
IF upcase(K) = 'O' THEN J:= '24';
IF upcase(K) = 'P' THEN J:= '25';
IF upcase(K) = 'Q' THEN J:= '26';
IF upcase(K) = 'R' THEN J:= '27';
IF upcase(K) = 'S' THEN J:= '28';
IF upcase(K) = 'T' THEN J:= '29';
IF upcase(K) = 'U' THEN J:= '30';
IF upcase(K) = 'V' THEN J:= '31';
IF upcase(K) = 'W' THEN J:= '32';
IF upcase(K) = 'X' THEN J:= '33';
IF upcase(K) = 'Y' THEN J:= '34';
IF upcase(K) = 'Z' THEN J:= '35';
END;{CHANGE}
function num_base10(num:string; baseb:longint):longint;
var sum:longint;
begin
sum:= 0;
strnum:= num;
for j:= 1 TO length(strnum) DO
begin
if baseb >= 10 then {not needed for this problem}
begin
changeback(strnum[j],strdigit);
val(strdigit,digit,error);
end
else
val(strnum[j],digit,error);
sum:= sum + digit * intpower(baseb,length(strnum) - j);
end;
num_base10:= sum;
end;
function s(m,a:chinesearray; n:longint):longint;
var j,k,sum,prod:longint;
begin
prod:= 1;
for j:= 1 to n do
begin
prod:= prod * m[j];
end;
for j:= 1 to n do
begin
Mk[j]:= prod div m[j];
end;
for k:= 1 to n do
begin
for j:= 0 to m[k] - 1 do
begin
if Mk[k] * j mod m[k] = 1 then
inverse[k]:= j;
end;
end;
sum:= 0;
for j:= 1 to n do
begin
sum:= sum + a[j] * Mk[j] * inverse[j];
end;
s:= sum mod prod;
end;
procedure encipher;
var k,j:longint;
begin
writeln(' Enciphered Data');
for k:= 1 to n do
begin
b[k]:= num_base10(c[k],2);
end;
for j:= 1 to n do
begin
writeln('(',s(m,b,n),',',m[j],',',base,')');
end;
end;
begin
getinput;
encipher;
readln;
readln;
clrscr;
end.
The output is: ( 3 8 9 1 9 9 , 1 3 1 , 2 ) , ( 3 8 9 1 9 9 , 1 3 9 , 2 ) , ( 3 8 9 1 9 9 , 1 5 7 , 2 ) , ( 3 8 9 1 9 9 , 2 , 2 ) .
The Cipher text X = 3 8 9 1 9 9 .
E n d p r o b l e m .
Given ( 3 8 9 1 9 9 , 1 3 1 ) , ( 3 8 9 1 9 9 , 1 3 9 ) , ( 3 8 9 1 9 9 , 1 5 7 ) , ( 3 8 9 1 9 9 , 2 ) we could now decipher the enciphered text to obtain the data files.
Writing a program to decipher:
I moved functions, procedures and types from my unit(mathunit) into the main program.
To decipher use b j ≡ X m o d m j , where ( 1 < = j < = n ) , then convert each b j to base 2.
program Applicationextensionforcheckingfunctions;
uses crt;
type chinesearray = array[1 .. 10000] of longint;
function prime(p:integer):boolean;
var n:integer;
procedure safeguard;
var j,k:longint;
begin
bool:= true;
for j:= 1 to n do
begin
for k:= j + 1 to n do
begin
if m[j] = m[k] then
bool:= false;
end;
end;
end;
procedure checkprimes;
var k,j:longint;
begin
bool2:= true;
for j:= 1 to n do
begin
if not(prime(m[j])) then
begin
bool2:= false;
end;
end;
end;
procedure getinput;
var j:longint;
begin
writeln('Enter base b <= 35');
readln(base); {use safeguard here}
writeln('Enter number of prime divisors');
readln(n);
n:= abs(trunc(n)); {play safe}
writeln('Enter list of distinct prime divisors m(j)_(1 <= j <= ',n,')');
for j:= 1 to n do
begin
read(m[j]);
m[j]:= abs(trunc(m[j])); {play safe}
end;
checkprimes;
while not(bool2) do
begin
writeln('Renter list of prime divisors');
for j:= 1 to n do
begin
read(m[j]);
m[j]:= abs(trunc(m[j]));
end;
checkprimes;
end;
if bool2 then
begin
safeguard;
while not(bool) do
begin
writeln('Renter list of prime divisors');
for j:= 1 to n do
begin
read(m[j]);
m[j]:= abs(trunc(m[j]));
end;
safeguard;
end;
end;
writeln('Enter X for each divisor m(j)');
readln(X);
end;
procedure change(var k:string); {again, not needed here since using base 2.}
begin{change}
IF K = '10' THEN K:= 'A';
IF K = '11' THEN K:= 'B';
IF K = '12' THEN K:= 'C';
IF K = '13' THEN K:= 'D';
IF K = '14' THEN K:= 'E';
IF K = '15' THEN K:= 'F';
IF K = '16' THEN K:= 'G';
IF K = '17' THEN K:= 'H';
IF K = '18' THEN K:= 'I';
IF K = '19' THEN K:= 'J';
IF K = '20' THEN K:= 'K';
IF K = '21' THEN K:= 'L';
IF K = '22' THEN K:= 'M';
IF K = '23' THEN K:= 'N';
IF K = '24' THEN K:= 'O';
IF K = '25' THEN K:= 'P';
IF K = '26' THEN K:= 'Q';
IF K = '27' THEN K:= 'R';
IF K = '28' THEN K:= 'S';
IF K = '29' THEN K:= 'T';
IF K = '30' THEN K:= 'U';
IF K = '31' THEN K:= 'V';
IF K = '32' THEN K:= 'W';
IF K = '33' THEN K:= 'X';
IF K = '34' THEN K:= 'Y';
IF K = '35' THEN K:= 'Z';
end;
function func_convert(number,base:longint):string;
var quot,remainder,j,m:longint;
begin{convert}
quot:= abs(number);
j:= 0;
while quot >= 1 do begin{loop}
str(a[j - m + 1], strvar);
change(strvar); {for base >= 10, not needed here}
strsum:= strsum + strvar;
func_convert:= strsum;
end;{convert}
procedure decipher;
var j:longint;
begin
writeln(' Deciphered data ');
for j:= 1 to n do
begin
b[j]:= X mod m[j];
writeln(func_convert(b[j],base));
end;
end;
begin
getinput;
decipher;
readln;
clrscr;
end.
The program to decipher outputs the data base files: ( 1 0 0 0 0 0 0 1 ) 2 , ( 1 0 0 0 1 0 1 0 ) 2 , ( 1 0 0 1 1 0 0 1 ) 2 , ( 0 0 0 0 0 0 0 1 ) 2 .