import crypto from 'node:crypto' const PART_1_INDEXES = [23, 14, 6, 36, 16, 40, 7, 19] const PART_2_INDEXES = [16, 1, 32, 12, 19, 27, 8, 5] const SCRAMBLE_VALUES = [89, 39, 179, 150, 218, 82, 58, 252, 177, 52, 186, 123, 120, 64, 242, 133, 143, 161, 121, 179] async function hashSHA1(data) { return crypto.createHash('sha1').update(data).digest('hex') } function pickHashByIdx(hash, indexes) { return indexes.map((idx) => hash[idx]).join('') } function base64Encode(data) { return Buffer.from(data) .toString('base64') .replace(/[\\/+=]/g, '') } export async function zzcSign(text) { const hash = await hashSHA1(text) const part1 = pickHashByIdx(hash, PART_1_INDEXES) const part2 = pickHashByIdx(hash, PART_2_INDEXES) const part3 = SCRAMBLE_VALUES.map((value, i) => value ^ parseInt(hash.slice(i * 2, i * 2 + 2), 16)) const b64Part = base64Encode(part3).replace(/[\\/+=]/g, '') return `zzc${part1}${b64Part}${part2}`.toLowerCase() }