rendered paste bodyimport 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;
OutputStream encryptFile = new FileOutputStream("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, encryptFile);
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, encryptFile);
}
encryptFile.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, OutputStream encryptFile) {
//Convert to long
long v = ((int)M[0] * 65536) + ((int)M[1] * 256) + (int)M[2];
long E = expMod(v, e, n);
int eByte0, eByte1, eByte2, eByte3;
String encryptedString = padString(Long.toBinaryString(E), -32, "0");
eByte0 = Integer.parseInt( encryptedString.substring(0, 7+1) , 2);
eByte1 = Integer.parseInt( encryptedString.substring(8, 15+1) , 2);
eByte2 = Integer.parseInt( encryptedString.substring(16, 23+1) , 2);
eByte3 = Integer.parseInt( encryptedString.substring(24, 31+1) , 2);
System.out.print(M);
System.out.println(" " + v + " ^ " + e + " mod " + n + " = " + E + " \t: " + eByte0 + " " + eByte1 + " " + eByte2 + " "+ eByte3 + " \t\t: " + (char)eByte0 + " " + (char)eByte1 + " " + (char)eByte2 + " "+ (char)eByte3 );
// write encrytpedString to file
try
{
encryptFile.write( eByte0 );
encryptFile.write( eByte1 );
encryptFile.write( eByte2 );
encryptFile.write( eByte3 );
} catch (IOException ioe) {}
}
/* Pads out a string upto padlen with pad chars
* padString("123", -8, "A") => "AAAAA123"
* padString("123", 8, "A") => "123AAAAA"
*/
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