zoukankan      html  css  js  c++  java
  • java 加密数字签名

     1)消息摘要:

     这是一种与消息认证码结合使用以确保消息完整性的技术。 主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA- 1,jdk1.5对上面都提供了支持,在java中进行消息摘要很简单, java.security.MessageDigest提供了一个简易的操作方法:

    package com.number.test;
    
    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    public class MessageDigestExample {
    
    	/**
    	 * @param args
    	 * 单一的消息摘要算法,不使用密码.可以用来对明文消息(如:密码)隐藏保存
    	 */
    	public static void main(String[] args) {
    		 if (args.length!=1) {
    			System.err.println("Usage:java.MessageDigestExample.text");
    			System.exit(1);
    		}
              try {
    			byte[] plainText=args[0].getBytes("UTF8");
    			
    		 //使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法
    		    MessageDigest messageDigest  =MessageDigest.getInstance("SHA-1");
    		    
    		    System.out.println("
    "+messageDigest.getProvider().getInfo());
    		    
    		 //开始使用算法
    		    messageDigest.update(plainText);
    		    
    		    System.out.println("
    Digest");
    		 //输出运算结果
    		    
    		    System.out.println(new String(messageDigest.digest(),"utf-8"));
    			
    		} catch (UnsupportedEncodingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (NoSuchAlgorithmException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    }
    

     2)私钥加密:


      消息摘要只能检查消息的完整性,但是单向的,对明文消息并不能加密,要加密明文的消息的话,就要使用其他的算法,要确保机密性,我们需要使用私钥密码术来交换私有消息。
      这种最好理解,使用对称算法。比如:A用一个密钥对一个文件加密,而B读取这个文件的话,则需要和A一样的密钥,双方共享一个私钥(而在web环境下,私钥在传递时容易被侦听):

       使用私钥加密的话,首先需要一个密钥,可用javax.crypto.KeyGenerator产生一个密钥(java.security.Key), 然后传递给一个加密工具(javax.crypto.Cipher),该工具再使用相应的算法来进行加密,主要对称算法有:DES(实际密钥只用到56 位),AES(支持三种密钥长度:128、192、256位),通常首先128位,其他的还有DESede等,jdk1.5种也提供了对对称算法的支持, 以下例子使用AES算法来加密:

    package com.number.test;
    
    import java.io.UnsupportedEncodingException;
    import java.security.InvalidKeyException;
    import java.security.Key;
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    
    public class PrivateExample {
    
    	/**
    	 * @param args
    	 * 
    	 */
    	public static void main(String[] args) {
    		
    		if (args.length!=1) {
    			System.err.println("Usage:java.PrivateExample.txt");
    			System.exit(1);
    		}
    		try {
    			byte [] plainText=args[0].getBytes("utf8");
    			
    
    			//通过KeyGenerator形成一个key
    			System.out.println("
    Start generate AES key");
    			KeyGenerator keyGenerator=KeyGenerator.getInstance("AES");
    			keyGenerator.init(128);
    			Key key =keyGenerator.generateKey();
    			System.out.println("Finish generating AES key");
    			
    			//获得一个私钥加密类Cipher,ECB是加密方式,PKCS5Padding是填充方法
    			Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
    			System.out.println("
    "+cipher.getProvider().getInfo());
    			
    			//使用私钥加密
    			System.out.println("
     Start encryption:");
    			cipher.init(Cipher.ENCRYPT_MODE,key);
    			
    			byte[] cipherText =cipher.doFinal(plainText);
    			System.out.println("Finish encryption:");
    			System.out.println(new String(cipherText,"UTF8"));
    
    			System.out.println("
    Start decryption:");
    			cipher.init(Cipher.DECRYPT_MODE,key);
    			byte[] newPlainText=cipher.doFinal(cipherText);
    			System.out.println("Finish decryption:");
    
    			System.out.println(new String(newPlainText,"UTF8"));
    
    			
    		} catch (UnsupportedEncodingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (NoSuchAlgorithmException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (NoSuchPaddingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InvalidKeyException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalBlockSizeException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (BadPaddingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    
    }
    

      3)公钥加密:

      上面提到,私钥加 密需要一个共享的密钥,那么如何传递密钥呢?web环境下,直接传递的话很容易被侦听到,幸好有了公钥加密的出现。公钥加密也叫不对称加密,不对称算法使 用一对密钥对,一个公钥,一个私钥,使用公钥加密的数据,只有私钥能解开(可用于加密);同时,使用私钥加密的数据,只有公钥能解开(签名)。但是速度很 慢(比私钥加密慢100到1000倍),公钥的主要算法有RSA,还包括Blowfish,Diffie-Helman等,jdk1.5种提供了对RSA 的支持,是一个改进的地方:

    package com.number.test;
    
    import java.io.UnsupportedEncodingException;
    import java.security.InvalidKeyException;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.NoSuchAlgorithmException;
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    
    public class PublicExample {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		if (args.length!=1) {
    			System.err.println("Usage:java.PublicExaple.txt");
    			System.exit(1);
    		}
             try {
    			byte[] plainText=args[0].getBytes("UTF8");
    			//构成一个RSA密钥
    			System.out.println("Start generationg RSA key");
    			KeyPairGenerator keyPairGenerator =KeyPairGenerator.getInstance("RSA");
    			keyPairGenerator.initialize(1024);
    			KeyPair key =keyPairGenerator.generateKeyPair();
    			System.out.println("Finish generation RSA key");
    			
    			
    			//获得一个RSA的Cipher类,使用公钥加密
    			Cipher cipher =Cipher.getInstance("RSA/ECB/PKCS1Padding");
    			System.out.println("
    "+cipher.getProvider().getInfo());
    			
    			System.out.println("
     Start encryption");
    			cipher.init(Cipher.ENCRYPT_MODE,key.getPublic());
    			byte[] cipherText=cipher.doFinal(plainText);
    			System.out.println("
     Finish encryption");
    			System.out.println(new String(cipherText,"UTF8"));
    			
    			//使用私钥解密
    			System.out.println("
     decryption");
    			cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());
    			byte[] newPlainText =cipher.doFinal(cipherText);
    			System.out.println("Finish decryption");
    			System.out.println(new String(newPlainText,"UTF8"));
    			
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		} catch (NoSuchAlgorithmException e) {
    			e.printStackTrace();
    		} catch (NoSuchPaddingException e) {
    			e.printStackTrace();
    		} catch (InvalidKeyException e) {
    			e.printStackTrace();
    		} catch (IllegalBlockSizeException e) {
    			e.printStackTrace();
    		} catch (BadPaddingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    }
    
  • 相关阅读:
    ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)”的方法
    解决VMware安装ubuntu16.04后无法全屏的问题
    力推:无限制下载神器aria2
    使用Pangolon在同一副图中,画出两个轨迹,比较误差
    Pangolin中opengl的混合(gl_blend)
    Ubuntu 16.04: How to install OpenCV
    ubuntu16.04下安装Eigen
    ubuntu16.04下安装Sophus
    svn删除账户信息
    javaweb乱码(tomcat服务器)
  • 原文地址:https://www.cnblogs.com/evolcq/p/3635889.html
Copyright © 2011-2022 走看看