前端使用AES(ECB)加解密、国密算法SM2加解密、base64加解密、RSA加解密总结

本文详细介绍了在前端项目中如何使用AES(ECB模式)、国密SM2、Base64以及RSA算法进行数据的加解密操作。通过具体的代码示例,展示了在React环境中如何引入和封装这些加密库,以确保敏感信息的安全传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. AES(ECB)加解密

        AES加密在前端项目中的使用方法

        本人使用的框架 React 进行的AES前端加密(不管是React,Vue,还是引入的JQuery库一样)

1)  引用

        在public>index.html文件中引入

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>

2)  使用

var key = CryptoJS.enc.Utf8.parse("zhgerXHBVaaKm8xy")
var plaintText = 'onlystar'
var encryptedData =  CryptoJS.AES.encrypt(plaintText, key, {
    mode: CryptoJS.mode.ECB,  
    padding: CryptoJS.pad.Pkcs7
})
console.log("加密前:"+plaintText) // 加密前:onlystar
console.log("加密后:"+encryptedData) // 加密后:cp7hxlPgStaA4Jod5uKCuQ==
encryptedData = encryptedData.ciphertext.toString()
var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedData)
console.log("解密前hex:"+encryptedHexStr) // 解密前hex:729ee1c653e04ad680e09a1de6e282b9
var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr)
console.log("解密前:"+encryptedBase64Str) // 解密前:cp7hxlPgStaA4Jod5uKCuQ==
var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { 
    mode: CryptoJS.mode.ECB,  
    padding: CryptoJS.pad.Pkcs7
})
var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8)
console.log("解密后:"+decryptedStr) // 解密后:onlystar

3)  封装(ECB)方法

// 加密事件
encryptionHandler(word) {
    var key = CryptoJS.enc.Utf8.parse("distcoed20140222");
    var srcs = CryptoJS.enc.Utf8.parse(word);
    var encrypted = CryptoJS.AES.encrypt(srcs, key, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString();
}

// 解密事件
decryptionHandler(word) {
    var key = CryptoJS.enc.Utf8.parse("distcoed20140222");
    var decrypt = CryptoJS.AES.decrypt(word, key, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}

  2. 国密算法SM2加解密

1)  安装

npm install --save sm-crypto

2)  使用        

// 引入
const sm2 = require('sm-crypto').sm2;
const cipherMode = 0;


const publicKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const privateKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const value = "我是加密内容";

// 加密
let encryptData = sm2.doEncrypt(value, publicKey, cipherMode); // 加密结果
console.log("加密结果:", encryptData);

// 解密
let decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode); // 解密结果
console.log("解密结果:", decryptData);

3) 封装

const sm2 = require('sm-crypto').sm2
const cipherMode = 1 

// 加密
export function sm2Encrypt(text, key) {
  const enText = sm2.doEncrypt(text, key, cipherMode)
  return '04' + enText
}
// 解密
export function sm2Decrypt(text, key) {
  const deText = sm2.doDecrypt(text, key, cipherMode)
  return deText
}

3. base64加解密

1)  封装方法

//加密、解密算法封装:
function Base64() { 
    // private property 
    _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 
    // public method for encoding 
    this.encode = function (input) { 
      var output = ""; 
      var chr1, chr2, chr3, enc1, enc2, enc3, enc4; 
      var i = 0; 
      input = _utf8_encode(input); 
      while (i < input.length) { 
        chr1 = input.charCodeAt(i++); 
        chr2 = input.charCodeAt(i++); 
        chr3 = input.charCodeAt(i++); 
        enc1 = chr1 >> 2; 
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 
        enc4 = chr3 & 63; 
        if (isNaN(chr2)) { 
          enc3 = enc4 = 64; 
        } else if (isNaN(chr3)) { 
          enc4 = 64; 
        } 
        output = output + 
        _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + 
        _keyStr.charAt(enc3) + _keyStr.charAt(enc4); 
      } 
      return output; 
    } 
    // public method for decoding 
    this.decode = function (input) { 
      var output = ""; 
      var chr1, chr2, chr3; 
      var enc1, enc2, enc3, enc4; 
      var i = 0; 
      input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 
      while (i < input.length) { 
        enc1 = _keyStr.indexOf(input.charAt(i++)); 
        enc2 = _keyStr.indexOf(input.charAt(i++)); 
        enc3 = _keyStr.indexOf(input.charAt(i++)); 
        enc4 = _keyStr.indexOf(input.charAt(i++)); 
        chr1 = (enc1 << 2) | (enc2 >> 4); 
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 
        chr3 = ((enc3 & 3) << 6) | enc4; 
        output = output + String.fromCharCode(chr1); 
        if (enc3 != 64) { 
          output = output + String.fromCharCode(chr2); 
        } 
        if (enc4 != 64) { 
          output = output + String.fromCharCode(chr3); 
        } 
      } 
      output = _utf8_decode(output); 
      return output; 
    } 
    // private method for UTF-8 encoding 
    _utf8_encode = function (string) { 
      string = string.replace(/\r\n/g,"\n"); 
      var utftext = ""; 
      for (var n = 0; n < string.length; n++) { 
        var c = string.charCodeAt(n); 
        if (c < 128) { 
          utftext += String.fromCharCode(c); 
        } else if((c > 127) && (c < 2048)) { 
          utftext += String.fromCharCode((c >> 6) | 192); 
          utftext += String.fromCharCode((c & 63) | 128); 
        } else { 
          utftext += String.fromCharCode((c >> 12) | 224); 
          utftext += String.fromCharCode(((c >> 6) & 63) | 128); 
          utftext += String.fromCharCode((c & 63) | 128); 
        } 
      } 
      return utftext; 
    } 
    // private method for UTF-8 decoding 
    _utf8_decode = function (utftext) { 
      var string = ""; 
      var i = 0; 
      var c = c1 = c2 = 0; 
      while ( i < utftext.length ) { 
        c = utftext.charCodeAt(i); 
        if (c < 128) { 
          string += String.fromCharCode(c); 
          i++; 
        } else if((c > 191) && (c < 224)) { 
          c2 = utftext.charCodeAt(i+1); 
          string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 
          i += 2; 
        } else { 
          c2 = utftext.charCodeAt(i+1); 
          c3 = utftext.charCodeAt(i+2); 
          string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); 
          i += 3; 
        } 
      } 
      return string; 
    } 
}

