`

PKI体系简易JAVA实现(二):AES对称加密

阅读更多

PKI体系中关键的一环是消息体本身的加密传输。消息的加密可以采用非对称加密和对称加密。

 

1.概念:

对称密钥加密:又叫专用密钥加密,即发送和接收数据的双方必使用相同的密钥对明文进行加密和解密运算。简单的说,就是同一个密钥即可以加密也可以用来解密。常见的算法如DES,AES

 

非对称密钥加密:采用双钥密码系统的加密方法,在一个过程中使用两个密钥,一个用于加密,另一个用于解密,这种加密方法称为非对称加密,也称为公钥加密,因为其中一个密钥是公开的(另一个则需要保密)。常见算法如RSA

 

对称加密        速度快,安全性较低

非对称加密     速度较慢,安全性较高

 

2.为什么用对称加密消息正文

那假设我们要对QQ消息进行加密,采用非对称加密太耗费性能,速度又比较慢,而直接只用对称加密又显得没达到严格加密的要求。因此现行通常的做法是:

 

QQ聊天内容采用对称密钥,这样速度快,而在正式开始之前先用非对称密钥加密 对称密钥

 

这样相当于先建立了一个比较安全的可信通道,然后在这个通道里用比较快的加密方法通讯。

 

3.JAVA实现:

因此我们这里先关注消息正文的对称加密的实现。我们这里采用AES进行对称加密。

 

我们设计一个实现类叫做AESImpl, 理所当然,这个类最基本的就是提供加密和解密的功能。但是现实的情况可能会复杂一些。我们可能是传输一段文字(String),也有可能是发送一个文件(File), 而对于加密,我们可能需要自己设定密码,也可能是要程序自动生成一个密钥文件用于加解密。 

 

不过无论是什么需要,AES加解密JAVA实现的根本是一致的。都是通过javax.crypto.Cipher对象。甚至是加密解密这两种逆过程,都仅仅是cipher.init方法传入参数选Cipher.ENCRYPT_MODE还是Cipher.DECRYPT_MODE罢了。因此我们可以抽出一个"根AES加解密方法",用于持有加解密的公共逻辑,并且用于应对不同的加解密场景。

 

其他话就不多说了,具体看代码最清楚了:

 

import java.io.*;
import java.security.*;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;


/**
 * AES加解密工具实现(支持对字符串或文件加解密,支持生成密钥或使用密码)
 * @author nneverwei
 * @e-mail: nneverwei@gmail.com
 *
 */
public class AESImpl {
	
	/**
	 * 生成AES密钥
	 * @return AES密钥
	 */
	public static SecretKey createKey() {
		try {
			KeyGenerator keygen = KeyGenerator.getInstance("AES");
			SecureRandom random = new SecureRandom("nneverwei".getBytes());
			keygen.init(random);
			SecretKey key = keygen.generateKey();
			return key;
		} catch (NoSuchAlgorithmException e) {
			System.out.println("AES生成密钥错误");
			e.printStackTrace();
			return null;
		}
	}
	
    /**
     * 加密Str(使用密码)
     * @param content 需要加密的内容
     * @param password  加密密码
     * @return
     */
    public static byte[] encrypt(String content, String password) {
    	return (byte[]) rootCrypt(Cipher.ENCRYPT_MODE, content.getBytes(), password);
    }
    
    /**
     * 加密Str(使用密钥)
     * @param content 需要加密的内容
     * @param key  加密密钥
     * @return
     */
    public static byte[] encrypt(String content, Key key) {
    	return (byte[]) rootCrypt(Cipher.ENCRYPT_MODE, content.getBytes(), key);
    }
    
    /**
     * 解密Str(使用密码)
     * @param content  待解密内容
     * @param password 解密密码
     * @return
     */
    public static byte[] decrypt(byte[] content, String password) {
    	return (byte[]) rootCrypt(Cipher.DECRYPT_MODE, content, password);
    }
    
    /**
     * 解密Str(使用密钥)
     * @param content  待解密内容
     * @param key 解密密钥
     * @return
     */
    public static byte[] decrypt(byte[] content, Key key) {
    	return (byte[]) rootCrypt(Cipher.DECRYPT_MODE, content, key);
    }
    
    /**
     * 加密File(使用密码)
     * @param content 需要加密的内容
     * @param password  加密密码
     * @return
     */
    public static File encrypt(File content, String password) {
    	return (File) rootCrypt(Cipher.ENCRYPT_MODE, content, password);
    }
    
    /**
     * 加密File(使用密钥)
     * @param content 需要加密的内容
     * @param key  加密密钥
     * @return
     */
    public static File encrypt(File content, Key key) {
    	return (File) rootCrypt(Cipher.ENCRYPT_MODE, content, key);
    }
    
    /**
     * 解密File(使用密码)
     * @param content  待解密内容
     * @param password 解密密码
     * @return
     */
    public static File decrypt(File content, String password) {
    	return (File) rootCrypt(Cipher.DECRYPT_MODE, content, password);
    }
    
    /**
     * 解密Str(使用密钥)
     * @param content  待解密内容
     * @param key 解密密钥
     * @return
     */
    public static File decrypt(File content, Key key) {
    	return (File) rootCrypt(Cipher.DECRYPT_MODE, content, key);
    }
    
    /**
     * 加解密根方法
     * @param mode Cipher.ENCRYPT_MODE或Cipher.DECRYPT_MODE
     * @param msg 欲加密\解密消息体(支持String或File)
     * @param key 密码或密钥(支持String或Key)
     * @return byte[]或File
     */
    private static Object rootCrypt(int mode, Object msg, Object key){
    	try{
	    	Key passKey = null;
	    	if(key instanceof String){
	    		KeyGenerator kgen = KeyGenerator.getInstance("AES");
				kgen.init(128, new SecureRandom(((String) key).getBytes()));
				SecretKey secretKey = kgen.generateKey();
				byte[] enCodeFormat = secretKey.getEncoded();
				passKey = new SecretKeySpec(enCodeFormat, "AES");
	    	}else{
	    		passKey = (Key) key;
	    	}
	    	Cipher cipher = Cipher.getInstance("AES");// 创建密码器
            cipher.init(mode, passKey);// 初始化
            if(msg instanceof byte[]){
            	return cipher.doFinal((byte[]) msg);
            }else{
            	File file = (File)msg;
            	String fileName = file.getName();
            	String prefix=fileName.substring(fileName.lastIndexOf(".")+1);
            	File encryptFile = new File((mode == Cipher.ENCRYPT_MODE?"encrypt.":"decrypt.") + prefix);
    			InputStream in = new FileInputStream(file);
    			OutputStream out = new FileOutputStream(encryptFile);
                int blockSize = cipher.getBlockSize();
        		int outputSize = cipher.getOutputSize(blockSize);
        		byte[] inBytes = new byte[blockSize];
        		byte[] outBytes = new byte[outputSize];
        		int inLength = 0;
        		boolean more = true;
        		while (more) {
        			inLength = in.read(inBytes);
        			if (inLength == blockSize) {
        				int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
        				out.write(outBytes, 0, outLength);
        			} else
        				more = false;
        		}
        		if (inLength > 0) {
        			outBytes = cipher.doFinal(inBytes, 0, inLength);
        		} else {
        			outBytes = cipher.doFinal();
        		}
        		out.write(outBytes);
        		in.close();
        		out.close();
                return encryptFile;
            }
    	}catch(Exception e){
    		e.printStackTrace();
    		return null;
    	}
    }
    
	public static void main(String[] args) {
		byte[] afterEncrypt = AESImpl.encrypt("你好啊哈哈哈哈哈", "weichao");
		System.out.println("加密后:" + new String(afterEncrypt));
		byte[] afterDecrypt = AESImpl.decrypt(afterEncrypt, "weichao");
		System.out.println("解密后:" + new String(afterDecrypt));
		
		SecretKey key = AESImpl.createKey();
		byte[] afterEncrypt2 = AESImpl.encrypt("sfasfasf水电费哈利开始发", key);
		System.out.println("加密后:" + new String(afterEncrypt2));
		byte[] afterDecrypt2 = AESImpl.decrypt(afterEncrypt2, key);
		System.out.println("解密后:" + new String(afterDecrypt2));
		
		File file = new File("hello.txt");
		File outFile = AESImpl.encrypt(file, key);
		File outFile2 = AESImpl.decrypt(outFile, key);
	}

}

 

 

0
2
分享到:
评论

相关推荐

    AES-CBC对称加密

    AES-CBC(Advanced Encryption Standard - Cipher Block Chaining)是对称加密算法AES(高级加密标准)的一种工作模式。AES是国际标准化组织(ISO)和国际电工委员会(IEC)联合制定的,用于保护电子数据的强加密...

    java加密小程序

    Java提供了强大的加密库,如Java Cryptography Extension (JCE) 和Java Cryptography Architecture (JCA),它们为开发者提供了各种加密算法,如对称加密、非对称加密、哈希函数和消息认证码(MAC)。 2. **对称...

    C#开发的对称加密算法

    因此,在某些情况下,非对称加密(如RSA)或公钥基础设施(PKI)可能会与对称加密一起使用,以解决密钥分发问题。 在提供的压缩包文件中,很可能包含了C#实现对称加密算法的源代码示例,这可以帮助开发者了解如何在...

    前端加密登录,后端解密,aes加密

    在网络安全领域,用户数据的安全传输和...对称加密,特别是AES,因其高效性和安全性,成为实现这一目标的常用工具。然而,实际应用中还需要考虑密钥管理和不同设备的兼容性等挑战,以确保整体系统的安全性和可靠性。

    AES.rar_AES加密算法_快速aes加密_快速加密

    **AES加密算法** AES,全称为“Advanced ...然而,尽管AES在对称加密中表现优秀,但其仍需配合密钥管理策略,如Kerberos、PKI(公钥基础设施)等,以确保密钥的安全存储和交换,从而确保整个加密系统的安全性。

    加密算法PKI

    以上知识点从密码学基础出发,详细解释了PKI体系和应用,其中涵盖了对称加密、非对称加密、数字信封、数字签名以及密钥管理等关键概念,这些都是现代信息安全领域的基石。通过这些知识的学习,可以帮助我们构建更为...

    java加密算法源码

    1. 对称加密算法:对称加密是最常见的加密方式,例如DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)等。这些算法使用相同的密钥进行加密和解密,效率高,但密钥管理是...

    aeslinux_AES加密_

    AES(Advanced Encryption Standard)是目前广泛使用的对称加密算法,为美国国家标准与技术研究所(NIST)在2001年确立的加密标准,替代了之前的DES加密算法。AES具有高效性和安全性,适用于大量数据的加密,尤其在...

    java和.net交换加密算法(.net版本)+(java版本)

    常见的加密算法有对称加密(如AES、DES)和非对称加密(如RSA、ECC)。对称加密使用相同的密钥进行加密和解密,而非对称加密则需要一对公钥和私钥,公钥用于加密,私钥用于解密。 2. **Java加密**: 在Java中,...

    AES.rar_AES 文件 加密

    **AES(高级加密标准)** 是一种广泛应用的对称加密算法,全称为Advanced Encryption Standard。在信息安全领域,AES因其高效性和安全性,常用于保护数据的隐私,例如在客户端程序和服务端程序之间的通信过程中,...

    Python加密与解密

    2. RSA:RSA是非对称加密算法,用于公钥基础设施(PKI)。它包含一对密钥——公钥和私钥,公钥用于加密,私钥用于解密。 3. SHA哈希:SHA(安全哈希算法)系列,如SHA-1、SHA-256,用于生成消息的固定长度摘要,常...

    Java加密扩展基础

    JCE支持多种加密算法,包括对称加密(如AES、DES)、非对称加密(RSA、DSA)、哈希函数(MD5、SHA-1、SHA-256等)以及消息认证码(HMAC)。这些算法可以灵活地组合使用,以满足不同场景下的安全需求。 在实际应用中...

    AES微信加密

    此外,为了防止私钥丢失,可能会使用公钥基础设施(PKI)和非对称加密技术如RSA进行密钥交换,但这部分通常不在AES加密的范畴内,而是作为额外的安全层。 通过AES微信加密,用户可以放心地在移动设备上进行私密通信...

    Android 安全加密:对称加密详解

    在实际的Android开发中,我们可以使用Java的Cipher类进行对称加密操作,Keytool工具则可以帮助我们管理数字证书。理解这些基本概念和原理对于实现安全的HTTPS连接至关重要,包括设置SSLContext、TrustManager等,以...

    密码编码学:加密方法的C与C++实现

    1. 对称加密: 对称加密是最古老的加密方式,其中加密和解密使用相同的密钥。常见的对称加密算法有DES(Data Encryption Standard)、3DES(Triple DES)和AES(Advanced Encryption Standard)。C和C++中实现对称...

    java加密的文档

    - 对称加密:如AES,速度快,适用于大量数据加密,但需要双方共享同一密钥。 - 非对称加密:如RSA,安全性高,但速度慢,适合密钥交换和数字签名。 - 哈希函数:如MD5和SHA,用于生成消息的固定长度摘要,常用于...

    java实现Base64、MD5、SHA、AES、RAS等加解密js库文件

    5. **RSA**:RSA是一种非对称加密算法,基于大数因子分解的困难性,用于公钥基础设施(PKI)、数字签名和数据加密。Java的`java.security`包包含了完整的RSA实现,包括密钥对的生成和加密解密操作。资源包中提到的...

    java实现加密算法

    常见的加密算法有对称加密(如DES、3DES、AES)和非对称加密(如RSA、ECC)。16进制加密通常指的是将原始数据转换为16进制表示,以便于处理或展示。 2. **Java加密API** Java提供了一套强大的`javax.crypto`包,...

    邮件的加密方式

    PKI(Public Key Infrastructure)是基于非对称加密算法的加密体系,它提供了一种安全的密钥管理机制。CA(Certificate Authority)是PKI中的证书颁发机构,负责颁发和管理数字证书。 PKI/CA体系的优点是密钥管理...

Global site tag (gtag.js) - Google Analytics