是否存在标准化算法:不同密钥加密不同消息生成同一密文?
多密钥同密文加密的标准化实现
你描述的需求是用不同密钥加密不同消息得到同一个密文,且用对应密钥可解密出原消息,这在密码学中属于多密钥密文映射场景,存在基于标准密码学算法的实现方案,以下是两种可行的标准化构造:
1. 基于对称加密的NIST标准方案
该方案使用AES相关的标准组件(HKDF、SHA-256、PKCS#7填充)实现,所有算法均符合NIST规范,安全性有保障。
实现思路
- 生成随机IV(符合AES标准的128位长度),通过HKDF(基于HMAC-SHA256)分别从不同密钥和IV导出对应密钥流
- 调整IV,使得两个消息与对应密钥流异或后的结果完全一致(即目标密文C)
- 最终密文为IV与C的拼接,解密时通过IV和密钥重新导出密钥流,异或C得到原消息
代码示例(Node.js)
const crypto = require('crypto'); // PKCS#7 填充(NIST标准) function pad(message) { const blockSize = 16; const paddingLength = blockSize - (Buffer.from(message).length % blockSize); const padding = Buffer.alloc(paddingLength, paddingLength); return Buffer.concat([Buffer.from(message), padding]); } // PKCS#7 去填充 function unpad(buffer) { const paddingLength = buffer[buffer.length - 1]; return buffer.slice(0, buffer.length - paddingLength).toString(); } // 加密函数 function encrypt(messages, keys) { const [rawMsg1, rawMsg2] = messages; const [key1, key2] = keys; // 统一填充消息到块长度 const msg1 = pad(rawMsg1); const msg2 = pad(rawMsg2); let iv, targetC; // 寻找符合条件的IV do { iv = crypto.randomBytes(16); // 基于HKDF导出密钥流(用HMAC-SHA256实现HKDF的提取阶段) const dk1 = crypto.createHmac('sha256', key1).update(iv).digest(); const dk2 = crypto.createHmac('sha256', key2).update(iv).digest(); // 计算异或结果 const c1 = Buffer.from(msg1).map((byte, idx) => byte ^ dk1[idx]); const c2 = Buffer.from(msg2).map((byte, idx) => byte ^ dk2[idx]); // 验证是否一致 if (c1.equals(c2)) { targetC = c1; break; } } while (true); // 返回Base64编码的IV+密文 return Buffer.concat([iv, targetC]).toString('base64'); } // 解密函数 function decrypt(encryptedText, key) { const buffer = Buffer.from(encryptedText, 'base64'); const iv = buffer.slice(0, 16); const c = buffer.slice(16); // 导出密钥流 const dk = crypto.createHmac('sha256', key).update(iv).digest(); // 异或得到填充后的消息 const paddedMsg = Buffer.from(c).map((byte, idx) => byte ^ dk[idx]); // 去填充得到原消息 return unpad(paddedMsg); } // 测试用例 const message1 = "My password is: Doggies!1"; const message2 = "My password is shdhe93-4"; const key1 = "DummyKey"; const key2 = "RealKey"; const encryptedText = encrypt([message1, message2], [key1, key2]); console.log(decrypt(encryptedText, key1) === message1); // 输出true console.log(decrypt(encryptedText, key2) === message2); // 输出true
注意事项
- IV的搜索过程是高效的,因为伪随机密钥流的碰撞概率符合统计规律,通常只需几次迭代即可找到
- 所有使用的算法均为NIST标准化组件,可直接用于生产环境
- 填充机制确保不同长度的消息能统一处理,避免异或长度不匹配问题
2. 基于公钥密码学的标准化方案
如果允许使用公钥体系,可采用多接收者公钥加密(MR-PKE),这是一种专门支持多密钥解密同密文的密码学原语,已有基于椭圆曲线的SEC标准实现。
核心逻辑
- 将每个对称密钥作为私钥种子,生成对应的公钥/私钥对
- 使用MR-PKE加密算法,输入多个消息和对应公钥,生成统一密文
- 解密时使用对应私钥即可得到目标消息
这种方案无需IV搜索,直接通过公钥密码学的数学特性实现多密钥映射,适合大规模多接收者场景。
内容的提问来源于stack exchange,提问作者johnny 5
相关产品推荐
相关产品推荐

