Java 加解密与数字签名
本文转载自:QQ 兴趣部落:java 学习(部落) 原文地址:点击访问
实现方式:JDK 实现,CC,BC JDK 提供比较基础的底层的实现;CC 提供一些简化的操作;BC 提供补充
一、Base64 加密
非常简单,加密解密就一个函数。
代码如下:
二、消息摘要算法加密 ———— 主要用于验证数据完整性。
MD(消息摘要):
SHA(安全散列) JDK 实现和 MD 一样。 BC 实现如下:(Digest 类)
CC 实现最简单(就是一个 DigestUtils 的静态方法):
MAC(消息认证码)
含有密钥的散列函数算法,兼容 MD 和 SHA 的特性,但加入了密钥。
主要 JDK 和 Bouncy Castle 实现。 JDK 实现:获取或定义密钥(byte [] 数组),Mac 类 实例化、初始化、执行。 BC 实现:Hmac 类 实例化、初始化、执行。
三、对称加解密
对称加密指加密和解密使用相同密钥的加密算法。这里将介绍 DES、3 重 DES、AES 和 PBE 几种常见的对称加密算法在 Java 中的实现。 DES、3DES、AES(密钥)、PBE(口令和盐) DES: JDK 实现:生成并转换 Key;Cipher 类的实例化(getInstance)、初始化(init 选择模式与 Key);执行(doFinal)加解密。 推荐 BC 实现方式:Security.addProvider (new BouncyCastleProvider ()); 然后剩下的代码就可以和 JDK 实现代码基本一样了。 3DES、AES 实现基本一样,所以就不一一介绍。。。 PBE(基于口令的加密) 特点:通过 salt + 口令 实现:初始化盐;生成口令;Cipher 类加解密。
四、非对称加解密
非对称加密算法是一种基于密钥的保密方法,需要公开密钥和私有密钥,在文件加密、尤其是网银中应用广泛。这里主要介绍非对称加密算法的实现过程,DH、RSA 和 ELGamal 等几种常见的非对称加密算法的在 Java 中的应用。
概念:公钥、私钥; DH (密钥交换算法): 代码实现有些麻烦
—— 初始化发送方密钥
-KeyPairGenerator :能产生 KeyPair
-KeyPair :常用的密钥载体,称为密钥对,分为公钥 PublicKey 与私钥 PrivateKey。 -PublicKey
—— 初始化接收方密钥
- KeyFactory :密钥工厂,生成密钥,通过某种密钥的规范来还原密钥 -X509EncodedKeySpec :根据 ASN.1 进行密钥编码
- DHPublicKey :
- DHParameterSpec :遵从 DH 算法发参数的集合 -KeyPairGenerator :
- PrivateKey :
—— 双发根据公布的对方的 PublicKey 构建本地密钥,
—— 构建出来的本地密钥是一致的 -KeyAgreement :用来提供密钥一致性协议 -SecretKey :秘密密钥,对称 -KeyFactory -X509EncodedKeySpec -PublicKey
—— 加密、解密(利用本地密钥) -Cipher :为加密和解密提供密码功能的类
解释: 首先,发送方产生密钥对,并公开 公钥;接收方根据这个公钥产生密钥对,然后也公开自己的 公钥。 然后,发送方根据接收方的 公钥 产生自己本地的密钥(本地密钥一般是采用对称密钥),接收方也根据发送方的 公钥 产生自己本地的密钥。其实,这样双方产生的本地密钥是相同的。 最后,双方就可以利用本地密钥进行加解密了。 RSA(基于因子分解):代码实现较为简单 初始化密钥(包含公钥、密钥)。 可以利用公钥加密,私钥解密;也可以私钥加密,公钥解密 使用过程:双方分别掌握公钥与私钥中的一种,然后就可以加密并传输数据了。
EIGamal(基于离散因数) JDK 没有实现,只能利用 BC 实现。 首先,Security.addProvider (new BouncyCastleProvider ()); 之后实现类似于 RSA。
五.Java 实现数字签名
数字签名用于鉴别数字信息,公钥和私钥,私钥对数据签名,公钥用于检验。 过程为:首先初始化一个密钥对,在密钥对的基础上进行签名与验证。
1、RSA:既可以加解密,也可以数字签名。 初始化密钥对:KeyPairGenerator、KeyPair、RSAPublic、PSAPrivate; 执行签名;Signature 类 验证签名;Signature 类
2、DSA(数字签名算法) 初始化密钥对,公钥、私钥; 执行签名,用私钥签名; 验证签名,用公钥验证;
3、ECDSA 微软序列号便是采用的 ECDSA 算法进行的签名。速度快,强度高,签名短。 初始化密钥对; 执行签名; 验证签名