2)  使用  

var base = new Base64();
var value = "我是加密内容123";

// 加密
let encryptData = base.encode(value); // 加密结果
console.log("加密结果:", encryptData);

// 解密
let decryptData = base.decode(value); // 解密结果
console.log("解密结果:", decryptData);

4. RSA加解密

1)  安装

npm install jsencrypt

2)  使用  

import JSEncrypt from "jsencrypt/bin/jsencrypt.min.js"

// 加密
rsaEncrypt(text, key) {
  const rsaEn = new JSEncrypt()
  rsaEn.setPublicKey(key)
  const enText = rsaEn.encrypt(text)
  return enText
}

//解密
rsaDecrypt(text, key) {
  const decrypt = new JSEncrypt()
  decrypt.setPrivateKey(key)
  const deText = decrypt.decrypt(text)
  return deText
}

<think>好的,我现在需要回答用户关于如何用公钥加密文件内容的代码示例的问题。用户已经提供了几个引用,我需要先仔细阅读这些引用,看看有没有相关的信息可以利用。 首先,引用[1]提到了Java中使用公钥加密数据的步骤,包括生成密钥对和使用公钥加密。引用[4]给出了Java加载公钥字符串并加密的示例代码,而引用[5]展示了SM2公钥加密的Java代码。引用[2]则讨论了PHP生成RSA密钥对的方法,但用户可能更关注Java,因为引用[1]、[4]、[5]都是Java相关的。引用[3]提供了密码学基础知识,但代码示例可能不够。 用户明确想要用公钥加密文件内容,所以需要找到如何读取文件、用公钥加密并输出的步骤。Java中常用的加密库是javax.crypto,特别是Cipher类。根据引用[4],加载公钥的方法已经有了,接下来需要结合文件操作和加密流程。 需要考虑的是,RSA加密有长度限制,不能直接加密大文件。通常的做法是使用对称加密(如AES加密文件,然后用RSA公钥加密对称密钥。但用户可能只需要基础示例,所以先提供直接加密小文件的代码,再说明大文件的处理方式。 代码结构大致分为:加载公钥、读取文件内容、加密数据、写入加密后的文件。需要注意异常处理和资源关闭。引用[4]中的loadPublicKey方法可以用来加载公钥字符串,假设用户已经生成了公钥并保存为字符串或文件。 然后,需要检查代码是否正确使用RSA模式,比如使用RSA/ECB/PKCS1Padding,这是常见的填充方式。同时,加密后的数据需要以Base64或二进制格式保存,这里选择Base64便于存储。 最后,生成相关问题,涵盖密钥生成、处理大文件、其他语言实现等,帮助用户扩展知识。</think>以下以Java为例演示使用RSA公钥加密文件内容的完整流程: ### 一、公钥加密文件实现步骤 1. 加载PEM格式公钥 2. 创建密码器并初始化 3. 分段读取文件内容 4. 执行加密操作 5. 保存加密结果 ### 二、Java代码示例 ```java import javax.crypto.Cipher; import java.nio.file.Files; import java.nio.file.Paths; import java.security.KeyFactory; import java.security.PublicKey; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; public class FileEncryptor { // 加载公钥 public static PublicKey loadPublicKey(String publicKeyPath) throws Exception { byte[] keyBytes = Files.readAllBytes(Paths.get(publicKeyPath)); String publicKeyPEM = new String(keyBytes) .replace("-----BEGIN PUBLIC KEY-----", "") .replace("-----END PUBLIC KEY-----", "") .replaceAll("\\s", ""); X509EncodedKeySpec keySpec = new X509EncodedKeySpec( Base64.getDecoder().decode(publicKeyPEM)); return KeyFactory.getInstance("RSA").generatePublic(keySpec); } // 加密文件 public static void encryptFile(PublicKey publicKey, String inputFile, String outputFile) throws Exception { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] inputData = Files.readAllBytes(Paths.get(inputFile)); byte[] encryptedData = cipher.doFinal(inputData); Files.write(Paths.get(outputFile), Base64.getEncoder().encode(encryptedData)); } public static void main(String[] args) throws Exception { PublicKey pubKey = loadPublicKey("public_key.pem"); encryptFile(pubKey, "plaintext.txt", "encrypted.bin"); } } ``` ### 三、关键技术说明 1. **密钥加载**:支持PEM格式公钥解析,需去除头尾标识和换行符[^4] 2. **加密模式**:使用`RSA/ECB/PKCS1Padding`填充方案,这是RSA标准实现方式[^3] 3. **数据编码**:加密结果采用Base64编码,便于存储和传输 4. **分段处理**:示例为简化直接读取全部内容,实际应分块处理(RSA最大加密长度=密钥长度/8 - 11)[^1] ### 四、优化建议 1. 大文件应结合AES+RSA混合加密:用RSA加密随机生成的AES密钥,再用AES加密文件内容 2. 增加异常处理机制,特别是`IllegalBlockSizeException`和`BadPaddingException` 3. 支持不同格式的密钥存储方式(如DER格式)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值