ECDH
HTML
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn2.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/prng4.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/rng.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/ec.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.1/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.1/build/rollups/pbkdf2.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.1/build/components/pad-zeropadding.js"></script>
<html>
<head>
<title>JavaScript ECDH Key Exchange Demo</title>
</head>
<body onLoad='do_init();'>
<input type="button" value="Generate Key" onclick="init_exchange()" />
</body>
</html>
JavaScript
function jsonp(url, func) {
var unique = "jsonp_" + Math.random().toString().substr(2);
var s = document.createElement("script");
s.src = url + "&callback=" + unique;
s.id = unique;
window[unique] = function(data) {
var s = document.getElementById(data._);
s.parentElement.removeChild(s);
window[data._] = undefined;
func(data);
}
document.body.appendChild(s);
}
var global_curve = (function(){
var q = new BigInteger("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", 16);
var a = new BigInteger("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", 16);
var b = new BigInteger("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", 16);
var n = new BigInteger("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", 16);
var h = BigInteger.ONE;
var curve = new ECCurveFp(q, a, b);
var G = curve.decodePointHex("04" +
"6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" +
"4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5");
return {
q: q,
a: a,
b: b,
gx: G.getX().toBigInteger(),
gy: G.getY().toBigInteger(),
n: n
};
})();
var client_private;
var client_public_x;
var client_public_y;
var global_key;
var rng;
function do_init() {
rng = new SecureRandom();
}
function get_curve() {
return new ECCurveFp(global_curve.q, global_curve.a, global_curve.b);
}
function get_G(curve) {
return new ECPointFp(curve, curve.fromBigInteger(global_curve.gx), curve.fromBigInteger(global_curve.gy));
}
function pick_rand() {
return new BigInteger(global_curve.n.bitLength(), rng)
.mod(global_curve.n.subtract(BigInteger.ONE))
.add(BigInteger.ONE);
}
function init_exchange() {
client_private = pick_rand();
var curve = get_curve();
var G = get_G(curve);
var P = G.multiply(client_private);
...