- 浏览: 439969 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
cbo365:
叁陆伍视讯公司的网络摄像机支持RTMP协议,可自定义流媒体服务 ...
nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器 -
藏在心底:
用HTML5canvas绘制一个圆环形的进度表示 -
mdqy195905:
Java 代码:
package com.wing;
imp ...
JSR356标准Java WebSocket -
redstarofsleep:
dwangel 写道好像可以直接用 apt-get insta ...
ubuntu14.04安装ffmpeg -
dwangel:
好像可以直接用 apt-get install吧
ubuntu14.04安装ffmpeg
加密技术可以分为对称与非对称两种.
对称加密,解密,即加密与解密用的是同一把秘钥,常用的对称加密技术有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; } }
发表评论
-
JSR356标准Java WebSocket
2013-11-14 11:16 15333文章搬至CSDN, 最新内容请访问: http://blo ... -
另类的package-info.java文件探讨 [转]
2012-08-31 10:03 1491翻看以前的笔记,看到一个特殊的java文件:pacak ... -
知识点整理之Java的Cookie操作
2012-05-07 10:17 3449创建Cookie // new一个Cookie对象,键值对为 ... -
知识点整理之Java获取MD5或者SHA
2012-05-02 11:00 1131获取MD5或者是SHA是经常需要用到的功能. ... -
基于Tomcat的WebSocket(5月8日更新)
2012-04-17 17:05 598572014年2月更新: 此API为Tomcat私有,当时Ja ... -
知识点整理之Java时间格式化
2012-02-16 16:43 952Calendar rightNow = Calendar.ge ... -
知识点整理之Web项目中Log4J的初始化
2012-02-07 08:45 1553首先在web.xml中定义一个servlet,执行初始化 & ... -
知识点整理之Java Socket
2012-01-21 15:01 1281依旧是自己平时用到的一些东西的整理 Socket客户端 ... -
知识点整理之SessionListener监控Session的创建与销毁
2012-01-20 16:46 1459纯粹是以前用到的东西的一点记录,怕自己忘了。 用Lis ... -
HTML5 WebSocket做聊天室(服务器端基于Jetty8)
2011-12-13 08:33 26965早就厌倦了Ajax轮询,一直想试试Web Socket.这次终 ... -
请求转发与重定向的区别[转]
2011-09-13 11:23 1009一、调用方式 我们知道,在servlet中调用转 ... -
HttpClient的基础应用
2011-09-09 08:54 5070HttpClient是用来发送HTTP请求的,也就是HTTP的 ... -
Java文件过滤
2011-09-06 09:33 1655Java实现文件过滤的方法,比如我只想获得某个路径下.java ... -
Java正则表达式入门[转]
2011-06-28 11:25 895众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字 ... -
proxool数据库连接池的配置
2011-02-09 16:58 5677proxool是一个开源的数据库连接池。官方网站是:http: ... -
Java NIO初探
2010-12-25 16:50 1132从JDK1.4开始,Java引入了新的IO,在java.nio ... -
Linux下的JDK安装及环境变量配置
2010-12-11 09:43 13591.从官网下载Linux版的JDK安装包,我这里下载的最新版本 ...
相关推荐
Java对称与非对称加密解密(AES与RSA) 一、对称加密技术与非对称加密技术简述 二、对称加密技术与非对称加密技术的使用场景简述 三、Java实现使用的是AES的对称加密和RSA的非对称加密 备注:此文包括概念讲解和Java...
java aes128/256 对称加密解密,rsa对称加密解密验签实现,php java通用aes加密 支持任何形式的aes加密,文件,字符,字节等,内含php代码,可以与php平台实现aes加密,而且包含rsa非对称加密签名验签实现,都是对...
AES对称和RSA非对称加密解密的java实现
说到加密,可能大家最...相对的可逆加密是可以解密的,可逆加密又分为对称加密和非对称加密,比较流行的对称加密有DES、AES,非对称加密有RSA。C#里的MD5、DES、AES、RSA加密解密详细方法已封装,大家安心下载使用。
RSA加密演算法是一种非对称加密演算法。在公开密钥加密和电子商业中RSA被广泛使用。 典型的应用 1. 苹果App签名, iOS App 签名的原理; 2. 支付宝签名验证 ; 2. HTTPS 加密连接; 3. 程序直接用RSA+AES加密通信 ...
RSA加密演算法是一种非对称加密演算法。在公开密钥加密和电子商业中RSA被广泛使用。这是演示程序,不包含控件 型的应用 1. 苹果App签名, iOS App 签名的原理; 2. 支付宝签名验证 ; 2. HTTPS 加密连接; 3. 程序...
对称加密算法AES及非对称加密算法RSA对字符串进行封装的工具类及DEMO
在非对称加密部分,以RSA加密算法为例,介绍了如何在Java中实现非对称加密,包括密钥生成、公钥和私钥的获取以及加密和解密过程。通过本文的学习,读者可以掌握Java中的加密技术,确保数据的安全传输和存储。
加密算法分对称加密和非对称算法,其中对称加密算法的加密与解密密钥相同,非对称加密算法的加密密钥与解密密钥不同,此外,还有一类不需要密钥的散列算法。 常见的对称加密算法主要有 DES、3DES、AES 等,常见的非...
对称加密网络应用2427.8 小结254第8章高等数据加密—非对称加密算法2568.1 非对称加密算法简述2568.2 密钥交换算法—DH 2588.3 典型非对称加密算法—RSA 2698.4 常用非对称加密算法—ElGamal2778.5 实例:非对称加密...
本文实例讲述了Python3非对称加密算法RSA。分享给大家供大家参考,具体如下: python3 可以使用 Crypto.PublicKey.RSA 和 rsa 生成公钥、私钥。 其中 python3.6 Crypto 库的安装方式请参考前面一篇《Python3对称加密...
友情提醒:请按照user文档中的安装方法,如果你用的不是vc6就需要自己重新编译大数库(否则直接使用默认的ms32.lib),另外,可以参考所提供的cpp,里面有很多加密解密的例子,如AES,SHA等,轻松掌握~
非对称加密:。RSA:。公钥加密,私钥解密。私钥加密,公钥解密。对称加密:。AES:。AES-128-ECB,AES-128-CBC,AES-128-OFB,AES-128-CFB,AES-128-CTR。AES-192-ECB,AES-192-CBC,AES-192-OFB,AES-192-CFB,AES-192-CTR...
对称加密网络应用242 7.8 小结254 第8章高等数据加密—非对称加密算法256 8.1 非对称加密算法简述256 8.2 密钥交换算法—DH 258 8.3 典型非对称加密算法—RSA 269 8.4 常用非对称加密算法—ElGamal277 8.5 实例:非...
主要介绍了vue项目中使用AES实现密码加密解密的方法,主要是通过ecb和cbc两种模式,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
RSA加密的内容长度有限,所以要么是只加密敏感内容,要么是结合其他对称加密例如AES使用(使用对称加密方式来加解密内容,用RSA来加解密对称加密的密钥)参考 这个已经说得挺详细了,也解决了其中遇到的一些问题,但...
起先,准备使用非对称加密(RSA)方式,但是发现它对原始文本长度有限制。 而对称加密(AES)没有长度限制,但是使用固定密钥存在暴露的风险。 有没有两全其美的办法呢? 思路 密钥肯定每个用户不同,而要验证用户...
SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。 SM3 消息摘要。可以...
椭圆加密算法(ECC)是一种...2.处理速度快.z在私钥的加密解密速度上,ecc算法比RSA、DSA速度更快。 3.存储空间占用小。 4.带宽要求低. 这里用delphi代码实现ECC椭圆加密算法的标准示例。 delphi7 delphi2010测试通过