在项目中经常会对一些比较隐私的内容进行加密后再传输,比如登录密码、个人信息等;

DES和AES是目前两种比较常用的对称加密算法;

(此篇不讲原理,想了解原理可参考:DES算法、AES算法)

一、JS实现方式:

需要引入JavaScript加密库-CryptoJS

1.DES加密以及解密:

 1 //DES 加密
 2 function encryptByDES(message, key) {
 3     var keyHex = CryptoJS.enc.Utf8.parse(key);
 4     var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
 5         mode: CryptoJS.mode.ECB,
 6         padding: CryptoJS.pad.Pkcs7
 7     });
 8     return encrypted.toString();
 9 }
10 //DES 解密
11 function decryptByDES(ciphertext, key) {
12     var keyHex = CryptoJS.enc.Utf8.parse(key);
13     // direct decrypt ciphertext
14     var decrypted = CryptoJS.DES.decrypt({
15         ciphertext: CryptoJS.enc.Base64.parse(ciphertext)
16     }, keyHex, {
17         mode: CryptoJS.mode.ECB,
18         padding: CryptoJS.pad.Pkcs7
19     });
20     return decrypted.toString(CryptoJS.enc.Utf8);
21 }

2.AES加密以及解密:

 1 //AES 加密
 2 function encryptByAES(message, key) {
 3     var keyHex = CryptoJS.enc.Utf8.parse(key);
 4     var encrypted = CryptoJS.AES.encrypt(message, keyHex, {
 5         mode: CryptoJS.mode.ECB,
 6         padding: CryptoJS.pad.Pkcs7
 7     });
 8     return encrypted.toString();
 9 }
10 //AES 解密
11 function decryptByAES(ciphertext, key) {
12     var keyHex = CryptoJS.enc.Utf8.parse(key);
13     // direct decrypt ciphertext
14     var decrypted = CryptoJS.AES.decrypt({
15         ciphertext: CryptoJS.enc.Base64.parse(ciphertext)
16     }, keyHex, {
17         mode: CryptoJS.mode.ECB,
18         padding: CryptoJS.pad.Pkcs7
19     });
20     return decrypted.toString(CryptoJS.enc.Utf8);
21 }

二、Java实现

Java有两种AES加密实现方式:

1.使用AES-128-ECB加密模式,秘钥必须为16位字符串(128bit = 16 * 8bit);这种方式与上面JS的AES可以前后端配合一起使用;

 1 // 加密
 2 public static String Encrypt(String sSrc, String sKey) throws Exception {
 3     if (sKey == null) {
 4         System.out.print("Key为空null");
 5         return null;
 6     }
 7     // 判断Key是否为16位
 8     if (sKey.length() != 16) {
 9         System.out.print("Key长度不是16位");
10         return null;
11     }
12     byte[] raw = sKey.getBytes("utf-8");
13     SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
14     Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
15     cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
16     byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
17     //此处使用BASE64做转码功能,同时能起到2次加密的作用。
18     //return new Base64().encodeToString(encrypted);
19     return Base64.encode(encrypted);
20 }
21
22 // 解密
23 public static String Decrypt(String sSrc, String sKey) throws Exception {
24     try {
25         // 判断Key是否正确
26         if (sKey == null) {
27             System.out.print("Key为空null");
28             return null;
29         }
30         // 判断Key是否为16位
31         if (sKey.length() != 16) {
32             System.out.print("Key长度不是16位");
33             return null;
34         }
35         byte[] raw = sKey.getBytes("utf-8");
36         SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
37         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
38         cipher.init(Cipher.DECRYPT_MODE, skeySpec);
39         //先用base64转码
40         //byte[] encrypted1 = new Base64().decode(sSrc);
41         byte[] encrypted1 = Base64.decode(sSrc);
42         try {
43             byte[] original = cipher.doFinal(encrypted1);
44             String originalString = new String(original,"utf-8");
45             return originalString;
46         } catch (Exception e) {
47             System.out.println(e.toString());
48             return null;
49         }
50     } catch (Exception ex) {
51         System.out.println(ex.toString());
52         return null;
53     }
54 }

