能否将两条消息加密为单个字符串?双密钥解密不同内容技术咨询
存在这类加密方法,以下是具体实现思路和代码
这种需求可以通过信息分存+密钥定向提取的思路实现,核心是把两个明文的信息嵌入到同一个加密字符串中,用不同密钥触发不同的提取和解密规则。
实现原理
- 先将两个明文补全到相同长度(短的用空字符占位)
- 把两个明文的字符交替拼接,同时用对应密钥做异或加密
- 解密时,根据密钥选择提取对应的交替位,再用密钥做异或还原明文
具体Python代码
def encrypt(msg1, msg2, key1, key2): # 补全消息到相同长度,用空字符占位 max_len = max(len(msg1), len(msg2)) msg1_padded = msg1.ljust(max_len, '\x00') msg2_padded = msg2.ljust(max_len, '\x00') encrypted_chars = [] for i in range(max_len): # 用key1加密msg1的当前字符 enc_c1 = chr(ord(msg1_padded[i]) ^ ord(key1[i % len(key1)])) # 用key2加密msg2的当前字符 enc_c2 = chr(ord(msg2_padded[i]) ^ ord(key2[i % len(key2)])) encrypted_chars.extend([enc_c1, enc_c2]) return ''.join(encrypted_chars) def decrypt(encrypted_msg, key): msg_chars = [] # 实际应用中可改用密钥哈希特征判断,这里为贴合示例直接用密钥内容 if key == "asdf": # 提取偶数索引位(0,2,4...)对应msg1 indices = range(0, len(encrypted_msg), 2) elif key == "xcvb": # 提取奇数索引位(1,3,5...)对应msg2 indices = range(1, len(encrypted_msg), 2) else: raise ValueError("无效密钥") for i, idx in enumerate(indices): enc_char = encrypted_msg[idx] # 异或还原字符,跳过占位的空字符 decrypted_char = chr(ord(enc_char) ^ ord(key[i % len(key)])) if decrypted_char != '\x00': msg_chars.append(decrypted_char) return ''.join(msg_chars) # 测试示例 key1 = "asdf" key2 = "xcvb" encrypted_message = encrypt("apple", "pear", key1, key2) print(decrypt(encrypted_message, key1)) # 输出: apple print(decrypt(encrypted_message, key2)) # 输出: pear
扩展说明
- 实际场景中,不要直接用密钥内容判断提取规则,可改用密钥的哈希值(如SHA256)的特征(如奇偶性、特定区间值)来决定提取逻辑,避免硬编码密钥
- 异或属于轻量加密方案,若需要更高安全性,可替换成AES等对称加密算法,将两个明文的加密结果交替拼接,解密时用对应密钥提取并解密对应部分
内容的提问来源于stack exchange,提问作者LGR
相关产品推荐
相关产品推荐

