













function RSAKeyPair(encryptionExponent, decryptionExponent, modulus)
{
this.e = biFromHex(encryptionExponent);
this.d = biFromHex(decryptionExponent);
this.m = biFromHex(modulus);






this.digitSize = 2 * biHighIndex(this.m) + 2;
this.chunkSize = this.digitSize - 11; 

this.radix = 16;
this.barrett = new BarrettMu(this.m);
}
function twoDigit(n)
{
return (n < 10 ? "0" : "") + String(n);
}
function encryptedString(key, s)





{

if (key.chunkSize > key.digitSize - 11)
{
return "Error";
}

var a = new Array();
var sl = s.length;
var i = 0;
while (i < sl) {
a[i] = s.charCodeAt(i);
i++;
}



var al = a.length;
var result = "";
var j, k, block;
for (i = 0; i < al; i += key.chunkSize) {
block = new BigInt();
j = 0;









var x;
var msgLength = (i+key.chunkSize)>al ? al%key.chunkSize : key.chunkSize;

var b = new Array();
for (x=0; x<msgLength; x++)
{
b[x] = a[i+msgLength-1-x];
}
b[msgLength] = 0; 
var paddedSize = Math.max(8, key.digitSize - 3 - msgLength);
for (x=0; x<paddedSize; x++) {
b[msgLength+1+x] = Math.floor(Math.random()*254) + 1; 
}

b[key.digitSize-2] = 2; 
b[key.digitSize-1] = 0; 
for (k = 0; k < key.digitSize; ++j) 
{
block.digits[j] = b[k++];
block.digits[j] += b[k++] << 8;
}

var crypt = key.barrett.powMod(block, key.e);
var text = key.radix == 16 ? biToHex(crypt) : biToString(crypt, key.radix);
result += text + " ";
}
return result.substring(0, result.length - 1); 
}
function decryptedString(key, s)
{
var blocks = s.split(" ");
var result = "";
var i, j, block;
for (i = 0; i < blocks.length; ++i) {
var bi;
if (key.radix == 16) {
bi = biFromHex(blocks[i]);
}
else {
bi = biFromString(blocks[i], key.radix);
}
block = key.barrett.powMod(bi, key.d);
for (j = 0; j <= biHighIndex(block); ++j) {
result += String.fromCharCode(block.digits[j] & 255,
block.digits[j] >> 8);
}
}

if (result.charCodeAt(result.length - 1) == 0) {
result = result.substring(0, result.length - 1);
}
return result;
}

