设为首页收藏本站
查看: 3235|回复: 0

[高级语言] [Java][Java加密与解密]《对称加密简单概念与代码实现》

[复制链接]
  • TA的每日心情
    奋斗
    前天 16:12
  • 签到天数: 728 天

    [LV.9]以坛为家II

    发表于 2021-11-4 16:06:18 | 显示全部楼层 |阅读模式
    对称加密:

    将要保护的数据用某种算法进行处理,处理后的数据成为密文。
    加密算法公开,但是密钥不公开,密钥可以理解为开锁的数字密码,不知道密码就无法进行解密数据。目前常用的对称加密算法有AES。
    且AES有AES-128、AES-256标准。
    简单来讲就是密钥长度的不一样,AES-128采用16字节的密钥。AES-256采用32字节的密钥更安全。


    让我们来看下加密代码实例

    1.         // 偏移量(可自定义)
    2.         public static final String VIPARA = "0123456789123456"; // AES 为16bytes. DES 为8bytes
    3.         // 编码方式
    4.         public static final String CODE_TYPE = "UTF-8";
    5.         // 填充类型
    6.         public static final String AES_TYPE = "AES/ECB/PKCS5Padding";
    7.         // 密钥(可自定义)
    8.         private static final String AES_KEY = "abcdabcdabcdabcd";
    9.         // AES固定格式为128/192/256bits.即:16/24/32bytes。DES固定格式为128bits,即8bytes。

    10.         /**
    11.          * 加密
    12.          *
    13.          * @param cleartext
    14.          * @return
    15.          */
    16.         public static String encrypt(String cleartext) {
    17.                 try {
    18.                         IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());
    19.                         // 两个参数,第一个为密钥字节数组, 第二个为加密方式 AES
    20.                         SecretKeySpec key = new SecretKeySpec(AES_KEY.getBytes(), "AES");
    21.                         // 实例化加密类,参数为加密方式,要写全
    22.                         Cipher cipher = Cipher.getInstance(AES_TYPE); // PKCS5Padding比PKCS7Padding效率高,PKCS7Padding可支持IOS加解密
    23.                         // 加密时使用:ENCRYPT_MODE; 解密时使用:DECRYPT_MODE;
    24.                         cipher.init(Cipher.ENCRYPT_MODE, key); // CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量
    25.                         // 加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式
    26.                         byte[] encryptedData = cipher.doFinal(cleartext.getBytes(CODE_TYPE));

    27.                         return new BASE64Encoder().encode(encryptedData);
    28.                 } catch (Exception e) {
    29.                         e.printStackTrace();
    30.                         return "";
    31.                 }
    32.         }

    33.         /**
    34.          * 解密
    35.          *
    36.          * @param encrypted
    37.          * @return
    38.          */
    39.         public static String decrypt(String encrypted) {
    40.                 try {
    41.                         byte[] byteMi = new BASE64Decoder().decodeBuffer(encrypted);
    42.                         SecretKeySpec key = new SecretKeySpec(AES_KEY.getBytes(), "AES");
    43.                         Cipher cipher = Cipher.getInstance(AES_TYPE);
    44.                         // 与加密时不同MODE:Cipher.DECRYPT_MODE
    45.                         cipher.init(Cipher.DECRYPT_MODE, key); // CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量
    46.                         byte[] decryptedData = cipher.doFinal(byteMi);
    47.                         return new String(decryptedData, CODE_TYPE);
    48.                 } catch (Exception e) {
    49.                         e.printStackTrace();
    50.                         return "";
    51.                 }
    52.         }
    复制代码

    1. public static void main(String[] args) throws Exception {
    2.                 String content = "123456";
    3.                 test(content);
    4.         }

    5.         public static void test(String content) throws UnsupportedEncodingException {
    6.                 System.out.println("加密内容:" + content);
    7.                 // 字节数
    8.                 int num = content.getBytes(CODE_TYPE).length;
    9.                 System.out.println("加密内容字节数: " + num);

    10.                 // 加密
    11.                 String encryptResult = encrypt(content);
    12.                 content = new String(encryptResult);
    13.                 System.out.println("加密后:" + content);

    14.                 // 解密
    15.                 String decryptResult = decrypt(encryptResult);
    16.                 content = new String(decryptResult);
    17.                 System.out.println("解密完成后:" + content);
    18.         }
    复制代码



    控制台输出:
    加密内容:123456
    加密内容字节数: 6
    加密后:W9291IebiZmw394ohe0Qiw==
    解密完成后:123456

    关于AES常见的使用场景:
    如Http Living Streaming 简称HLS,目前诸多网站采用这种协议进行在线视频播放。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    红盟社区--红客联盟 

    Processed in 0.063542 second(s), 21 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    备案号:冀ICP备20006029号-1 Powered by HUC © 2001-2021 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表