import java.io.*;
import java.lang.Exception;
class Encrypt {
public static void main (String args[]) throws java.lang.Exception {
long n, e, d, ptext;
int pos;
FileReader in;
BufferedReader bufRead;
BufferedWriter out = new BufferedWriter(new FileWriter("encrypted"));
String line;
char charPtext[] = new char[3];
n = e = d = ptext = 0;
if(args.length < 2) {
System.out.println("Usage: Encrypt <plaintext> <keyfile>\n");
System.exit(-1);
}
//Read keys
in = new FileReader(args[1]);
bufRead = new BufferedReader(in);
//Read n
line = bufRead.readLine();
n = Long.parseLong(line);
//Read e
line = bufRead.readLine();
e = Long.parseLong(line);
//Read d
line = bufRead.readLine();
d = Long.parseLong(line);
System.out.println("Keys\n----\n");
System.out.println("n: "+n+"\ne: "+e+"\nd: "+d+"\n");
in = new FileReader(args[0]);
bufRead = new BufferedReader(in);
//Read plaintext
pos = 0;
int temp = bufRead.read();
while(temp > 0)
{
charPtext[pos%3] = (char)temp;
if(++pos == 3)
{ //System.out.println(charPtext);
Encrypt(charPtext, e, n, out);
charPtext[0] = charPtext[1] = charPtext[2] = 0;
//Write(M);
pos = 0;
}
temp = bufRead.read();
}
if(pos > 0) // means there is still stuff in charater buffer, so flush it
{ Encrypt(charPtext, e, n, out);
}
out.close();
//System.out.println();
//System.out.println(expMod(2, 8, 5));
} // end main
public static long expMod(long M, long e, long n)
{ String eBinString = Long.toBinaryString(e);
int eBinStringLen = eBinString.length();
long E = 1;
String bit;
//System.out.println("eBinString = " + eBinString);
for(int i = 0; i < eBinStringLen; i++)
{ bit = eBinString.substring(i,i+1);
if(bit.equals("0"))
{ E = (E * E) % n;
//System.out.println("0: "+tmp);
}
else if(bit.equals("1"))
{ E = (E * E) % n;
E = (E * M) % n;
//System.out.println("1: "+tmp);
}
}
return E;
}
public static void Encrypt(char[] M, long e, long n, BufferedWriter out) {
//Convert to long
long v = ((int)M[0] * 65536) + ((int)M[1] * 256) + (int)M[2];
long E = expMod(v, e, n);
String encryptedString = padString(Long.toBinaryString(E), -32, "0");
System.out.print(M);
System.out.println(" " + v + " ^ " + e + " mod " + n + " = " + E + " \t: " + encryptedString );
// write encrytpedString to file
try
{ out.write( encryptedString );
} catch (IOException ioe) {}
}
private static void writeEncryptedFile(String encryptedString)
{
}
/**
* Pads out a string upto padlen with pad chars
* @param Object.toString() to be padded
* @param length of pad (+ve = pad on right, -ve pad on left)
* @param pad character
* padString("123", -8, "A") => "AAAAA123"
*/
private static String padString(Object str, int padlen, String pad)
{
String padding = new String();
int len = Math.abs(padlen) - str.toString().length();
if (len < 1)
return str.toString();
for (int i = 0 ; i < len ; ++i)
padding = padding + pad;
return (padlen < 0 ? padding + str : str + padding);
}
}// end class Encrypt