非对称加密

  非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。

  目前最常用的非对称加密算法是RSA算法,是Rivest, Shamir, 和Adleman于1978年发明,他们那时都是在MIT。

  以下是RSA运行实例:

package Utils;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;

import org.apache.commons.codec.binary.Base64;

public class RSAUtils {

	/**
	 * 生成非对称密钥对
	 * @return
	 * @throws Exception
	 */
	public static KeyPair genKeyPair() throws Exception{
		KeyPairGenerator keyp = KeyPairGenerator.getInstance("RSA");
		keyp.initialize(1024);
		return keyp.generateKeyPair();
	}
	public static String getPublicKey() throws Exception{
		Key key =  genKeyPair().getPublic();
		byte[] bytekey =  key.getEncoded();
		byte[] byte64 = Base64.encodeBase64(bytekey);//将字符编码为base64编码
		String keystr = new String(byte64,"UTF-8");
		return keystr;
	}
	public static String getPrivateKey() throws Exception{
		Key key =  genKeyPair().getPrivate();
		byte[] bytekey =  key.getEncoded();
		byte[] byte64 = Base64.encodeBase64(bytekey);//将字符编码为base64编码
		String keystr = new String(byte64,"UTF-8");
		return keystr;
	}
	/**
	 * 加密
	 * @param src
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static byte[] encrypt(byte[] src,String key) throws Exception{
//		byte[] bytekey = key.getBytes("UTF-8");
//		byte[] byte64 = Base64.decodeBase64(bytekey);
		byte[] byte64 = Base64.decodeBase64(key);
		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(byte64);
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Key publicKey = keyFactory.generatePublic(x509KeySpec);
        // 对数据加密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		return cipher.doFinal(src);
	}
	/**
	 * 解密
	 * @param src
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static byte[] decrypt(byte[] src,String key) throws Exception{
//		byte[] bytekey = key.getBytes("UTF-8");
//		byte[] byte64 = Base64.decodeBase64(bytekey);
		byte[] byte64 = Base64.decodeBase64(key);
		// 取得私钥
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(byte64);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);  

        // 对数据解密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		return cipher.doFinal(src);
	}

	public static void main(String[] arg) throws Exception{
		String name = "2";
		byte[] bytes= name.getBytes("UTF-8");
		String pubKey = getPublicKey();
		String priKey = getPrivateKey();
		byte[] bytes1 = encrypt(bytes,pubKey);
		byte[] byte64 = Base64.encodeBase64(bytes1);
		String name1 = new String(byte64,"UTF-8");
		System.out.println(name1);
		System.out.println("===========");
		byte[] bytes2 = name1.getBytes("UTF-8");
		byte[] bytes3 = decrypt(bytes2,priKey);
		byte[] byte641 = Base64.encodeBase64(bytes1);
		String name2 = new String(byte641,"UTF-8");
		System.out.println(name2);
	}
}

  

时间: 2024-10-16 15:56:09

非对称加密的相关文章

浅谈IM软件业务知识——非对称加密,银行U盾的原理

概述 首先了解一下相关概念:RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数论:将两个大素数相乘非常容易,但要对这个乘积的结果进行 因式分解却非常困难,因此可以把乘积公开作为公钥,该算法能够抵抗目前已知的所有密码攻击.RSA算法是一种非对称算法,算法需要一对密钥,使用其中一个 加密,需要使用另外一个才能解密.我们在进行RSA加密通讯时,就把公钥放在客户端,私钥留在服务器. RSA非对称加密算法,可以验

https 结合使用 对称加密和非对称加密

(一)对称加密(Symmetric Cryptography) ---共享密钥加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key),这种方法在密码学中叫做对称加密算法.对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中.对称加密通常使用的是相对较小的密钥,一般小于256 bit.因为密钥越大,加密越强,但加密与解密的过程越慢.如果你只用1 bit来做这个密钥,那黑客们可以先试着用

再谈加密-RSA非对称加密的理解和使用

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

使用php openssl扩展实现非对称加密

php的openssl扩展可对数据进行签名,也可对数据进行非对称加密.非对称加密使用私钥加密,公钥解密. 这里介绍openssl实现非对称加密 可使用linux自带的RSA密钥生成工具openssl,获取一对公私钥,也可使用php openssl扩展函数生成一对公私钥. 先说第一种: 执行以下命令: openssl genrsa -out rsa_private_key.pem 1024openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pe

Linux学习笔记:OpenVPN的预共享密钥用于对称加密和非对称加密

在上一章的测试中,可以看到提示中包含了******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext这句话,表明由于没有认证,所以VPN隧道中的流量都是明文的. *****预共享密钥可以用于小型VPN网络,如果数量多起来的话配置会非常麻烦******** 现使用最简单的预共享密钥进行加密 先来生成密钥,在Centos上使用

对称与非对称加密;SSL;HTTPS;AJP

1.对称加密就是加密与解密的时候都是用一个密码 2.非对称加密,有一对密码A,B:用A加密就得用B解密,相对的用B加密就得用A解密 3.公钥与私钥,这一对密码,随便拿一个公布出去,那个就是公钥,剩下一个是私钥. 4.应用1:我想给一个人发信息,我就去拿他公布出来的公钥加密,加密后就只能用私钥来解密,由于私钥在他手中,就能很好在传输中保密. 5.应用2:我收到一个信息,说是银行发来的账单,银行为了不被别人冒牌货发假信息给客户,事先给客户说好,我给你发信息是我的私钥加密了的,所以客户到了信息就要去拿

非对称加密RSA的应用及在C#中的实现

quote: http://www.cnblogs.com/happinessCodes/archive/2010/07/27/1786404.html 一说到数据的加密,常常会涉及到这几个单词:算法.原文.密文和密钥.通常,发送者把原文通过一个加密的算法,用密钥进行加密后将密文发送给接收者,然后接收者再用密钥对密文进行解密,得到原文.由于常用的加密算法都是公开的,所以,对原文的加密的关键,就是密钥了.对于这种加解密都使用同样的密钥的算法,我们称之为对称加密,对称加密的代表算法就是DES家族了.

ASP.NET WebAPI 安全与身份验证 基础验证与非对称加密

因为安全需要,又没有申请HTTPS证书 只对密码进行了非对称加密 同时服务端验证了是否有证书 本文参考了: MSDN 13年6月的期刊(启用和自定义 ASP.NET Web API 服务的安全性 ):https://msdn.microsoft.com/zh-cn/magazine/dn201748.aspx 与园子里(C#使用RSA证书文件加密和解密示例):http://www.cnblogs.com/eshizhan/archive/2012/10/07/2713680.html 根据实际使

对称加密与非对称加密

(一)对称加密(Symmetric Cryptography) 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key).对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中. 对称加密通常使用的是相对较小的密钥,一般小于256 bit.因为密钥越大,加密越强,但加密与解密的过程越慢.如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解:但如果你的密钥有1 MB

非对称加密RSA的C#实现

1.对称加密算法 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). 对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中.对称加密通常使用的是相对较小的密钥, 一般小于256 bit.因为密钥越大,加密越强,但加密与解密的过程越慢.如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密, 不行的话就再用1解:但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密