Java实现常用的三种加密算法详解
前言
编程中常见的加密算法有以下几种,它们在不同场景中分别有应用。除信息摘要算法外,其它加密方式都会需要密钥。
密钥
密钥(key,又常称金钥)是指某个用来完成加密、解密、完整性验证等密码学应用的秘密信息。
密钥分类
- 加解密中的密钥:对称加密中共享相同的密钥,非对称加密中分公钥和私钥,公钥加密私钥解密。
- 消息认证码和数字签名中的密钥:在消息认证码中,消息发送方和接收方使用共享密钥进行认证。在数字签名中,签名使用私钥,而验证使用公钥。
- 会话密钥和主密钥:每次通信只使用一次的密钥称为会话密钥(session key)。相对于会话密钥,重复使用的密钥称为主密钥(master key)。
密钥和密码
密码一般是由用户生成,具有可读性,可以记忆和存储,常用于软件管理,而密钥是供实现加密算法的软件使用,不需要具备可读性(不过在编程中为了方便阅读都进行Base64)。我们也可以通过密码来生成密钥。
密钥管理
- 生成密钥:可以用随机数生成密钥,也可以用口令生成密钥。
- 配送密钥:可采用事先共享密钥、使用密钥分配中心、使用公钥密码、使用Diffie-Hellman密钥交换。
- 更新密钥
- 保存密钥
- 作废密钥
密钥生成
jdk 中 jce (Java Cryptography Extension) 包含了加密相关的所有API。
生成对称加密算法的密钥
public static SecretKey generateKey(int keySize) {KeyGenerator keyGenerator;try {keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(keySize);return keyGenerator.generateKey();} catch (NoSuchAlgorithmException e) {// ignorereturn null;}}
复制代码
生成对称非对称加密算法的密钥
/*** 生成非对称密钥对** @param keySize 密钥大小* @param random 指定随机来源,默认使用 JCAUtil.getSecureRandom()* @return 非对称密钥对* @throws NoSuchAlgorithmException NoSuchAlgorithm*/public static PPKeys genKeysRSA(int keySize, SecureRandom random) throws NoSuchAlgorithmException {KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");if (null != random) {generator.initialize(keySize, random);} else {generator.initialize(keySize);}KeyPair pair = generator.generateKeyPair();PPKeys keys = new PPKeys();PublicKey publicKey = pair.getPublic();PrivateKey privateKey = pair.getPrivate();keys.setPublicKey(Base64.getEncoder().encodeToString(publicKey.getEncoded()));keys.setPrivateKey(Base64.getEncoder().encodeToString(privateKey.getEncoded()));return keys;}
复制代码
密钥协商(Diffie-Hellman)
密钥协商是一种协议,两方或多方在通过该协议建立相同的共享密钥,然后通讯内容进行对称加密传输,而不需要交换密钥。
大致过程:每一方生成一个公私钥对并将公钥分发给其它方,当都获得其他方的公钥副本后就可以离线计算共享密钥。
Java中提供了 KeyAgreement
可以实现密钥协商。
- Alice 和 Bob 分别用他们的私钥初始化自己的密钥协商对象
KeyAgreement
,调用init()
方法; - 然后将通信的每一方的公钥 传入执行
doPhase(Key key, boolean lastPhase)
; - 各方生成共享密钥
generateSecret()
。
public static void diffieHellman() throws Exception {AlgorithmParameterGenerator dhParams = AlgorithmParameterGenerator.getInstance("DH");dhParams.init(1024);KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");keyGen.initialize(dhParams.generateParameters().getParameterSpec(DHParameterSpec.class), new SecureRandom());KeyAgreement aliceKeyAgree = KeyAgreement.getInstance("DH");KeyPair alicePair = keyGen.generateKeyPair();KeyAgreement bobKeyAgree = KeyAgreement.getInstance("DH");KeyPair bobPair = keyGen.generateKeyPair();aliceKeyAgree.init(alicePair.getPrivate());bobKeyAgree.init(bobPair.getPrivate());aliceKeyAgree.doPhase(bobPair.getPublic(), true);bobKeyAgree.doPhase(alicePair.getPublic(), true);boolean agree = Base64.getEncoder().encodeToString(aliceKeyAgree.generateSecret()).equals(Base64.getEncoder().encodeToString(bobKeyAgree.generateSecret()));System.out.println(agree);}
复制代码
信息摘要算法
信息摘要算法又叫加密散列算法,加密过程不需要密钥,常见的加密散列算法有MD系列和SHA系列。
一个理想的加密散列函数应该具备以下特性:
- 任何信息传入后,输出的总是长度固定;
- 消息摘要看起来是“随机的”,这样根据原始信息就很难推测出值;
- 好的散列函数碰撞概率应该极低,也就是不同信息传入后得到相同值的概率;
MD系列
MD5信息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的加密散列函数,输出出一个128位(16字节)的散列值(hash value),MD5最初设计为加密散列函数,而目前发现它存在大量漏洞,所以不建议直接用作加密,不过在非加密场景下如:数据完整性校验,文件完整性校验它仍然有广泛的应用。
public static String md5(String content) {try {MessageDigest digest = MessageDigest.getInstance("MD5");byte[] bytes = digest.digest(content.getBytes(StandardCharsets.UTF_8));return Hex.encodeHexString(bytes);} catch (final NoSuchAlgorithmException e) {throw new IllegalArgumentException(e);}}
复制代码
SHA系列
安全散列算法(Secure Hash Algorithm,缩写为SHA)是一个加密散列函数家族,是FIPS(美国联邦信息处理标准)所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
它们分别包含 SHA-0、SHA-1、SHA-2、SHA-3
,其中 SHA-0、SHA-1
输出长度是160位,SHA-2
包含 SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256
,我们平时常用 SHA-256
。
public static String sha256(String content) {try {MessageDigest digest = MessageDigest.getInstance("SHA-256);byte[] bytes = digest.digest(content.getBytes(StandardCharsets.UTF_8));return Hex.encodeHexString(bytes);} catch (final NoSuchAlgorithmException e) {throw new IllegalArgumentException(e);}}
复制代码
对称加密算法
对称加密算法,双方持有相同密钥进行加解密,常见的对称加密算法:DES
3DES
AES128
AES192
AES256
。理解对称加密需要先明白下面几个概念:
- 分组密码模式:将明文切割进行加密,再将密文拼接到一起。比如AES中会将明文数据切割为大小16字节的数据块,最后一块不够16字节时,使用Padding模式进行补充。
- 填充(Padding) :它有三种模式PKCS5、PKCS7和NOPADDING,PKCS5用缺少的字节数来填充,比如缺少5个字节就填充5个数字5,PKCS7缺少的字节数用0来填充。如果数据刚好是16的整数倍,PKCS5和PKCS7会再补充一个16字节数据来区分填充和有效数据,NOPADDING模式不需要填充。
- 初始化向量:初始向量IV的作用是使加密更加安全可靠,在分组密码模式下IV大小对应数据块长度。
- 加密模式:四种加密模式分别是:ECB(电子密码本模式)、CBC(密码分组链接模式)、CFB、OFB。ECB模式是仅仅使用明文和密钥来加密数据,所以该模式下不需要Padding,安全性也较弱,CBC模式数据分块并且使用传入IV依次进行异或操作,安全性也相对较高,所以目前一般都选择CBC模式。
- 加密密钥:不同加密算法密钥长度不同,比如:DES 默认长度56位,3DES默认长度168位,也支持128位,AES默认128位,也支持192位,256位。我们一般根据密码生成密钥,密码长度需要满足算法密钥长度。
Java实现常用的三种加密算法详解相关推荐
- java中synchronized的三种写法详解
预备知识 首先,我们得知道在java中存在三种变量: 实例变量 ==> 存在于堆中 静态变量 ==> 存在于方法区中 局部变量 ==> 存在于栈中 然后,我们得明白,合适会发生高并发 ...
- eclipse java 逆向工程_Mybatis 逆向工程的三种方法详解
Mybatis 逆向工程 逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表.而Mybatis 逆向工程是指由数据库表生成 Java 代码. Mybaits 需要程 ...
- C语言求最大公约数三种方法详解
C语言求最大公约数三种方法详解 题目要求 常用写法(穷举法) 辗转相减法 辗转相除法 main函数 整体代码 题目要求 运行最大公约数的常用算法,并进行程序的调式与测试. 常用写法(穷举法) 从两个数 ...
- python 命令-python解析命令行参数的三种方法详解
这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...
- Maven精选系列--三种仓库详解
转载自 Maven精选系列--三种仓库详解 仓库分类 1.本地仓库 本地仓库就是开发者本地已经下载下来的或者自己打包所有jar包的依赖仓库,本地仓库路径配置在maven对应的conf/settings ...
- 全站仪与计算机之间的数据传输,必看!全站仪数据传输的三种方式详解,都安排得明明白白(上)...
原标题:必看!全站仪数据传输的三种方式详解,都安排得明明白白(上) 科力达全站仪数据传输 一般而言,全站仪的数据传输方式有三种,分别是通过串口.USB.SD卡三种方式,因为电脑配置等因素的不同,一些数 ...
- 查看登陆系统用户的信息的三种方法详解
查看登陆系统用户的信息的三种方法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.who这个命令显示可以谁在登陆,但是这个有很多的花式玩法,这个命令超简单 语法:who [O ...
- 网页中的三种地址详解
网页中的a标签具有地址跳转的功能,href属性指向跳转的地址. 一.三种地址模式 网络地址分为两种,一种是绝对地址,一种是相对地址. 但是相对地址又可以细分为两种,一种是基于当前目录的相对地址,一种是 ...
- Java 解析线程的几种状态详解
Java 解析线程的几种状态详解 1. 线程的5种状态 从操作系统层面上,任何线程一般都具有五种状态,即创建.就绪.运行.阻塞.终止. (1) 新建状态(NEW) 在程序中用构造方法创建一个新线程时, ...
- C++基础:new的三种形式详解
new的三种形式详解: 1.new operator : new操作符 <=====> ( operator new 开辟空间 ) + (调动构造函数 ) 2.oper ...
最新文章
- 南京大学计算机考研机试,2018南大CS考研机试答案
- ip的正则表达式 java,项目实战:Java正则表达式验证IP地址
- BestCoder冠军赛 - 1005 Game 【DP】
- Pytorch 网络模型的保存与读取
- 最近学的用javascript给datagrid排序
- 永洪Desktop交叉表怎么按月份汇总
- 刚刚注册,打声招呼先
- Javascript复习题
- python的print输出_python中的print()输出
- oracle心间directory并附权,【Oracle】第一章创建授权
- 实用的无锁队列(二)
- 判断一个点是否在矩形内部_矩形、圆形泄水管规格型号优势
- 2019下半年软件设计师下午题
- H5神兽,优优,牛来了,牛小天,牛欢喜,至尊星空等搭建教程
- lm324 -4运放-运算放大器
- 软考系统集成项目管理工程师全真模拟题
- 抖音只有几十个播放量的原因是什么?
- 大型网站架构技术演进(史上最全)
- 360天擎卸载(2021年亲测有效)
- 行动诠释价值,城联优品韩董事长出席广东英德抗洪捐赠公益活动会
热门文章
- 原来我也可以写Android小游戏
- 即刻app暂停服务?趁现在教你一步一步实现即刻点赞效果
- 数据挖掘导论课后习题答案-第三章
- MCCSframework 教程(四)表单
- 小学生python游戏编程_适合刚入门Python小白的趣味游戏编程
- 两年时间,年薪从16到45,一个30岁程序猿的碎碎念
- java jre 和jed_需要jre的软件如何安装,如jedit?
- 精伦身份证阅读器php_精伦IDR210台式身份证读卡器
- 计算机控制lc72131,锁相环频率合成器—LC72131.PDF
- J1939广播DM1报文