GBase8c aes_encrypt和aes_decrypt函数

瑞星  金牌会员 | 2025-1-23 00:40:27 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 959|帖子 959|积分 2877

在数据库中,aes_encrypt和aes_decrypt函数进行加解密时使用的块加密模式。
GBase8c 与 MySQL 的aes_encrypt和aes_decrypt函数区别:
1、GBase8c 中的初始化向量init_vector不能为空
2、MySQL的加密模块block_encryption_mode 为aes-128-ecb,GBase8c 不支持aes-128-ecb,默认加密模块为aes-128-cbc
3、GBase8c 中该函数仅在MY兼容模式时(即sql_compatibility = ‘B’)有效,其他类型不支持该函数。
4、初始化向量init_vector需要大于16字节
aes_encrypt(str, key_str, init_vector)
  1. 描述:基于AES算法,使用密钥字符串key_str和初始化向量init_vector对字符串str进行加密。
  2. 参数解释:
  3. -- str:需要被加密的字符串。若str为NULL,函数返回NULL。
  4. -- key_str:密钥字符串。若key_str为NULL,函数返回NULL。为了安全,对于128bit/192bit/256bit的密钥长度(由块加密模式block_encryption_mode确定,参数介绍请参见安全配置),建议用户使用128bit/192bit/256bit的安全随机数作为密钥字符串。
  5. -- init_vector:为需要它的块加密模式提供初始化变量,长度大于等于16字节(大于16的字节会被在自动忽略)。str和key_str均不为NULL时,该参数不可为NULL,否则报错。为了安全,建议用户在OFB模式下,保证每次加密IV值的唯一性;在CBC模式和CFB模式下,保证每次加密的IV值不可被预测。
  6. 返回值类型:text
复制代码
aes_decrypt(pass_str, key_str, init_vector)
  1. 描述:基于AES算法,使用密钥字符串key_str和初始化向量init_vector对字符串str进行解密。
  2. 参数解释:
  3. -- pass_str:需要被解密的字符串。若pass_str为NULL,函数返回NULL。
  4. -- key_str: 密钥字符串。若key_str为NULL,函数返回NULL。为了安全,对于128bit/192bit/256bit的密钥长度(由块加密模式block_encryption_mode确定,默认参数为 aes-128-cbc ),建议用户使用128bit/192bit/256bit的安全随机数作为密钥字符串。
  5. -- init_vector:为需要它的块解密模式提供初始化变量,长度大于等于16字节(大于16的字节会被在自动忽略)。pass_str和key_str均不为NULL时,该参数不可为NULL,否则报错。为了安全,建议用户在OFB模式下,保证每次加密IV值的唯一性;在CBC模式和CFB模式下,保证每次加密的IV值不可被预测。
  6. 返回值类型:text
