博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
非对称加密
阅读量:4545 次
发布时间:2019-06-08

本文共 3555 字,大约阅读时间需要 11 分钟。

  非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(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);	}}

  

转载于:https://www.cnblogs.com/youzhongmin/p/6934888.html

你可能感兴趣的文章
【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
查看>>
【BZOJ4750】密码安全 单调栈
查看>>
Java之atomic包的原理及分析
查看>>
Chrome自定义滚动条
查看>>
poj3311(状态压缩dp)
查看>>
《大数据日知录》读书笔记-ch2数据复制与一致性
查看>>
个人冲刺01
查看>>
Ubuntu16.04源的问题
查看>>
mysql基础5(mysql命令集----表操作)
查看>>
DevExpress:下拉框绑定数据源 (ComboBoxEdit,LookUpEdit)
查看>>
视觉里程计06 Qt界面显示摄像头
查看>>
基于unity3d IFC的虚拟仿真系统
查看>>
BCS SET EMAIL
查看>>
linux 2.6 驱动笔记(一)
查看>>
SpringMVC与MyBatis整合方法
查看>>
获取当前系统运行目录
查看>>
多个tomcat实例运行的配置
查看>>
一种基于 Numpy 的 TF-IDF 实现报告
查看>>
wpf窗口阴影
查看>>
linux内核分析第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用...
查看>>