混合加密图片方案
本模块提供了一套完整的混合加密解决方案,用于图片数据的安全传输。它使用RSA和AES-GCM混合加密方式,确保数据传输的安全性和效率。
工作原理
-
混合加密:使用RSA加密AES密钥,使用AES-GCM加密实际数据
- 生成随机AES-256密钥
- 使用RSA公钥加密AES密钥
- 使用AES-GCM加密图片数据
- 组合加密后的AES密钥、nonce和加密数据
- 将结果进行Base64编码,便于网络传输
-
混合解密:使用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);
});
安全注意事项
- 私钥必须妥善保管,不应在不安全的渠道传输
- 对于大型图片,考虑分块加密和解密
- 在生产环境中,应使用至少2048位的RSA密钥
- 前端解密应在安全的环境中进行,避免私钥泄露
性能考虑
混合加密方案在处理大型数据(如高分辨率图片)时具有明显的性能优势:
- RSA仅用于加密小型AES密钥(32字节)
- 大型图片数据使用高效的AES-GCM加密
- 加密后的数据大小增加有限,主要是RSA加密的AES密钥部分