AES、DES加解密方法(Java和JS编程)
在项目中经常会对一些比较隐私的内容进行加密后再传输,比如登录密码、个人信息等;
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编程)相关推荐
- java 和 c# 下的RSA证书+AES+DES加解密实现
java 和 c# 下的RSA+AES+DES加解密实现 前言 在实际应用中,经常有需要使用加解密的情况,RSA\AES\DES是比较常用的几种加解密方式,使用和实现方式都比较成熟可靠,本文简要介绍一 ...
- cbc cryptojs 前后端_前端CryptoJS AES/DES加解密与后端PHP AES/DES加解密
本文涉及到的内容有:前端使用CryptoJS对数据进行DES或AES加密解密: 后端使用PHP openssl对数据进行解密和加密. 前端AES加密数据 首先在vue环境下安装crypto-js,cr ...
- C#中的DES加解密方法
const string KEY_64 = "VavicApp"; const string IV_64 = "VavicApp"; //注意了,是8个字符,6 ...
- js des加密 java_Java实现与JS相同的Des加解密算法完整实例
本文实例讲述了Java实现与JS相同的Des加解密算法.分享给大家供大家参考,具体如下: 这里演示java与js实现相同的des加解密算法,不多说,不废话,直接上代码 一.java实现 package ...
- java和php对接通用加解密方法整理
整理记录下,java和php对接,对于数据加解密的方法. import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; imp ...
- 一个java的DES加解密类转换成C#
原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util;import java.security.*; //im ...
- 【密码学】DES加解密原理及其Java实现算法
DES简介 DES(Data Encryption Standard)是对称加解密算法的一种,由IBM公司W.Tuchman和C.Meyer在上个世纪70年代开发. 该算法使用64位密钥(其中包含8位 ...
- java实现DES加解密算法
以下是我用java实现的DES算法,实现中可能存在一点问题自己没空去找,但我觉得DES的算法过程肯定没错!现在暂时没时间去找到底是哪里的问题,有空再瞧瞧自己的代码喽! makekey.java是生成密 ...
- 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)
在最近的项目中,前端后台数据交互需要进行加密之后传输使用,以保证系统数据的安全.有关数据加密解密的问题,有很多种加密的方式,在这里我选择了AES的加密方式.特此写下此篇博文,总结讲述下PHP和JS进行 ...
- aes js加密php解密实例,基于PHP和JS的AES相互加密解密方法详解(CryptoJS)_PHP_JS_AES源码...
[实例简介] 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)_PHP_JS_AES源码 [实例截图] [核心代码] 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)_ ...
最新文章
- linux释放内存脚本
- 单元测试mock之mockito使用
- 一位软件工程师的6年总结(转)
- php拷贝mysql表_MySQL复制表数据或表结构到新表中
- SCVMM2008的P2V后 MAC地址冲突
- 《Tuning I/O Performance》读后笔记
- uinavigation样式
- kotlin 查找id_Kotlin程序查找平行四边形的区域
- 二叉树的几种遍历方法
- 报错解决——make: *** No targets specified and no makefile found. Stop
- 全参考视频质量评价方法(PSNR,SSIM)以及相关数据库
- 【模式识别-北理工】02模式识别算法体系
- 老K整理|4月|物流技术圈职位招聘合集!
- C语言 完数C语言 完数C语言 完数
- ARP伪造使用抓包工具进行ARP欺骗arp伪造攻击
- java面试笔试大全
- 使用pyinstaller打包python源代码生成exe程序
- 安国主控,U盘量产,起死回生
- Ubuntu18.04 显卡驱动完美安装(解决安装后无法进入桌面)
- php curl发邮件,使用PHP cURL通过Mailgun API发送带附件的电子邮件
热门文章
- Linux安装最新版Mono,Jexus(截至2015年12月30日)
- linux配置时间服务器(ntp)
- 正在使用的文件如何删除?
- 搞了一个迭代发布下SpringBoot Jar瘦身方案,老大给我打了个A+
- 我是如何把SpringBoot项目的并发提升十倍量级的
- 宁愿月薪1万招新人,却不愿给月薪5千的老员工涨薪
- 几种线程池的实现算法分析
- 送书丨超级畅销书《漫画算法》50 本免费送!
- 樊登读书赋能读后感_一场人均4万元的知识盛宴,樊登直播首秀到底讲了什么?...
- python tableview添加内容_如何在Python PyQt4 TableView中以编程方式更改/更新数据?