Перейти к основному содержимому
claw
am
tools
Инструменты
Документы
Daoark
EN
Главная
Главная
/
Verschlüsselung & Codierung
›
>>0; rk.push(nk); ks.push(nk); } return rk; } function cryptBlock(block, rk) { let x0=bytesToU32(block,0), x1=bytesToU32(block,4), x2=bytesToU32(block,8), x3=bytesToU32(block,12); const xs = [x0,x1,x2,x3]; for (let i=0;i<32;i++) { // 32 轮全用 T, 输出时做 R 反序变换 const in_xor = xs[i+1] ^ xs[i+2] ^ xs[i+3] ^ rk[i]; const nx = (xs[i] ^ T(in_xor))>>>0; xs.push(nx); } // R 变换: Y = (X35, X34, X33, X32) (字节级反序输出) return [].concat(u32ToBytes(xs[35]), u32ToBytes(xs[34]), u32ToBytes(xs[33]), u32ToBytes(xs[32])); } function pkcs7Pad(data) { const padLen = 16 - (data.length % 16); const padded = data.slice(); for (let i=0;i
16) throw new Error('PKCS#7 填充无效'); for (let i=0;i
x^b[i]); } function parseKey(s) { // 接受 16 字节字符串或 32 字符 Hex s = s.trim(); if (s.length === 32 && /^[0-9a-fA-F]+$/.test(s)) { const b = []; for (let i=0;i<32;i+=2) b.push(parseInt(s.substr(i,2),16)); return b; } const utf8 = new TextEncoder().encode(s); if (utf8.length === 16) return Array.from(utf8); if (utf8.length > 16) return Array.from(utf8.slice(0, 16)); const padded = Array.from(utf8); while (padded.length < 16) padded.push(0); return padded; } function encryptCBC(plain, key, iv) { const rk = keyExpand(key); const padded = pkcs7Pad(Array.from(plain)); const out = []; let prev = iv; for (let off=0; off
=12;i--) { if (++ctr[i] === 256) ctr[i]=0; else break; } } return new Uint8Array(out); } function decryptCTR(cipher, key, nonce) { return encryptCTR(cipher, key, nonce); } return { encrypt: function(plain, key, iv, mode) { if (mode === 'cbc') return encryptCBC(plain, key, iv); if (mode === 'ecb') return encryptECB(plain, key); if (mode === 'ctr') return encryptCTR(plain, key, iv); throw new Error('不支持的模式: ' + mode); }, decrypt: function(cipher, key, iv, mode) { if (mode === 'cbc') return decryptCBC(cipher, key, iv); if (mode === 'ecb') return decryptECB(cipher, key); if (mode === 'ctr') return decryptCTR(cipher, key, iv); throw new Error('不支持的模式: ' + mode); } }; })(); // ============ 表单处理 ============ (function() { const f = document.getElementById('f'); const resultArea = document.getElementById('result-area'); const resultContent = document.getElementById('result-content'); const resultMeta = document.getElementById('result-meta'); const errorMsg = document.getElementById('error-msg'); function hexToBytes(hex) { hex = hex.replace(/\s+/g, ''); if (hex.length % 2 !== 0) throw new Error('Hex 长度必须为偶数'); const b = []; for (let i=0;i
x.toString(16).padStart(2,'0')).join(''); } function bytesToB64(b) { let s = ''; for (let i=0;i
16) return utf8.slice(0,16); const p = new Uint8Array(16); p.set(utf8); return p; } f.addEventListener('submit', function(e) { e.preventDefault(); errorMsg.textContent = ''; resultArea.classList.remove('show'); const action = document.getElementById('action').value; const text = document.getElementById('text').value; const keyStr = document.getElementById('key').value; const ivStr = document.getElementById('iv').value; const mode = document.getElementById('mode').value; const output = document.getElementById('output').value; try { if (!text) throw new Error('text 不能为空'); if (!keyStr) throw new Error('key 不能为空'); const key = SM4.parseKey ? SM4.parseKey(keyStr) : (() => { const u = new TextEncoder().encode(keyStr); if (u.length === 16) return Array.from(u); if (u.length > 16) return Array.from(u.slice(0,16)); const p = new Array(16).fill(0); for (let i=0;i