📄 blowfish.js
字号:
for (var i = 0; i < l; ) { var t = tab.indexOf(s[i++]) << 18 | tab.indexOf(s[i++]) << 12 | tab.indexOf(s[i++]) << 6 | tab.indexOf(s[i++]); out.push((t >>> 16) & 255); out.push((t >>> 8) & 255); out.push(t & 255); } return out; } this.getIV = function (outputType) { var out = outputType || dojo.crypto.outputTypes.Base64; switch (out) { case dojo.crypto.outputTypes.Hex: var s = []; for (var i = 0; i < iv.length; i++) { s.push((iv[i]).toString(16)); } return s.join(""); case dojo.crypto.outputTypes.String: return iv.join(""); case dojo.crypto.outputTypes.Raw: return iv; default: return toBase64(iv); } }; this.setIV = function (data, inputType) { var ip = inputType || dojo.crypto.outputTypes.Base64; var ba = null; switch (ip) { case dojo.crypto.outputTypes.String: ba = []; for (var i = 0; i < data.length; i++) { ba.push(data.charCodeAt(i)); } break; case dojo.crypto.outputTypes.Hex: ba = []; var i = 0; while (i + 1 < data.length) { ba.push(parseInt(data.substr(i, 2), 16)); i += 2; } break; case dojo.crypto.outputTypes.Raw: ba = data; break; default: ba = fromBase64(data); break; } iv = {}; iv.left = ba[0] * POW24 | ba[1] * POW16 | ba[2] * POW8 | ba[3]; iv.right = ba[4] * POW24 | ba[5] * POW16 | ba[6] * POW8 | ba[7]; }; this.encrypt = function (plaintext, key, ao) { var out = dojo.crypto.outputTypes.Base64; var mode = dojo.crypto.cipherModes.EBC; if (ao) { if (ao.outputType) { out = ao.outputType; } if (ao.cipherMode) { mode = ao.cipherMode; } } var bx = init(key); var padding = 8 - (plaintext.length & 7); for (var i = 0; i < padding; i++) { plaintext += String.fromCharCode(padding); } var cipher = []; var count = plaintext.length >> 3; var pos = 0; var o = {}; var isCBC = (mode == dojo.crypto.cipherModes.CBC); var vector = {left:iv.left || null, right:iv.right || null}; for (var i = 0; i < count; i++) { o.left = plaintext.charCodeAt(pos) * POW24 | plaintext.charCodeAt(pos + 1) * POW16 | plaintext.charCodeAt(pos + 2) * POW8 | plaintext.charCodeAt(pos + 3); o.right = plaintext.charCodeAt(pos + 4) * POW24 | plaintext.charCodeAt(pos + 5) * POW16 | plaintext.charCodeAt(pos + 6) * POW8 | plaintext.charCodeAt(pos + 7); if (isCBC) { o.left = xor(o.left, vector.left); o.right = xor(o.right, vector.right); } eb(o, bx); if (isCBC) { vector.left = o.left; vector.right = o.right; dojo.crypto.outputTypes.Hex; } cipher.push((o.left >> 24) & 255); cipher.push((o.left >> 16) & 255); cipher.push((o.left >> 8) & 255); cipher.push(o.left & 255); cipher.push((o.right >> 24) & 255); cipher.push((o.right >> 16) & 255); cipher.push((o.right >> 8) & 255); cipher.push(o.right & 255); pos += 8; } switch (out) { case dojo.crypto.outputTypes.Hex: var s = []; for (var i = 0; i < cipher.length; i++) { s.push((cipher[i]).toString(16)); } return s.join(""); case dojo.crypto.outputTypes.String: return cipher.join(""); case dojo.crypto.outputTypes.Raw: return cipher; default: return toBase64(cipher); } }; this.decrypt = function (ciphertext, key, ao) { var ip = dojo.crypto.outputTypes.Base64; var mode = dojo.crypto.cipherModes.EBC; if (ao) { if (ao.outputType) { ip = ao.outputType; } if (ao.cipherMode) { mode = ao.cipherMode; } } var bx = init(key); var pt = []; var c = null; switch (ip) { case dojo.crypto.outputTypes.Hex: c = []; var i = 0; while (i + 1 < ciphertext.length) { c.push(parseInt(ciphertext.substr(i, 2), 16)); i += 2; } break; case dojo.crypto.outputTypes.String: c = []; for (var i = 0; i < ciphertext.length; i++) { c.push(ciphertext.charCodeAt(i)); } break; case dojo.crypto.outputTypes.Raw: c = ciphertext; break; default: c = fromBase64(ciphertext); break; } var count = c.length >> 3; var pos = 0; var o = {}; var isCBC = (mode == dojo.crypto.cipherModes.CBC); var vector = {left:iv.left || null, right:iv.right || null}; for (var i = 0; i < count; i++) { o.left = c[pos] * POW24 | c[pos + 1] * POW16 | c[pos + 2] * POW8 | c[pos + 3]; o.right = c[pos + 4] * POW24 | c[pos + 5] * POW16 | c[pos + 6] * POW8 | c[pos + 7]; if (isCBC) { var left = o.left; var right = o.right; } db(o, bx); if (isCBC) { o.left = xor(o.left, vector.left); o.right = xor(o.right, vector.right); vector.left = left; vector.right = right; } pt.push((o.left >> 24) & 255); pt.push((o.left >> 16) & 255); pt.push((o.left >> 8) & 255); pt.push(o.left & 255); pt.push((o.right >> 24) & 255); pt.push((o.right >> 16) & 255); pt.push((o.right >> 8) & 255); pt.push(o.right & 255); pos += 8; } if (pt[pt.length - 1] == pt[pt.length - 2] || pt[pt.length - 1] == 1) { var n = pt[pt.length - 1]; pt.splice(pt.length - n, n); } for (var i = 0; i < pt.length; i++) { pt[i] = String.fromCharCode(pt[i]); } return pt.join(""); }; this.setIV("0000000000000000", dojo.crypto.outputTypes.Hex);}();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -