zoukankan      html  css  js  c++  java
  • 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算法进行的签名。速度快,强度高,签名短。 

    初始化密钥对; 

    执行签名; 

    验证签名

  • 相关阅读:
    CentOS6.7 mysql5.6.33修改数据文件位置
    win8 win10 安装msi 提示2502、2503的错误代码
    2016年国内开源镜像站点汇总
    eclipse创建本地maven
    maven添加sqlserver的jdbc驱动包
    CentOS6.5下RPM方式安装mysql5.6.33
    linux中~和/的区别
    Linux命令学习(22):ss命令
    Linux命令学习(21):netstat命令
    Linux命令学习(20):traceroute命令
  • 原文地址:https://www.cnblogs.com/timssd/p/8387124.html
Copyright © 2011-2022 走看看