JAVA上加密算法的实现用例(1)

2016-02-19 12:33 4 1 收藏

今天图老师小编要向大家分享个JAVA上加密算法的实现用例(1)教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

        第1章 基础知识
  
  1.1. 单钥密码体制
  单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密。
  
  通常,使用的加密算法 比较简便高效,密钥简短,加解密速度快,破译极其困难。但是加密的安全性依靠密钥保管的安全性,在公开的计算机网络上安全地传送和保管密钥是一个严重的问题,并且假如在多用户的情况下密钥的保管安全性也是一个问题。
  
  单钥密码体制的代表是美国的DES
  
  1.2. 消息摘要
  一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。
  
  消息摘要有两个基本属性:
  
  两个不同的报文难以生成相同的摘要
  难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要
  代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5
  
  1.3. Diffie-Hellman密钥一致协议
  密钥一致协议是由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想。
  
  先决条件,答应两名用户在公开媒体上交换信息以生成"一致"的,可以共享的密钥
  
  代表:指数密钥一致协议(EXPonential Key Agreement Protocol)
  
  1.4. 非对称算法与公钥体系
  1976年,Dittie和Hellman为解决密钥治理问题,在他们的奠基性的工作"密码学的新方向"一文中,提出一种密钥交换协议,答应在不安全的媒体上通过通讯双方交换信息,安全地传送秘密密钥。在此新思想的基础上,很快出现了非对称密钥密码体制,即公钥密码体制。在公钥体制中,加密密钥不同于解密密钥,加密密钥公之于众,谁都可以使用;解密密钥只有解密人自己知道。它们分别称为公开密钥(Public key)和秘密密钥(Private key)。
  
  迄今为止的所有公钥密码体系中,RSA系统是最闻名、最多使用的一种。RSA公开密钥密码系统是由R.Rivest、A.Shamir和L.Adleman俊教授于1977年提出的。RSA的取名就是来自于这三位发明者的姓的第一个字母
  
  1.5. 数字签名
  所谓数字签名就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在经签名后末被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。 
  
  在数字签名中有重要作用的数字指纹是通过一类非凡的散列函数(HASH函数)生成的,对这些HASH函数的非凡要求是:
  
  接受的输入报文数据没有长度限制;
  对任何输入报文数据生成固定长度的摘要(数字指纹)输出
  从报文能方便地算出摘要;
  难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要;
  两个不同的报文难以生成相同的摘要
  
  代表:DSA
  
  第2章 在Java中的实现
  
  2.1. 相关
  Diffie-Hellman密钥一致协议和DES程序需要JCE工具库的支持,可以到 http://java.sun.com/security/index.Html 下载JCE,并进行安装。简易安装把 jce1.2.1lib 下的所有内容复制到 %java_home%libext下,假如没有ext目录自行建立,再把jce1_2_1.jar和sunjce_provider.jar添加到CLASSPATH内,更具体说明请看相应用户手册
  
  2.2. 消息摘要MD5和SHA的使用
  使用方法:
  
  首先用生成一个MessageDigest类,确定计算方法
  
  java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
  
  添加要进行计算摘要的信息
  
  alga.update(myinfo.getBytes());
  
  计算出摘要
  
  byte[] digesta=alga.digest();
  
  发送给其他人你的信息和摘要
  
  其他人用相同的方法初始化,添加信息,最后进行比较摘要是否相同
  
  algb.isEqual(digesta,algb.digest())
  
  相关AIP
  
  java.security.MessageDigest 类
  
  static getInstance(String algorithm)
  
  返回一个MessageDigest对象,它实现指定的算法
  
  参数:算法名,如 SHA-1 或MD5
  
  void update (byte input)
  
  void update (byte[] input)
  
  void update(byte[] input, int offset, int len)
  
  添加要进行计算摘要的信息
  
  byte[] digest()
  
  完成计算,返回计算得到的摘要(对于MD5是16位,SHA是20位)
  
  void reset()
  
  复位
  
  static boolean isEqual(byte[] digesta, byte[] digestb)
  
  比效两个摘要是否相同
  
  代码:
  import java.security.*;
  public class myDigest {
   public static void main(String[] args)  {
  
     myDigest my=new myDigest();
     my.testDigest();
  
   }
   public void testDigest()
   {
    try {
      String myinfo="我的测试信息";
  
     //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5");
       java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
       alga.update(myinfo.getBytes());
       byte[] digesta=alga.digest();
       System.out.println("本信息摘要是:"+byte2hex(digesta));
       //通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判定是否更改或传输正常
       java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");
       algb.update(myinfo.getBytes());
       if (algb.isEqual(digesta,algb.digest())) {
          System.out.println("信息检查正常");
        }
        else
         {
           System.out.println("摘要不相同");
          }
  
    }
    catch (java.security.NoSUChAlgorithmException ex) {
      System.out.println("非法摘要算法");
    }
  
   }
   public String byte2hex(byte[] b) //二行制转字符串
     {
      String hs="";
      String stmp="";
      for (int n=0;nb.length;n++)
       {
        stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
        if (stmp.length()==1) hs=hs+"0"+stmp;
        else hs=hs+stmp;
        if (nb.length-1)  hs=hs+":";
       }
      return hs.toUpperCase();
     }
  
  }
  
  
  
  2.3. 数字签名DSA
  
  对于一个用户来讲首先要生成他的密钥对,并且分别保存
  生成一个KeyPairGenerator实例
  java.security.KeyPairGenerator  keygen=java.security.KeyPairGenerator.getInstance("DSA");
  假如设定随机产生器就用如相代码初始化
  SecureRandom secrand=new SecureRandom();

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1601162.html

延伸阅读
标签: ASP
  简介 首先简单介绍一下有关加密的背景。由于美国禁止几种密码算法的对外出口的 加密位数(例如SSL的40位加密限制),本文将介绍一种ASP可以使用的简单字符加密算法, 而不是那些受限制的加密算法。其实,这里介绍的加密算法对于一般的运用来说已经足够 解密人麻烦一阵子的了。它的加密基础是最简单的Vernum密码方法,我...
标签: ASP
  在第一部分,讨论了如何生成密钥,下面将介绍如何使用这个密钥来加密和解密一个 字符串。 下面的代码就是能够同时实现这个功能的函数 Crypt.asp文件 <% Dim g_Key Const g_CryptThis = "Now is the time for all good men to come to the aid of their country." Const g_KeyLocati...
1. MD5加密,常用于加密用户名密码,当用户验证时。 protected byte[] encrypt(byte[] obj) ...{     try ...{         MessageDigest md5 = MessageDigest.getInstance("MD5");             md5.update(obj); ...
标签: ASP
  <% Private Const BITS_TO_A_BYTE = 8 Private Const BYTES_TO_A_WORD = 4 Private Const BITS_TO_A_WORD = 32 Private m_lOnBits(30) Private m_l2Power(30) Private Function LShift(lValue, iShiftBits)     If iShiftBits = 0 Then         LShift = lValue &nbs...
代码如下: import java.util.ArrayList;  import java.util.Collections;  import java.util.List;  /**   * Created with IntelliJ IDEA.   * User: dell   * Date: 13-3-5   * Time: 下午8:38   * To change this template use File | Settings | File Templates.   */  public class G...

经验教程

691

收藏

47
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部