专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

开发必备:多种语言实现AES加密解密示例保证数据安全传输与存储

ins518 2024-09-24 17:50:41 技术文章 17 ℃ 0 评论

在软件开发过程,为保证数据传输和存储安全,加密是一种重要的技术手段。其中,AES(Advanced Encryption Standard)是一种常用的对称加密算法,它可以通过不同的模式和填充方式来满足不同的加密需求。

在本文中,我们将重点介绍 AES 加密算法的 ECB 模式和 PKCS5Padding 填充方式,以及如何在 Js、Java 、Python、Node.js等几种常用编程语言中实现加密和解密的过程。

  • ECB 模式ECB(Electronic Codebook)模式是最简单的 AES 加密模式之一。它将明文分割成固定大小的数据块,并对每个数据块分别进行加密。每个数据块之间是独立的,因此,相同的明文块将始终生成相同的密文块。
  • PKCS5Padding 填充方式一种常用的填充方式,用于将数据块调整为固定长度的倍数。在 AES 加密中,数据块长度通常为 128 位(16 字节),如果明文长度不是块长度的整数倍,就需要使用填充方式进行补位。例如,如果需要补位 5 个字节,就会使用值为 0x05 的字节进行填充。

JS版本

在 JavaScript 中使用 CryptoJS 库进行 AES/ECB/PKCS5Padding 加密时,你可以按照以下方式进行操作:

通过 npm 安装 crypto-js:

npm install crypto-js

示例代码:


import CryptoJS from 'crypto-js';

// 明文
const plaintext ='{"objectName":"test","pageNo":0,"pageSize":10}'
 // 密钥,用户自定义
const key = '1234567890123456';

function encrypt(data, key) {
  const sKey = CryptoJS.enc.Utf8.parse(key);
  const sContent = CryptoJS.enc.Utf8.parse(data);
  const encrypted = CryptoJS.AES.encrypt(sContent, sKey, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
  })
  return encrypted.toString();
}

function decrypt(data, key) {
  const sKey = CryptoJS.enc.Utf8.parse(key);
  const decrypt = CryptoJS.AES.decrypt(data, sKey, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
  })
  return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}

const encrypted = encrypt(plaintext, key)

console.log('加密:', encrypted); 

const decrypted = decrypt(encrypted, key)

console.log('解密:', decrypted);

上述示例代码输出结果:

加密: Qo3E1B8ZR6Mry99RJm+h41hl/AFpFd6eczi//vidPdleezANZ+3T3DJsqEx3HhRu
解密: {"objectName":"test","pageNo":0,"pageSize":10}

Java版本

在 Java 中,可以使用 javax.crypto 包中的 Cipher 类来实现 AES 加密和解密。

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class AESUtil {
    private static final String AES_ALGORITHM = "AES";
    private static final String AES_TRANSFORMATION = "AES/ECB/PKCS5Padding";
    // 密钥,用户自定义
		private static final String AES_KEY = "1234567890123456";

    public static String encrypt(String plaintext) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(AES_KEY.getBytes(StandardCharsets.UTF_8), AES_ALGORITHM);
            Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
            return Base64.getEncoder().encodeToString(encryptedBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String decrypt(String encryptedText) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(AES_KEY.getBytes(StandardCharsets.UTF_8), AES_ALGORITHM);
            Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
            byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
            return new String(decryptedBytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) throws Exception {
      	// 明文
        String plaintext = "{\"objectName\":\"test\",\"pageNo\":0,\"pageSize\":10}";
        // AES 加密
        String encryptedText = encrypt(plaintext);
        System.out.println("加密: " + encryptedText);
        // AES 解密
        String decryptedText = decrypt(encryptedText);
        System.out.println("解密: " + decryptedText);
        // 解密前端密文,上述js版本AES加密生成
        String decryptedText2 = "Qo3E1B8ZR6Mry99RJm+h41hl/AFpFd6eczi//vidPdleezANZ+3T3DJsqEx3HhRu";
        System.out.println("解密前端密文: " + decryptedText2);
    }
}

上述示例代码输出结果:

加密: Qo3E1B8ZR6Mry99RJm+h41hl/AFpFd6eczi//vidPdleezANZ+3T3DJsqEx3HhRu
解密: {"objectName":"test","pageNo":0,"pageSize":10}
解密前端密文: {"objectName":"test","pageNo":0,"pageSize":10}


Python版本

在 Python 3 中,你可以使用 pycryptodome 库来进行 AES 算法的 ECB 模式和 PKCS5Padding 填充方式的加密和解密。

安装了 pycryptodome 库:

pip install pycryptodome

示例代码:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64

# 密钥,用户自定义
key = '1234567890123456';

# 明文
plaintext ='{"objectName":"test","pageNo":0,"pageSize":10}'

# 创建 AES 加密器和解密器
cipher = AES.new(key, AES.MODE_ECB)
decipher = AES.new(key, AES.MODE_ECB)

# 加密
encrypted_text = cipher.encrypt(pad(plaintext.encode('utf-8'), AES.block_size))
encrypted_text_base64 = base64.b64encode(encrypted_text).decode('utf-8')
print('加密后的数据:', encrypted_text_base64)

# 解密
decrypted_text = decipher.decrypt(base64.b64decode(encrypted_text_base64))
decrypted_text = unpad(decrypted_text, AES.block_size).decode('utf-8')
print('解密后的数据:', decrypted_text)


Node.js版本

在 Node.js 中,可以使用 crypto 模块来实现AES 算法的 ECB 模式和 PKCS5Padding 填充方式

const crypto = require('crypto');

function encrypt(text, key) {
  const cipher = crypto.createCipheriv('aes-128-ecb', key, '');
  cipher.setAutoPadding(true);
  let encrypted = cipher.update(text, 'utf8', 'base64');
  encrypted += cipher.final('base64');
  return encrypted;
}

function decrypt(encryptedText, key) {
  const decipher = crypto.createDecipheriv('aes-128-ecb', key, '');
  decipher.setAutoPadding(true);
  let decrypted = decipher.update(encryptedText, 'base64', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

// 明文
const plaintext ='{"objectName":"test","pageNo":0,"pageSize":10}'
// 密钥,用户自定义
const key = '1234567890123456';

const encrypted = encrypt(plaintext, key)
console.log('加密:', encrypted); 

const decrypted = decrypt(encrypted, key)
console.log('解密:', decrypted);

// 解密前端密文,上述js版本AES加密生成
const decrypted2 = 'Qo3E1B8ZR6Mry99RJm+h41hl/AFpFd6eczi//vidPdleezANZ+3T3DJsqEx3HhRu'
console.log('解密前端密文:', decrypt(decrypted2));

欢迎点赞+关注,查看后续更多精彩内容!!!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表