注意 encrypt = decrypt,加解密相同。本质是 XOR
流密码,但 key 不是简单循环——有一个递增步长的索引调度(step starts at 1,
increments after each full cycle)。
Python 实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
defgizcrypt_decrypt(ct, key): klen = len(key) x, k = 1, -1 e = 101# ord('e') plain = bytearray() for b in ct: k += x if k >= klen: k = 0 x += 1 if x >= klen: x = 1 plain.append(key[k % klen] ^ b ^ e) returnbytes(plain)
defkey_index_seq(length, klen=11): seq = [] x, k = 1, -1 for _ inrange(length): k += x if k >= klen: k = 0; x += 1 if x >= klen: x = 1 seq.append(k % klen) return seq
seq = key_index_seq(len(ct)) groups = {i: [] for i inrange(11)} for i, kpos inenumerate(seq): groups[kpos].append(ct[i])
key = [] for pos inrange(11): best = None best_score = -9999 for k in alphabet: plain = bytes(k ^ c ^ 101for c in groups[pos]) score = sum(4if b in (32,101,116,97,111) else 2ifchr(b).isalpha() or b in (44,46,39) else 1if32 <= b < 127else -10 for b in plain) if score > best_score: best_score = score best = k key.append(best)