1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /*!
- * Crypto-JS v1.1.0
- * http://code.google.com/p/crypto-js/
- * Copyright (c) 2009, Jeff Mott. All rights reserved.
- * http://code.google.com/p/crypto-js/wiki/License
- */
- Crypto.mode.CBC = {
- encrypt: function (cipher, m, iv) {
- var blockSizeInBytes = cipher._blocksize * 4;
- // Pad
- m.push(0x80);
- // Encrypt each block
- for (var offset = 0; offset < m.length; offset += blockSizeInBytes) {
- if (offset == 0) {
- // XOR first block using IV
- for (var i = 0; i < blockSizeInBytes; i++)
- m[i] ^= iv[i];
- }
- else {
- // XOR this block using previous crypted block
- for (var i = 0; i < blockSizeInBytes; i++)
- m[offset + i] ^= m[offset + i - blockSizeInBytes];
- }
- // Encrypt block
- cipher._encryptblock(m, offset);
- }
- },
- decrypt: function (cipher, c, iv) {
- var blockSizeInBytes = cipher._blocksize * 4;
- // Decrypt each block
- for (var offset = 0; offset < c.length; offset += blockSizeInBytes) {
- // Save this crypted block
- var thisCryptedBlock = c.slice(offset, offset + blockSizeInBytes);
- // Decrypt block
- cipher._decryptblock(c, offset);
- if (offset == 0) {
- // XOR first block using IV
- for (var i = 0; i < blockSizeInBytes; i++)
- c[i] ^= iv[i];
- }
- else {
- // XOR decrypted block using previous crypted block
- for (var i = 0; i < blockSizeInBytes; i++)
- c[offset + i] ^= prevCryptedBlock[i];
- }
- // This crypted block is the new previous crypted block
- var prevCryptedBlock = thisCryptedBlock;
- }
- // Strip padding
- while (c.pop() != 0x80) ;
- }
- };
|