2.下面这种方式对加密解密的秘钥没有长度限制(代码中进行了补全到相应位数),但不能和JS的实现配合使用,将算法名称和秘钥的编码位数进行更改就变为了DES加密

 1 //加密
 2 public static String encrypt(String content, String password) {
 3     try {
 4         //将秘钥补全为128位
 5         KeyGenerator kgen = KeyGenerator.getInstance("AES");
 6         //若想改为DES加密,则需要将秘钥位数改为64位
 7         kgen.init(128, new SecureRandom(password.getBytes()));
 8         SecretKey secretKey = kgen.generateKey();
 9         byte[] enCodeFormat = secretKey.getEncoded();
10         SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
11         //创建密码器
12         Cipher cipher = Cipher.getInstance("AES");
13         byte[] byteContent = content.getBytes("utf-8");
14         //初始化
15         cipher.init(Cipher.ENCRYPT_MODE, key);
16         //加密
17         byte[] result = cipher.doFinal(byteContent);
18         //Base64转码
19         return Base64.encode(result);
20     } catch (NoSuchAlgorithmException e) {
21         e.printStackTrace();
22     } catch (NoSuchPaddingException e) {
23         e.printStackTrace();
24     } catch (InvalidKeyException e) {
25         e.printStackTrace();
26     } catch (UnsupportedEncodingException e) {
27         e.printStackTrace();
28     } catch (IllegalBlockSizeException e) {
29         e.printStackTrace();
30     } catch (BadPaddingException e) {
31         e.printStackTrace();
32     }
33     return null;
34 }
35
36 //解密
37 public static String decrypt(String content, String password) throws Exception {
38     try {
39         //将秘钥补全为128位
40         KeyGenerator kgen = KeyGenerator.getInstance("AES");
41         //若想改为DES加密,则需要将秘钥位数改为64位
42         kgen.init(128, new SecureRandom(password.getBytes()));
43         SecretKey secretKey = kgen.generateKey();
44         byte[] enCodeFormat = secretKey.getEncoded();
45         SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
46         //创建密码器
47         Cipher cipher = Cipher.getInstance("AES");
48         //初始化
49         cipher.init(Cipher.DECRYPT_MODE, key);
50         //Base64转码
51         byte[] encrypted1 = Base64.decode(content);
52         //解密
53         byte[] result = cipher.doFinal(encrypted1);
54         //二进制转为字符串
55         return new String(result, "utf-8");
56     } catch (NoSuchAlgorithmException e) {
57         e.printStackTrace();
58     } catch (NoSuchPaddingException e) {
59         e.printStackTrace();
60     } catch (InvalidKeyException e) {
61         e.printStackTrace();
62     } catch (IllegalBlockSizeException e) {
63         e.printStackTrace();
64     } catch (BadPaddingException e) {
65         e.printStackTrace();
66     }
67     return null;
68 }

加密解密时密码器的输入输出都为2进制数组,这里我们用Base64在加解密的中间过程中进行了转码,所以可以以字符串形式展示加密后的密文,也可以使用下面的方法将二进制数组转换为16进制的字符串来表示,同样起到转换的作用

 1 //将二进制数组转化为16进制字符串
 2 public static String parseByte2HexStr(byte buf[]) {
 3     StringBuffer sb = new StringBuffer();
 4     for (int i = 0; i < buf.length; i++) {
 5         String hex = Integer.toHexString(buf[i] & 0xFF);
 6         if (hex.length() == 1) {
 7             hex = '0' + hex;
 8         }
 9         sb.append(hex.toUpperCase());
10     }
11     return sb.toString();
12 }
13 //将16进制字符串转化为二进制数组
14 public static byte[] parseHexStr2Byte(String hexStr) {
15     if (hexStr.length() < 1)
16         return new byte[0];
17     byte[] result = new byte[hexStr.length()/2];
18     for (int i = 0;i< hexStr.length()/2; i++) {
19         int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
20         int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
21         result[i] = (byte) (high * 16 + low);
22     }
23     return result;
24 }

源码下载

转载于:https://www.cnblogs.com/Aoobruce/p/8243325.html

