CryptoJS PBKDF2 for key+IV
generating key and IV using a single pbkdf2 invocation
by artjomb
HTML
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script>
<dl>
<dt>Password</dt>
<dd><input type="text" name="password"/></dd>
<dt>Salt (Base64)</dt>
<dd id="salt"></dd>
<dt>Iterations</dt>
<dd id="iter"></dd>
<dt>Key size (bits)</dt>
<dd id="keysize"></dd>
<dt>IV size (bits)</dt>
<dd id="ivsize"></dd>
<dt>Hash-function</dt>
<dd id="hasher"></dd>
<dt>Key (Base64)</dt>
<dd id="key"></dd>
<dt>IV (Base64)</dt>
<dd id="iv"></dd>
</dl>
<button>Run</button>
JavaScript
$("button").click(function(){
var password = $("[name='password']").val();
var iterations = 1000;
// sizes must be a multiple of 32
var keySize = 256;
var ivSize = 128;
var salt = CryptoJS.lib.WordArray.random(128/8);
$("#salt").html(salt.toString(CryptoJS.enc.Base64));
$("#iter").html(iterations);
$("#keysize").html(keySize);
$("#ivsize").html(ivSize);
var output = CryptoJS.PBKDF2(password, salt, {
keySize: (keySize+ivSize)/32,
iterations: iterations
});
// the underlying words arrays might have more content than was asked: remove insignificant words
output.clamp();
var key = CryptoJS.lib.WordArray.create(output.words.slice(0, keySize/32));
var iv = CryptoJS.lib.WordArray.create(output.words.slice(keySize/32));
$("#hasher").html("SHA1");
$("#key").html(key.toString(CryptoJS.enc.Base64));
$("#iv").html(iv.toString(CryptoJS.enc.Base64));
});