`
a25765339
  • 浏览: 62487 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】 Java安全之对称加密、非对称加密、数字签名

 
阅读更多
http://blog.csdn.net/furongkang/article/details/6882039

Java中加密分为两种方式一个是对称加密,另一个是非对称加密。对称加密是因为加密和解密的钥匙相同,而非对称加密是加密和解密的钥匙不同。

对称加密与非对称加密的区别:

对称加密称为密钥加密,速度快,但加密和解密的钥匙必须相同,只有通信双方才能知道密钥。

非对称加密称为公钥加密,算法更加复杂,速度慢,加密和解密钥匙不相同,任何人都可以知道公钥,只有一个人持有私钥可以解密。

对称加密解密:
	/*
	 * 对称加密
	 */
	private static void secretEncrypt() throws Exception {
		//使用Cipher的实例
		Cipher cipher =Cipher.getInstance("AES");
		
		//得到加密的钥匙
		SecretKey key =KeyGenerator.getInstance("AES").generateKey();
		
		//初始化加密操作,传递加密的钥匙
		cipher.init(Cipher.ENCRYPT_MODE,key);
		
		//将加密的钥匙写入secretKey.key文件中
		FileOutputStream fosKey=new FileOutputStream("secretKey.key");
		ObjectOutputStream oosSecretKey =new ObjectOutputStream(fosKey);
		oosSecretKey.writeObject(key);
		oosSecretKey.close();
		fosKey.close();
		 
		 //将加密的内容传递进去,返回加密后的二进制数据
		byte [] results =cipher.doFinal("哈哈哈哈哈".getBytes());
		
		//将加密后的二进制数据写入到secretContent.dat文件中
		FileOutputStream fosData=new FileOutputStream("secretContent.dat");
		fosData.write(results);
		fosData.close();
	}
	
	/*
	 * 对称解密
	 */
	private static void secretDecrypt() throws Exception{
		Cipher cipher =Cipher.getInstance("AES");
		
		//获取文件中的key进行解密
		FileInputStream fisKey=new FileInputStream("secretKey.key");
		ObjectInputStream oisKey =new ObjectInputStream(fisKey);
		Key key =(Key)oisKey.readObject();
		oisKey.close();
		fisKey.close();
		
		//初始化解密操作,传递加密的钥匙
		cipher.init(Cipher.DECRYPT_MODE,key);
		
		//获取文件中的二进制数据
		FileInputStream fisDat=new FileInputStream("secretContent.dat");
		//获取数据第一种方式
		byte [] src=new byte [fisDat.available()];
		int len =fisDat.read(src);
		int total =0;
		while(total<src.length){
			total +=len;
			len=fisDat.read(src,total,src.length-total);
		}
		//执行解密
		byte [] result=cipher.doFinal(src);
		fisDat.close();
		System.out.println(new String(result));
		
//		读文件中的数据第二种方式
//		ByteArrayOutputStream baos =new ByteArrayOutputStream();
//		copyStream(fisDat, baos);
//		byte [] result=cipher.doFinal(baos.toByteArray());
//		fisDat.close();
//		baos.close();
	}
	
//	private static void copyStream(InputStream ips,OutputStream ops) throws Exception{
//		byte [] buf =new byte[1024];
//		int len=ips.read(buf);
//		while(len!=-1){
//			ops.write(buf,0,len);
//			len  =ips.read(buf);
//		}
//	}

基于口令的对称加密与解密

系统自动生成的Key不容易记忆,我们可以使用我们容易记忆的口令同过java自带的一个工具将它转换成Key,在解密的时候我们就可以通过口令进行解密。

	/*
	 * 基于口令的对称加密
	 */
	private static void secretEncrypt() throws Exception {
		//实例化工具
		Cipher cipher2=Cipher.getInstance("PBEWithMD5AndDES");
		
		//使用该工具将基于密码的形式生成Key
		SecretKey key2=SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(new PBEKeySpec("123".toCharArray()));
		PBEParameterSpec parameterspec=new PBEParameterSpec(new byte[]{1,2,3,4,5,6,7,8},1000);
		
		//初始化加密操作,同时传递加密的算法
		cipher2.init(Cipher.ENCRYPT_MODE,key2,parameterspec);
		
		 //将要加密的数据传递进去,返回加密后的数据
		byte [] results =cipher2.doFinal("哈哈哈哈哈".getBytes());
		
		//将加密后的数据写入到文件中
		FileOutputStream fosData=new FileOutputStream("zxx.dat");
		fosData.write(results);
		fosData.close();
	}
	
	/*
	 * 基于口令的对称解密
	 */
	private static void secretDecrypt() throws Exception{
		Cipher cipher2=Cipher.getInstance("PBEWithMD5AndDES");
		SecretKey key2=SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(new PBEKeySpec("123".toCharArray()));
		PBEParameterSpec parameterspec=new PBEParameterSpec(new byte[]{1,2,3,4,5,6,7,8},1000);
		cipher2.init(Cipher.DECRYPT_MODE,key2,parameterspec);
		FileInputStream fisDat=new FileInputStream("zxx.dat");
		byte [] src=new byte [fisDat.available()];
		int len =fisDat.read(src);
		int total =0;
		while(total<src.length){
			total +=len;
			len=fisDat.read(src,total,src.length-total);
		}
		byte [] result=cipher2.doFinal(src);
		fisDat.close();
		System.out.println(new String(result));
	}


非对称加密解密:

非对称加密是公钥加密,私钥来解密,这个个人做用的少一点,主要针对于大型的网站大型的企业

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;

import javax.crypto.Cipher;

public class TestEncode {
	public static void main(String[] args) throws Exception {
		publicEnrypt();
		privateDecrypt();
	}
    /* 
     * 公钥加密 
     */  
    private static void publicEnrypt()throws Exception {  
        Cipher cipher =Cipher.getInstance("RSA");  
        //实例化Key  
        KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");  
        //获取一对钥匙  
        KeyPair keyPair=keyPairGenerator.generateKeyPair();  
        //获得公钥  
        Key publicKey=keyPair.getPublic();  
        //获得私钥   
        Key privateKey=keyPair.getPrivate();  
        //用公钥加密  
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);  
        byte [] result=cipher.doFinal("加密测试内容".getBytes("UTF-8"));  
        //将Key写入到文件  
        saveKey(privateKey,"c:/zxx_private.key");  
        //加密后的数据写入到文件  
        saveData(result,"c:/public_encryt.dat");  
    }  
      
    /* 
     * 私钥解密 
     */  
    private static void privateDecrypt() throws Exception {  
        Cipher cipher=Cipher.getInstance("RSA");  
        //得到Key  
        Key privateKey=readKey("c:/zxx_private.key");  
        //用私钥去解密  
        cipher.init(Cipher.DECRYPT_MODE, privateKey);  
        //读数据源  
        byte [] src =readData("c:/public_encryt.dat");  
        //得到解密后的结果  
        byte[] result=cipher.doFinal(src);  
        //二进制数据要变成字符串需解码  
        System.out.println(new String(result,"UTF-8"));  
    }  
      
    private static void saveData(byte[] result, String fileName) throws Exception {  
        // TODO Auto-generated method stub  
        FileOutputStream fosData=new FileOutputStream(fileName);  
        fosData.write(result);  
        fosData.close();  
    }  
    public static void saveKey(Key key,String fileName)throws Exception{  
        FileOutputStream fosKey=new FileOutputStream(fileName);  
        ObjectOutputStream oosSecretKey =new ObjectOutputStream(fosKey);  
        oosSecretKey.writeObject(key);  
        oosSecretKey.close();  
        fosKey.close();  
    }  
    private static Key readKey(String fileName) throws Exception {  
        FileInputStream fisKey=new FileInputStream(fileName);  
        ObjectInputStream oisKey =new ObjectInputStream(fisKey);  
        Key key=(Key)oisKey.readObject();  
        oisKey.close();  
        fisKey.close();  
        return key;  
    }  
    private static byte[] readData(String filename) throws Exception {  
        FileInputStream fisDat=new FileInputStream(filename);  
        byte [] src=new byte [fisDat.available()];  
        int len =fisDat.read(src);  
        int total =0;  
        while(total<src.length){  
            total +=len;  
            len=fisDat.read(src,total,src.length-total);  
        }  
        fisDat.close();  
        return src;  
    }  
}



数字签名:

数字签名的基础是公钥和私钥的非对称加密,发送者使用私钥加密的消息摘要(签名),接收者使用公钥解密消息摘要以验证签名是否是某个人。

要证明这段数据是你发过来的,并且没有被别人改过,这就需要用到数字签名,首先我们对整个文档进行md5加密得到16个字节,然后把消息摘要和文档发过去,解密者首先对发过来的文档进行解密,解密后得到一个摘要(md5),对接收的文档进行md5加密,得到的md5结果匹配解密后的摘要,如果匹配成功的话证明没有修改过,我们使用Signature进行签名

	/* 
	 * 使用私钥签名 
	 */  
	private static void sign()throws Exception {  
	    //实例化Key   
	    KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");  
	    //获取一对钥匙   
	    KeyPair keyPair=keyPairGenerator.generateKeyPair();  
	    //获得公钥   
	    PublicKey publicKey=keyPair.getPublic();  
	    //获得私钥    
	    PrivateKey privateKey=keyPair.getPrivate();  
	    
	    //数字签名
	    Signature signature =Signature.getInstance("SHA1withRSA");
	    signature.initSign(privateKey);//用私钥签名
	    signature.update("这里签名".getBytes());//对怎样的数据进行签名
	    byte [] sign=signature.sign();  //获取签名的结果
	    
	    //保存公钥并写入文件中 
	    saveKey(publicKey,"zxx_private.key");  
	    //将签名后的数据写入到文件   
	    saveData(sign,"public_encryt.dat");  
	}
	  
	/* 
	 * 公钥解密 
	 */  
	private static void verify() throws Exception {  
		Signature signture =Signature.getInstance("SHA1withRSA");
		//获取到公钥
		PublicKey publicKey=(PublicKey)readKey("zxx_private.key");
		//初始化校验
		signture.initVerify(publicKey);
		//初始化签名对象
		signture.update("这里签名".getBytes());
		//读数据源   
	    byte [] sign =readData("public_encryt.dat");  
	    //返回匹配结果
		boolean isYouSigned=signture.verify(sign);
		//如果返回数据为true则数据没有发生修改,否则发生修改
		System.out.println(isYouSigned);
	} 




分享到:
评论

相关推荐

    java加密算法:Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法

    java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...

    非对称加密算法 数字签名算法

    非对称加密算法和数字签名是信息技术中两个关键的安全概念,尤其在网络安全和数据保护方面起着至关重要的作用。在Java编程环境中,这些技术被广泛应用于实现安全通信、身份验证和数据完整性保护。 非对称加密算法,...

    java实现非对称加密

    Java 实现非对称加密 非对称加密是一种加密技术,它使用一对不同的密钥:公钥(public key)和私钥(private key)。公钥用于加密,私钥用于解密。在 Java 中,可以使用 RSA 算法实现非对称加密。 RSA 算法是最...

    非对称加密JAVA实现

    非对称加密JAVA实现,实现对超长内容进行加密

    java编写的加密解密工具,有对称加密和非对称加密

    总的来说,这个Java编写的加密解密工具包提供了对称和非对称加密的核心功能,为开发者在信息安全领域提供了坚实的基础。通过学习和使用这个工具包,开发者能够更好地理解和掌握加密解密原理,提升系统安全性能。

    对称加密 非对称加密 需要的jar包

    总之,对称加密和非对称加密是保障数据安全的重要工具,它们在网络安全、数据存储等领域有着广泛的应用。通过使用Bouncy Castle和Apache Commons Codec等第三方库,我们可以更方便地在Java环境中实现这些加密技术。

    非对称加密和对称加密混合应用

    5.用对称密钥对(原文和签名)进行加密 6.用对方的公钥对称密钥进行加密(加密密钥) 7.将密文(5)和加密密钥(6)一起发给对方 接收方: 1.用自己的私钥对加密密钥进行解密,得到对称密钥--也只有自己才能...

    Java源码非对称加密.rar

    非对称加密的典型算法包括RSA、DSA(数字签名算法)和ECC(椭圆曲线加密)。RSA是目前应用最广泛的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。RSA的安全性基于大整数因子分解的困难性...

    java实现非对称加密代码

    java实现非对称加密代码。

    常见加密算法方式(对称加密和非对称加密)

    而对于密钥管理较为复杂或需要实现数字签名的应用场景,则更倾向于使用非对称加密算法。在实际操作中,经常采用混合加密模式:利用非对称加密算法交换对称加密算法的密钥,再利用对称加密算法加密实际数据,从而结合...

    JAVA 对称加密 实现

    JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现

    RSA非对称加密算法

    这种特点使得 RSA 非对称加密算法非常适合在需要确保数据安全的场景中使用,如 HTTPS 认证、数字签名等。 在 RSA 非对称加密算法中,公开密钥用于加密数据,而私密密钥用于解密数据。加密过程是通过公开密钥对数据...

    Java对称和非对称加密的Java文件

    支持Java文件遇见的敏感字段的加密 包括对称和非对称加密

    Java非对称加密源码实例

    总之,Java非对称加密是保证信息安全的重要工具,广泛应用于网络安全、数字签名、SSL/TLS协议等领域。掌握其原理和实现方法对于任何Java开发者来说都至关重要,特别是在处理敏感数据时。通过研究提供的源码实例,...

    对称加密非对称加密

    非对称加密在数字签名、安全电子邮件、HTTPS等场景中广泛应用。然而,非对称加密相比对称加密来说,其计算复杂度更高,因此速度较慢,通常用于小量数据的加密或用于在对称密钥的交换中。 在实际应用中,常常结合...

    Java非对称加密算法

    这是本人总结的Java 非对称 加密 算法,有疑问可以找我1038546502@qq.com

    不对称加密及数字签名的实例应用

    数字签名则是一种非对称加密的应用,用于验证数据的完整性和发送者的身份。它通过将消息摘要(使用哈希函数生成)与私钥一起加密来实现。接收者使用发送者的公钥解密签名,然后用同样的哈希函数计算原始消息的摘要,...

    非对称加密rsa des Base64 数字签名的基础

    非对称加密、RSA、DES和...在这个案例中,"非对称加密rsa des Base64 数字签名的基础"可能是一个学习资源,涵盖了这些技术的基本原理和实践应用。通过深入学习,我们可以更好地保护数据安全,确保网络通信的可靠性。

Global site tag (gtag.js) - Google Analytics