复制代码
aes-128-cbc 加解密对应的java代码
  1. import javax.crypto.Cipher;
  2. import javax.crypto.spec.IvParameterSpec;
  3. import javax.crypto.spec.SecretKeySpec;
  4. import java.nio.charset.StandardCharsets;
  5. import java.util.Base64;
  6. /**
  7. * 测试 AES-128-CBC 加解密 (base64、hex)
  8. * 注意:在java中,加解密的key 需要大于等于16字节
  9. */
  10. public class Aes128CbcEncryptFullUtil {
  11.     /**
  12.      * select hex(aes_encrypt('hello,world', '100860147#.qwert','10010963@Axcvbnm')) from dual;
  13.      * select to_base64(aes_encrypt('hello,world', '100860147#.qwert','10010963@Axcvbnm')) from dual;
  14.      */
  15.     // AES加密密钥
  16.     private static String KEY = "100860147#.qwert";
  17.     // AES加密向量
  18.     private static String IV = "10010963@Axcvbnm";
  19.     // 使用Base64进行加密
  20.     public static String encryptToBase64(String data, String key, String iv) throws Exception {
  21.         try {
  22.             // 创建AES加密器
  23.             Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  24.             SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
  25.             IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
  26.             // 初始化加密器
  27.             cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
  28.             // 执行加密操作
  29.             byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
  30.             // 将加密结果转换为Base64字符串并返回
  31.             return base64Encode(encrypted);
  32.         } catch (Exception e) {
  33.             e.printStackTrace();
  34.             return null;
  35.         }
  36.     }
  37.     // 使用Base64进行解密
  38.     public static String desEncryptFromBase64(String data, String key, String iv) throws Exception {
  39.         try {
  40.             // 将Base64字符串解码为字节数组
  41.             byte[] encrypted = base64Decode(data);
  42.             // 创建AES解密器
  43.             Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  44.             SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
  45.             IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
  46.             // 初始化解密器
  47.             cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
  48.             // 执行解密操作
  49.             byte[] original = cipher.doFinal(encrypted);
  50.             // 将解密结果转换为字符串并返回
  51.             return new String(original, StandardCharsets.UTF_8).trim();
  52.         } catch (Exception e) {
  53.             e.printStackTrace();
  54.             return null;
  55.         }
  56.     }
  57.     // 使用16进制进行加密
  58.     public static String encryptToHex(String data, String key, String iv) throws Exception {
  59.         try {
  60.             // 创建AES加密器
  61.             Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  62.             SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
  63.             IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
  64.             // 初始化加密器
  65.             cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
  66.             // 执行加密操作
  67.             byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
  68.             // 将加密结果转换为16进制字符串并返回
  69.             return bytesToHex(encrypted);
  70.         } catch (Exception e) {
  71.             e.printStackTrace();
  72.             return null;
  73.         }
  74.     }
  75.     // 使用16进制进行解密
  76.     public static String desEncryptFromHex(String data, String key, String iv) throws Exception {
  77.         try {
  78.             // 将16进制字符串转换为字节数组
  79.             byte[] encrypted = hexStringToByteArray(data);
  80.             // 创建AES解密器
  81.             Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  82.             SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
  83.             IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
  84.             // 初始化解密器
  85.             cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
  86.             // 执行解密操作
  87.             byte[] original = cipher.doFinal(encrypted);
  88.             // 将解密结果转换为字符串并返回
  89.             return new String(original, StandardCharsets.UTF_8).trim();
  90.         } catch (Exception e) {
  91.             e.printStackTrace();
  92.             return null;
  93.         }
  94.     }
  95.     // 将字节数组转换为16进制字符串
  96.     public static String bytesToHex(byte[] bytes) {
  97.         StringBuilder sb = new StringBuilder();
  98.         for (byte b : bytes) {
  99.             sb.append(String.format("%02X", b));
  100.         }
  101.         return sb.toString();
  102.     }
  103.     // 将16进制字符串转换为字节数组
  104.     public static byte[] hexStringToByteArray(String s) {
  105.         int len = s.length();
  106.         byte[] data = new byte[len / 2];
  107.         for (int i = 0; i < len; i += 2) {
  108.             data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
  109.         }
  110.         return data;
  111.     }
  112.     // 使用Base64进行编码
  113.     public static String base64Encode(byte[] bytes) {
  114.         return Base64.getEncoder().encodeToString(bytes);
  115.     }
  116.     // 使用Base64进行解码
  117.     public static byte[] base64Decode(String str) {
  118.         return Base64.getDecoder().decode(str);
  119.     }
  120.     public static void main(String[] args) throws Exception {
  121.         String data = "hello,world";
  122.         // 使用Base64进行加密
  123.         String base64Encrypt = encryptToBase64(data, KEY, IV);
  124.         System.out.println("加密数据 (Base64): " + base64Encrypt);
  125.         // 使用Base64进行解密
  126.         String base64Decrypt = desEncryptFromBase64(base64Encrypt, KEY, IV);
  127.         System.out.println("解密数据 (Base64): " + base64Decrypt);
  128.         // 使用16进制进行加密
  129.         String hexEncrypt = encryptToHex(data, KEY, IV);
  130.         System.out.println("加密数据 (Hex): " + hexEncrypt);
  131.         // 使用16进制进行解密
  132.         String hexDecrypt = desEncryptFromHex(hexEncrypt, KEY, IV);
  133.         System.out.println("解密数据 (Hex): " + hexDecrypt);
  134.     }
  135. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表