`
redstarofsleep
  • 浏览: 443481 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Java对称与非对称加密解密,AES与RSA

    博客分类:
  • Java
阅读更多

加密技术可以分为对称与非对称两种.

对称加密,解密,即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,AES等

而非对称技术,加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等

 

为什么要有非对称加密,解密技术呢

假设这样一种场景A要发送一段消息给B,但是又不想以明文发送,所以就需要对消息进行加密.如果采用对称加密技术,那么加密与解密用的是同一把秘钥.除非B事先就知道A的秘钥,并且保存好.这样才可以解密A发来的消息.

由于对称技术只有一把秘钥,所以秘钥的管理是一个很麻烦的问题.而非对称技术的诞生就解决了这个问题.非对称加密与解密使用的是不同的秘钥,并且秘钥对是一一对应的,即用A的私钥加密的密文只有用A的公钥才能解密.

这样的话,每个人都有两把秘钥,私钥和公钥,私钥是只有自己才知道的,不能告诉别人,而公钥是公开的,大家都可以知道.这样,当A想要发送消息给B的时候,只需要用B的公钥对消息进行加密就可以了,由于B的私钥只有B才拥有,所以A用B的公钥加密的消息只有B才能解开.而B想更换自己的秘要时也很方便,只须把公钥告诉大家就可以了.

那么,既然非对称加密如此之好,对称加密就没有存在的必要了啊,其实不然,由于非对称加密算法的开销很大,所以如果直接以非对称技术来加密发送的消息效率会很差.那么怎么办呢?解决的办法也很简单,就是把对称加密技术与非对称加密技术结合起来使用.

还是这个例子:A要发送一个消息给B.

一,A先生成一个对称秘钥,这个秘钥可以是随机生成的,

二,A用B的公钥加密第一步生成的这个对称秘钥

三,A把加密过的对称秘钥发给B

四,A用第一步生成的这个对称秘钥加密实际要发的消息

五,A把用对称秘钥加密的消息发给B

对于B

他先收到A发来的对称秘钥,这个秘钥是用B的公钥加密过的,所以B需要用自己的私钥来解密这个秘钥

然后B又收到A发来的密文,这时候用刚才解密出来的秘钥来解密密文

 

这样子的整个过程既保证了安全,又保证了效率.

 

接下来是Java实现:

我这个Java实现使用的是AES的对称加密和RSA的非对称加密(DES的对称加密实现方法和AES的是一样的,但是由于DES算法本身有缺陷,容易被破解,所以现在多用其升级版AES对称加密)

 

AES对称加密,解密

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.ShortBufferException;

public class AES {
	
	private Key key;
	
	/**
	 * 生成AES对称秘钥
	 * @throws NoSuchAlgorithmException
	 */
	public void generateKey() throws NoSuchAlgorithmException {
		KeyGenerator keygen = KeyGenerator.getInstance("AES");
		SecureRandom random = new SecureRandom();
		keygen.init(random);
		this.key = keygen.generateKey();
	}
	
	
	/**
	 * 加密
	 * @param in
	 * @param out
	 * @throws InvalidKeyException
	 * @throws ShortBufferException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 * @throws IOException
	 */
	public void encrypt(InputStream in, OutputStream out) throws InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, IOException {
		this.crypt(in, out, Cipher.ENCRYPT_MODE);
	}
	
	/**
	 * 解密
	 * @param in
	 * @param out
	 * @throws InvalidKeyException
	 * @throws ShortBufferException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 * @throws IOException
	 */
	public void decrypt(InputStream in, OutputStream out) throws InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, IOException {
		this.crypt(in, out, Cipher.DECRYPT_MODE);
	}

	/**
	 * 实际的加密解密过程
	 * @param in
	 * @param out
	 * @param mode
	 * @throws IOException
	 * @throws ShortBufferException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 * @throws InvalidKeyException
	 */
	public void crypt(InputStream in, OutputStream out, int mode) throws IOException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
		Cipher cipher = Cipher.getInstance("AES");
		cipher.init(mode, this.key);
		
		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);
		out.flush();
	}

	public void setKey(Key key) {
		this.key = key;
	}

	public Key getKey() {
		return key;
	}
	
}

 

RSA非对称加密,解密对称秘钥

public class RSA {

	public static final int KEYSIZE = 512;
	
	private KeyPair keyPair;
	private Key publicKey;
	private Key privateKey;
	
	/**
	 * 生成秘钥对
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public KeyPair generateKeyPair() throws NoSuchAlgorithmException {
		KeyPairGenerator pairgen = KeyPairGenerator.getInstance("RSA");
		SecureRandom random = new SecureRandom();
		pairgen.initialize(RSA.KEYSIZE, random);
		this.keyPair = pairgen.generateKeyPair();
		return this.keyPair;
	}

	/**
	 * 加密秘钥
	 * @param key
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 * @throws InvalidKeyException
	 * @throws IllegalBlockSizeException
	 */
	public byte[] wrapKey(Key key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException {
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.WRAP_MODE, this.privateKey);
		byte[] wrappedKey = cipher.wrap(key);
		return wrappedKey;
	}
	
	/**
	 * 解密秘钥
	 * @param wrapedKeyBytes
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 * @throws InvalidKeyException
	 */
	public Key unwrapKey(byte[] wrapedKeyBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.UNWRAP_MODE, this.publicKey);
		Key key = cipher.unwrap(wrapedKeyBytes, "AES", Cipher.SECRET_KEY);
		return key;
	}

	public Key getPublicKey() {
		return publicKey;
	}

	public void setPublicKey(Key publicKey) {
		this.publicKey = publicKey;
	}

	public Key getPrivateKey() {
		return privateKey;
	}

	public void setPrivateKey(Key privateKey) {
		this.privateKey = privateKey;
	}
	
}
 
2
1
分享到:
评论

相关推荐

    java aes128/256 对称加密解密,rsa对称加密解密验签实现

    java aes128/256 对称加密解密,rsa对称加密解密验签实现,php java通用aes加密 支持任何形式的aes加密,文件,字符,字节等,内含php代码,可以与php平台实现aes加密,而且包含rsa非对称加密签名验签实现,都是对...

    Java对称与非对称加密解密(AES与RSA)

    Java中的加密解密技术主要涉及对称加密和非对称加密两种策略,分别以AES和RSA作为典型代表。本文将详细介绍这两种加密技术及其在Java环境下的应用。 对称加密技术,如AES(Advanced Encryption Standard),使用...

    AES对称和RSA非对称加密解密

    本篇文章将详细探讨AES对称加密和RSA非对称加密的Java实现。 AES对称加密是一种广泛应用的块加密算法,它使用相同的密钥进行加密和解密,速度快,效率高。在Java中,我们可以使用Java Cryptography Extension (JCE)...

    rsa与aes混合加密java实现

    总结,RSA和AES混合加密结合了非对称加密的高安全性与对称加密的高效性,是目前广泛应用于数据传输和存储保护的技术。Java提供了丰富的API支持这两种加密算法的实现,开发者可以根据具体需求选择合适的方式进行数据...

    Rsa加密解密.rar_RSA 加密解密_java rsa_rsa加密_rsa加密java_加密 解密

    RSA加密解密是一种广泛应用于网络安全领域的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家在1977年提出,因此得名RSA。这种算法基于大整数因子分解的困难性,使得只有持有正确密钥的人才能...

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

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

    java RAS非对称公私密钥加密+AES公私密钥加密+过滤器入口出口统一处理

    本文将深入探讨Java环境下使用RSA非对称加密和AES对称加密的方法,以及如何通过过滤器实现入口和出口的统一处理。首先,我们来理解这两种加密算法。 **RSA非对称加密** RSA是一种非对称加密算法,其核心在于一对...

    java_RSA2048加密解密.zip

    Java RSA2048加密解密技术是一种广泛应用于网络通信中的安全机制,它结合了非对称加密算法RSA和2048位的密钥长度,以提供强大的数据保护。在给定的“java_RSA2048加密解密.zip”压缩包中,包含了前后端实现RSA2048...

    c/c++与java互通 AES加密解密

    "C/C++与Java互通AES加密解密"的主题就是这两个议题的结合。AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,提供了强效的数据保护。本话题主要探讨如何在C/C++和Java之间使用...

    aes、ras,前端js加密,后端java解密

    4. **解密**:服务器再用`AesUtils.java`解密AES加密的数据,恢复原始信息。 在实际应用中,这样的加密方案能够有效保护用户数据的安全,防止中间人攻击和其他潜在威胁。然而,需要注意的是,任何加密技术都不能...

    JAVA实现RSA加密解密

    RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因其发明者的名字首字母命名。这种加密技术在信息安全领域广泛应用,包括数据加密、数字签名等场景。在Java中实现RSA加密解密,...

    AES+RSA加密解密(js和java互通)

    **RSA**是一种非对称加密算法,由两个密钥——公钥和私钥组成。公钥用于加密,而私钥用于解密。这种方式的优点在于,只有拥有私钥的一方才能解密通过公钥加密的数据,增加了安全性。在JavaScript和Java之间进行通信...

    Java实现文件的RSA和DES加密

    2. 非对称加密算法:非对称加密算法采用加密钥匙(公钥)和解密钥匙(私钥),常用的算法包括 RSA、DSA、ECC 等。 3. 加密算法的选择:在选择加密算法时,需要根据实际情况来确定。如果需要加密大量数据,建议采用...

    MFC实现AES非对称加密解密算法

    在MFC环境中实现AES非对称加密,我们需要集成两个部分:AES对称加密库和非对称加密算法(如RSA)。MFC本身并不包含这些加密库,所以我们通常会引入第三方库,如Crypto++或OpenSSL。以下是一个基本步骤概述: 1. **...

    RSA、AES混合加密解密,Java工程、安卓Demo,1024和2048长度密钥都可用,兼容Android所有版本

    RSA和AES是两种广泛应用的加密算法,分别用于非对称加密和对称加密。本项目结合了这两种算法,创建了一个混合加密解密方案,适用于Java工程和Android应用。下面将详细介绍RSA、AES加密解密以及它们在混合模式下的...

    rsa aes 加密解密 以及rsa 签名以及验证

    这些类可能包括用于AES和RSA加密解密的方法,以及RSA签名和验证的方法。这些工具类通常会提供便利的API,使得开发人员能够轻松地在应用程序中集成这些安全功能。 总之,理解AES和RSA加密算法以及它们的使用场景,是...

    RSA与AES混合加密算法的实现(java版)

    RSA是一种非对称加密算法,而AES是一种对称加密算法。两者的结合利用了它们各自的优势,为数据加密提供了一种安全而高效的方法。 RSA(Rivest-Shamir-Adleman)算法基于数论中的大数因子分解难题,它有两个密钥:...

    Js Java Rsa 加密解密

    在实际应用中,通常会结合使用对称加密(如AES)和非对称加密(如RSA),使用RSA来交换对称密钥,然后使用对称密钥进行数据加密,以兼顾效率和安全性。此外,妥善管理和存储密钥也是保障系统安全的重要环节,必须...

    RSA.rar_RSA加密文件_RSA加密解密和_rsa加密算法_对称 加密文件_对称加密

    5. **对称加密与非对称加密**:对称加密使用同一密钥进行加密和解密,如DES、AES等,效率高但密钥管理困难。非对称加密如RSA则使用一对公钥和私钥,公钥可以公开,私钥需保密,解决了密钥分发问题,但计算复杂度相对...

Global site tag (gtag.js) - Google Analytics