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

是否存在标准化算法:不同密钥加密不同消息生成同一密文?

多密钥同密文加密的标准化实现

你描述的需求是用不同密钥加密不同消息得到同一个密文,且用对应密钥可解密出原消息,这在密码学中属于多密钥密文映射场景,存在基于标准密码学算法的实现方案,以下是两种可行的标准化构造:

1. 基于对称加密的NIST标准方案

该方案使用AES相关的标准组件(HKDF、SHA-256、PKCS#7填充)实现,所有算法均符合NIST规范,安全性有保障。

实现思路

  1. 生成随机IV(符合AES标准的128位长度),通过HKDF(基于HMAC-SHA256)分别从不同密钥和IV导出对应密钥流
  2. 调整IV,使得两个消息与对应密钥流异或后的结果完全一致(即目标密文C)
  3. 最终密文为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标准实现。

核心逻辑

  1. 将每个对称密钥作为私钥种子,生成对应的公钥/私钥对
  2. 使用MR-PKE加密算法,输入多个消息和对应公钥,生成统一密文
  3. 解密时使用对应私钥即可得到目标消息

这种方案无需IV搜索,直接通过公钥密码学的数学特性实现多密钥映射,适合大规模多接收者场景。

内容的提问来源于stack exchange,提问作者johnny 5

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:15:06