From a341f8d49a38f1cda80777f76b0b080cc5f8b9b3 Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Tue, 10 Mar 2026 21:22:07 -0700 Subject: [PATCH] Refactor: Use split cipher modules, upgrade to 48/96 --- dash.js | 74 +++++++++++---------------------------------------------- 1 file changed, 14 insertions(+), 60 deletions(-) diff --git a/dash.js b/dash.js index fc768b9..650a6f7 100644 --- a/dash.js +++ b/dash.js @@ -1,54 +1,13 @@ import zwus from 'zwus'; -import { blake2bHex } from 'blakejs'; -import speck from 'generic-speck'; +import * as speck48_96ctr from './speck48_96ctr.js'; +import * as speck32_64ecb from './speck32_64ecb.js'; -const speck32_64 = speck(); const textarea = document.getElementById('textarea'); const encoderDropdown = document.getElementById('encoder'); const cipherDropdown = document.getElementById('cipher'); document.getElementById('encodeButton').addEventListener('click', ACT); document.getElementById('decodeButton').addEventListener('click', ACT); -function getKey(kStr) { - const key64bit = blake2bHex(kStr, null, 8); - return [ - parseInt(key64bit.slice(0, 4), 16), - parseInt(key64bit.slice(4, 8), 16), - parseInt(key64bit.slice(8, 12), 16), - parseInt(key64bit.slice(12, 16), 16) - ]; -} - -function deriveNonce(key64arr) { - return speck32_64.encrypt(0, key64arr) & 0xFFFF; -} - -function ctrKeystream(key64arr, index) { - const nonce = deriveNonce(key64arr); - const ctrBlock = ((nonce << 16) | (index & 0xFFFF)) >>> 0; - return speck32_64.encrypt(ctrBlock, key64arr) >>> 0; -} - -function ctrEncrypt(ptStr, key64arr) { - return Array.from(ptStr, (c, i) => { - const ks = ctrKeystream(key64arr, i); - return (c.codePointAt(0) ^ ks) >>> 0; - }); -} - -function ctrDecrypt(numArr, key64arr) { - return numArr.map((ct, i) => { - const ks = ctrKeystream(key64arr, i); - const cp = (ct ^ ks) >>> 0; - try { return String.fromCodePoint(cp); } - catch { return ''; } - }).join(''); -} - -function getCipherKey() { - return cipherDropdown.value; -} - function ACT(event) { if (textarea.value === '') { textarea.value = 'The text box is empty.'; @@ -76,30 +35,25 @@ function ACT(event) { } } +function getCipherKey() { + return cipherDropdown.value; +} + const DESCRY = { NO: { PLAIN: (ptStr, base) => zwus.encodeString(ptStr, base), - SPECK32_64CTR: (ptStr, base, kStr) => - zwus.encodeNumberArray(ctrEncrypt(ptStr, getKey(kStr)), base), - 'SPECK32_64ECB (insecure)': (ptStr, base, kStr) => { - const key = getKey(kStr); - return zwus.encodeNumberArray( - Array.from(ptStr, c => speck32_64.encrypt(c.codePointAt(0), key)), - base - ); - } + SPECK48_96CTR: (ptStr, base, kStr) => + zwus.encodeNumberArray(speck48_96ctr.encrypt(ptStr, speck48_96ctr.getKey(kStr)), base), + 'SPECK32_64ECB (insecure)': (ptStr, base, kStr) => + zwus.encodeNumberArray(speck32_64ecb.encrypt(ptStr, speck32_64ecb.getKey(kStr)), base), }, YES: { PLAIN: (ptStr, base) => zwus.decodeToString(ptStr, base), - SPECK32_64CTR: (ptStr, base, kStr) => - ctrDecrypt(zwus.decodeToNumberArray(ptStr, base), getKey(kStr)), - 'SPECK32_64ECB (insecure)': (ptStr, base, kStr) => { - const key = getKey(kStr); - return zwus.decodeToNumberArray(ptStr, base) - .map(x => { try { return String.fromCodePoint(speck32_64.decrypt(x, key)); } catch { return ''; } }) - .join(''); - } + SPECK48_96CTR: (ptStr, base, kStr) => + speck48_96ctr.decrypt(zwus.decodeToNumberArray(ptStr, base), speck48_96ctr.getKey(kStr)), + 'SPECK32_64ECB (insecure)': (ptStr, base, kStr) => + speck32_64ecb.decrypt(zwus.decodeToNumberArray(ptStr, base), speck32_64ecb.getKey(kStr)), } };