AES、DES加解密方法(Java和JS编程)相关推荐

  1. java 和 c# 下的RSA证书+AES+DES加解密实现

    java 和 c# 下的RSA+AES+DES加解密实现 前言 在实际应用中,经常有需要使用加解密的情况,RSA\AES\DES是比较常用的几种加解密方式,使用和实现方式都比较成熟可靠,本文简要介绍一 ...

  2. cbc cryptojs 前后端_前端CryptoJS AES/DES加解密与后端PHP AES/DES加解密

    本文涉及到的内容有:前端使用CryptoJS对数据进行DES或AES加密解密: 后端使用PHP openssl对数据进行解密和加密. 前端AES加密数据 首先在vue环境下安装crypto-js,cr ...

  3. C#中的DES加解密方法

    const string KEY_64 = "VavicApp"; const string IV_64 = "VavicApp"; //注意了,是8个字符,6 ...

  4. js des加密 java_Java实现与JS相同的Des加解密算法完整实例

    本文实例讲述了Java实现与JS相同的Des加解密算法.分享给大家供大家参考,具体如下: 这里演示java与js实现相同的des加解密算法,不多说,不废话,直接上代码 一.java实现 package ...

  5. java和php对接通用加解密方法整理

    整理记录下,java和php对接,对于数据加解密的方法. import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; imp ...

  6. 一个java的DES加解密类转换成C#

    原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util;import java.security.*; //im ...

  7. 【密码学】DES加解密原理及其Java实现算法

    DES简介 DES(Data Encryption Standard)是对称加解密算法的一种,由IBM公司W.Tuchman和C.Meyer在上个世纪70年代开发. 该算法使用64位密钥(其中包含8位 ...

  8. java实现DES加解密算法

    以下是我用java实现的DES算法,实现中可能存在一点问题自己没空去找,但我觉得DES的算法过程肯定没错!现在暂时没时间去找到底是哪里的问题,有空再瞧瞧自己的代码喽! makekey.java是生成密 ...

  9. 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)

    在最近的项目中,前端后台数据交互需要进行加密之后传输使用,以保证系统数据的安全.有关数据加密解密的问题,有很多种加密的方式,在这里我选择了AES的加密方式.特此写下此篇博文,总结讲述下PHP和JS进行 ...

  10. aes js加密php解密实例,基于PHP和JS的AES相互加密解密方法详解(CryptoJS)_PHP_JS_AES源码...

    [实例简介] 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)_PHP_JS_AES源码 [实例截图] [核心代码] 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)_ ...

最新文章

  1. linux释放内存脚本
  2. 单元测试mock之mockito使用
  3. 一位软件工程师的6年总结(转)
  4. php拷贝mysql表_MySQL复制表数据或表结构到新表中
  5. SCVMM2008的P2V后 MAC地址冲突
  6. 《Tuning I/O Performance》读后笔记
  7. uinavigation样式
  8. kotlin 查找id_Kotlin程序查找平行四边形的区域
  9. 二叉树的几种遍历方法
  10. 报错解决——make: *** No targets specified and no makefile found. Stop
  11. 全参考视频质量评价方法(PSNR,SSIM)以及相关数据库
  12. 【模式识别-北理工】02模式识别算法体系
  13. 老K整理|4月|物流技术圈职位招聘合集!
  14. C语言 完数C语言 完数C语言 完数
  15. ARP伪造使用抓包工具进行ARP欺骗arp伪造攻击
  16. java面试笔试大全
  17. 使用pyinstaller打包python源代码生成exe程序
  18. 安国主控,U盘量产,起死回生
  19. Ubuntu18.04 显卡驱动完美安装(解决安装后无法进入桌面)
  20. php curl发邮件,使用PHP cURL通过Mailgun API发送带附件的电子邮件

热门文章

  1. Linux安装最新版Mono,Jexus(截至2015年12月30日)
  2. linux配置时间服务器(ntp)
  3. 正在使用的文件如何删除?
  4. 搞了一个迭代发布下SpringBoot Jar瘦身方案,老大给我打了个A+
  5. 我是如何把SpringBoot项目的并发提升十倍量级的
  6. 宁愿月薪1万招新人,却不愿给月薪5千的老员工涨薪
  7. 几种线程池的实现算法分析
  8. 送书丨超级畅销书《漫画算法》50 本免费送!
  9. 樊登读书赋能读后感_一场人均4万元的知识盛宴,樊登直播首秀到底讲了什么?...
  10. python tableview添加内容_如何在Python PyQt4 TableView中以编程方式更改/更新数据?