Paillier - homomorphic cryptosystemPaillier is a homomorphic cryptosystem and where we can perform arithmetic operations on the cipher text. In this case we can take two numbers (A and B) and use a public key to make them into cipher values. We can then add the cipher values, and when we decrypt, we get the addition of the two values. This also works with multiplication. Key generation
Input values
Encrypted addition
Encrypted multiplication
Decryption
PresentationOutlineThe following is an outline of the code: <script type="text/javascript" src="/js/jsbn/jsbn.js"></script> <script type="text/javascript" src="/js/jsbn/jsbn2.js"></script> <script type="text/javascript" src="/js/jsbn/prng4.js"></script> <script type="text/javascript" src="/js/jsbn/rng.js"></script> <script type="text/javascript" src="/js/paillier.js"></script> <script type="text/javascript"> var keys, encA, encB, encAB, encABC; $(function() { $('#btn_genkeypair').click(function(event) { var numBits = parseInt($('#inputNumbits').val()); if (numBits % 2 === 0) { var startTime = new Date().getTime(), elapsed; keys = paillier.generateKeys(numBits); elapsed = new Date().getTime() - startTime; $('#keygentime').html(elapsed); $('#pubn').html(keys.pub.n.toString()); $('#privl').html(keys.sec.lambda.toString()); } else { alert("Please enter an even number of bits :)"); } }); $('#btn_precompute').click(function(event) { var numPrecomputations = parseInt($('#inputNumPrecompute').val()), startTime, elapsed; startTime = new Date().getTime(); keys.pub.precompute(numPrecomputations); elapsed = new Date().getTime() - startTime; $('#precomputetime').html(elapsed); }); $('#btn_encrypt').click(function(event) { var valA = parseInt($('#inputA').val()), valB = parseInt($('#inputB').val()), startTime, elapsed; startTime = new Date().getTime(); encA = keys.pub.encrypt(nbv(valA)); elapsed = new Date().getTime() - startTime; $('#encA').html(encA.toString()); $('#encAtime').html(elapsed); startTime = new Date().getTime(); encB = keys.pub.encrypt(nbv(valB)); elapsed = new Date().getTime() - startTime; $('#encBtime').html(elapsed); $('#encB').html(encB.toString()); }); $('#btn_add').click(function(event) { var startTime, elapsed; startTime = new Date().getTime(); encAB = keys.pub.add(encA,encB); elapsed = new Date().getTime() - startTime; $('#addtime').html(elapsed); $('#encAB').html(encAB.toString()); }); $('#btn_randadd').click(function() { var startTime, elapsed; startTime = new Date().getTime(); encAB = keys.pub.randomize(encAB); elapsed = new Date().getTime() - startTime; $('#randaddtime').html(elapsed); $('#encAB').html(encAB.toString()); }); $('#btn_mult').click(function(event) { var valC = parseInt($('#inputC').val()), startTime, elapsed; startTime = new Date().getTime(); encABC = keys.pub.mult(encAB,nbv(valC)); elapsed = new Date().getTime() - startTime; $('#multtime').html(elapsed); $('#encABC').html(encABC.toString()); }); $('#btn_randmult').click(function() { var startTime, elapsed; startTime = new Date().getTime(); encABC = keys.pub.randomize(encABC); elapsed = new Date().getTime() - startTime; $('#randmulttime').html(elapsed); $('#encABC').html(encABC.toString()); }); $('#btn_decrypt').click(function() { var plaintext, startTime, elapsed; startTime = new Date().getTime(); plaintext = keys.sec.decrypt(encABC).toString(10) elapsed = new Date().getTime() - startTime; $('#plainABC').html(plaintext); $('#decrypttime').html(elapsed); }); }); |