Fourmilab JavaScript crypto library:
Example:
<script type="text/javascript" src="js/aes.js"></script>
<script type="text/javascript" src="js/entropy.js"></script>
<script type="text/javascript" src="js/aesprng.js"></script>
<script type="text/javascript" src="js/md5.js"></script>
<script type="text/javascript" src="js/utf-8.js"></script>
<script type="text/javascript">
/*-----------------------------------------------------------*
* ENCRYPT: AES 128 bit, CBC *
*-----------------------------------------------------------*/
/*** PRNG */
addEntropyTime();
prng = new AESprng(keyFromEntropy());
for(var i=0; i<plaintext.length % 16; i++) { // pad with null to blocks of 16bytes
plaintext += '\0';
}
var iv = getRandomBytes(16); // IV
/*** encrypt */
var ciphertext = _rijndaelEncrypt("plaintext", "Secret Passphrase", "CBC", iv);
var hex_str = byteArrayToHex(ciphertext);
var out_str = "";
hex_str = hex_str.split('');
for(var i=0; i<hex_str.length; i++) {
if((i % 64 == 0) && (i > 0)) out_str += '\n';
out_str += hex_str[i];
}
delete prng;
/*-----------------------------------------------------------*
* DECRYPT: AES 128 bit, CBC *
*-----------------------------------------------------------*/
/*** decrypt */
var array = hexToByteArray(ciphertext);
var result = _rijndaelDecrypt(array, "Secret Passphrase", "CBC");
var char_str = "";
for(var i=0; i<result.length; i++) {
char_str += String.fromCharCode(result[i])+" ";
}
var plaintext = "";
for(var i = 0; i < result.length; i++) {
plaintext += String.fromCharCode(result[i]);
}
// remove all null chars from end of output
plaintext = plaintext.replace(/\0*$/g, "");
</script>
The modes of operation currently available are:
And the padding schemes currently available are: