Files

混合加密图片方案

本模块提供了一套完整的混合加密解决方案用于图片数据的安全传输。它使用RSA和AES-GCM混合加密方式确保数据传输的安全性和效率。

工作原理

  1. 混合加密使用RSA加密AES密钥使用AES-GCM加密实际数据

    • 生成随机AES-256密钥
    • 使用RSA公钥加密AES密钥
    • 使用AES-GCM加密图片数据
    • 组合加密后的AES密钥、nonce和加密数据
    • 将结果进行Base64编码便于网络传输
  2. 混合解密使用RSA私钥解密AES密钥使用AES-GCM解密数据

    • Base64解码密文
    • 分离加密的AES密钥、nonce和加密数据
    • 使用RSA私钥解密AES密钥
    • 使用解密后的AES密钥和nonce解密数据

后端使用方法 (Go)

// 生成RSA密钥对
privateKey, _ := hybrid_encrypt.GenerateRSAKey(2048)

// 导出公钥和私钥为PEM格式
pubPEM, _ := hybrid_encrypt.ExportPublicKeyPEM(&privateKey.PublicKey)
privPEM := hybrid_encrypt.ExportPrivateKeyPEM(privateKey)

// 将PEM格式的密钥转换为Base64编码便于在网络上传输
base64PubKey := base64.StdEncoding.EncodeToString(pubPEM)
base64PrivKey := base64.StdEncoding.EncodeToString(privPEM)

// 读取图片文件
imageData, _ := ioutil.ReadFile("path/to/image.jpg")

// 使用公钥加密图片
encryptedBase64, _ := hybrid_encrypt.EncryptImageWithBase64Key(base64PubKey, imageData)

// 将加密后的Base64字符串发送到前端
// ...

// 如果需要在后端解密
decryptedData, _ := hybrid_encrypt.DecryptImageWithBase64Key(base64PrivKey, encryptedBase64)

前端使用方法 (JavaScript)

import { decryptImage } from './hybrid_encrypt_js.js';

// 从后端接收加密的图片数据和私钥
const encryptedImageBase64 = '...'; // 从后端接收的Base64编码的加密图片数据
const privateKeyPEM = '...'; // 从安全渠道获取的PEM格式RSA私钥

// 解密图片
decryptImage(encryptedImageBase64, privateKeyPEM)
  .then(decryptedImageBase64 => {
    // 使用解密后的图片数据
    const imgElement = document.createElement('img');
    imgElement.src = decryptedImageBase64; // 直接设置为data:image/jpeg;base64,...格式
    document.body.appendChild(imgElement);
  })
  .catch(error => {
    console.error('图片解密失败:', error);
  });

安全注意事项

  1. 私钥必须妥善保管,不应在不安全的渠道传输
  2. 对于大型图片,考虑分块加密和解密
  3. 在生产环境中应使用至少2048位的RSA密钥
  4. 前端解密应在安全的环境中进行,避免私钥泄露

性能考虑

混合加密方案在处理大型数据(如高分辨率图片)时具有明显的性能优势:

  • RSA仅用于加密小型AES密钥32字节
  • 大型图片数据使用高效的AES-GCM加密
  • 加密后的数据大小增加有限主要是RSA加密的AES密钥部分