Java加解密与数字签名

Posted timdes1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java加解密与数字签名相关的知识,希望对你有一定的参考价值。

                     Java加解密与数字签名

2016-08-30 蕊蕊 java编程

  

  ** 

    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算法进行的签名。速度快,强度高,签名短。 

初始化密钥对; 

执行签名; 

验证签名



以上是关于Java加解密与数字签名的主要内容,如果未能解决你的问题,请参考以下文章

java 加解密

区块链之加解密算法&数字证书

加解密---Java安全

公钥加解密、数字签名、CA证书简介

用Java实现RSA加解密及签名和验签——.pem文件格式秘钥

加解密 Java 凯撒密码