从零编写加密算法用Python实现RC4、TEA和Base64的加密与解密加密算法是计算机安全领域的基石理解其原理和实现方式不仅能提升编程能力还能深入理解数据保护的本质。本文将手把手教你用Python实现三种经典加密算法RC4流加密、TEA分组加密和Base64编码转换。无论你是编程初学者还是加密算法爱好者都能从中获得实用知识。1. 环境准备与基础知识在开始编写代码前我们需要了解一些基本概念。对称加密算法是指加密和解密使用相同密钥的算法而非对称加密则使用公钥和私钥两种密钥。本文涉及的RC4和TEA都属于对称加密算法。1.1 Python加密库安装pip install pycryptodome # 用于算法验证1.2 加密算法性能对比算法类型密钥长度速度安全性RC4流加密40-2048位非常快较低TEA分组加密128位快中等Base64编码无密钥极快无加密提示Base64严格来说不是加密算法而是一种编码方式但常被用于简易数据混淆。2. RC4流加密算法实现RC4以其简单高效著称曾广泛应用于SSL和WEP协议中。它的核心是通过密钥生成伪随机流与明文进行异或操作。2.1 算法原理RC4包含两个关键步骤密钥调度算法(KSA) - 初始化S盒伪随机生成算法(PRGA) - 生成密钥流特征识别要点256字节的S盒初始化大量的模256运算最终的异或操作2.2 Python实现class RC4: def __init__(self, key): self.S list(range(256)) j 0 for i in range(256): j (j self.S[i] key[i % len(key)]) % 256 self.S[i], self.S[j] self.S[j], self.S[i] def crypt(self, data): i j 0 result [] for byte in data: i (i 1) % 256 j (j self.S[i]) % 256 self.S[i], self.S[j] self.S[j], self.S[i] k self.S[(self.S[i] self.S[j]) % 256] result.append(byte ^ k) return bytes(result) # 使用示例 key bsecret_key rc4 RC4(key) plaintext bHello, RC4! ciphertext rc4.crypt(plaintext) decrypted rc4.crypt(ciphertext) # 解密使用相同方法2.3 常见问题排查中文处理问题# 处理中文时需要编码 text 你好.encode(utf-8)密钥长度建议至少使用16字节(128位)密钥避免使用易猜测的密钥3. TEA微型加密算法实现TEA(Tiny Encryption Algorithm)是一种高效的分组加密算法适合资源受限的环境。3.1 算法特点64位(8字节)分组128位密钥32轮Feistel结构魔数0x9E3779B9(黄金分割相关)识别特征delta 0x9E3779B9 sum delta v0 ((v1 4) k0) ^ (v1 sum) ^ ((v1 5) k1)3.2 Python实现import struct def tea_encrypt(v, k): v0, v1 struct.unpack(!2I, v) k0, k1, k2, k3 struct.unpack(!4I, k) delta, sum 0x9E3779B9, 0 for _ in range(32): sum delta v0 ((v1 4) k0) ^ (v1 sum) ^ ((v1 5) k1) v1 ((v0 4) k2) ^ (v0 sum) ^ ((v0 5) k3) return struct.pack(!2I, v0, v1) def tea_decrypt(v, k): v0, v1 struct.unpack(!2I, v) k0, k1, k2, k3 struct.unpack(!4I, k) delta, sum 0x9E3779B9, 0xC6EF3720 for _ in range(32): v1 - ((v0 4) k2) ^ (v0 sum) ^ ((v0 5) k3) v0 - ((v1 4) k0) ^ (v1 sum) ^ ((v1 5) k1) sum - delta return struct.pack(!2I, v0, v1) # 使用示例 key b1234567890123456 # 16字节密钥 data bABCDEFGH # 8字节数据 encrypted tea_encrypt(data, key) decrypted tea_decrypt(encrypted, key)3.3 算法变种与安全TEA有几个著名变种XTEA改进密钥混合方式XXTEA支持更长的数据块注意标准TEA存在密钥相关攻击风险实际使用建议采用XTEA或XXTEA。4. Base64编码原理与实现Base64将二进制数据转换为ASCII字符常用于在文本协议中传输二进制数据。4.1 编码过程将每3字节(24位)分为4组6位每组6位转换为0-63的索引根据索引表转换为可打印字符标准索引表ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/4.2 Python实现import base64 # 自定义Base64表 CUSTOM_ALPHABET bXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW0123456789/ STANDARD_ALPHABET bABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/ def custom_b64encode(data): return base64.b64encode(data).translate(bytes.maketrans(STANDARD_ALPHABET, CUSTOM_ALPHABET)) def custom_b64decode(data): return base64.b64decode(data.translate(bytes.maketrans(CUSTOM_ALPHABET, STANDARD_ALPHABET))) # 使用示例 text bHello Base64 encoded custom_b64encode(text) decoded custom_b64decode(encoded)4.3 常见变种识别CTF中常见的Base64变种修改索引表顺序改变填充字符分组大小变化识别特征64字节的常量字符串每3字节输入产生4字节输出末尾可能的填充5. 综合应用与调试技巧在实际开发中加密算法的正确实现需要仔细测试。以下是几个实用技巧5.1 测试向量验证# RC4测试向量 key bKey plaintext bPlaintext expected_cipher b\xBB\xF3\x16\xE8\xD9\x40\xAF\x0A\xD3 rc4 RC4(key) assert rc4.crypt(plaintext) expected_cipher5.2 性能优化建议对于Python加密# 使用bytes代替bytearray # 预分配结果列表 result [0] * len(data)关键循环使用C扩展// 示例TEA的C实现比Python快10倍以上5.3 常见错误处理def pad_data(data, block_size8): pad_len block_size - (len(data) % block_size) return data bytes([pad_len] * pad_len) def unpad_data(data): pad_len data[-1] return data[:-pad_len]在实现这些算法时我经常遇到字节序问题和填充错误。特别是在处理TEA算法时确保数据长度是8的倍数至关重要。一个实用的调试方法是打印中间状态print(fRound {i}: v0{hex(v0)}, v1{hex(v1)}, sum{hex(sum)})