You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将两条消息加密为单个字符串?双密钥解密不同内容技术咨询

存在这类加密方法,以下是具体实现思路和代码

这种需求可以通过信息分存+密钥定向提取的思路实现,核心是把两个明文的信息嵌入到同一个加密字符串中,用不同密钥触发不同的提取和解密规则。

实现原理

  1. 先将两个明文补全到相同长度(短的用空字符占位)
  2. 把两个明文的字符交替拼接,同时用对应密钥做异或加密
  3. 解密时,根据密钥选择提取对应的交替位,再用密钥做异或还原明文

具体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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:32:03