非对称加密

RAS非对称加密

风流意气都作罢 提交于 2019-12-02 19:08:01
加解密密钥不一致,一般私钥不公开,使用公钥加密,私钥解密,使用私钥加密,公钥可以解密。 java代码 import javax.crypto.Cipher; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; public class RSA { //非对称密钥算法 private static final String KEY_ALGORITHM = "RSA"; //密钥长度,在512到65536位之间,建议不要太长,否则速度很慢,生成的加密数据很长 private static final int KEY_SIZE = 512; //字符编码 private static final String CHARSET = "UTF-8"; /** * 生成密钥对 * * @return KeyPair 密钥对 */ public static KeyPair getKeyPair() throws Exception { return getKeyPair(null); } /** * 生成密钥对 * @param password 生成密钥对的密码

聊聊对称/非对称加密在HTTPS中的使用

懵懂的女人 提交于 2019-12-02 06:05:34
目前常用的加密算法主要分成三类: 对称加密算法 非对称加密算法 消息摘要算法 在互联网中,信息防护主要涉及两个方面:信息窃取和信息篡改。对称/非对称加密算法能够避免信息窃取,而消息摘要算法能够避免信息篡改。 对称加密算法 发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。 相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。 非对称加密算法 接收方在发送消息前需要事先生成公钥和私钥,然后将公钥发送给发送方。发送放收到公钥后,将待发送数据用公钥加密,发送给接收方。接收到收到数据后,用私钥解密。 在这个过程中,公钥负责加密,私钥负责解密,数据在传输过程中即使被截获,攻击者由于没有私钥,因此也无法破解。 非对称加密算法的加解密速度低于对称加密算法,但是安全性更高。 消息摘要算法 消息摘要算法可以验证信息是否被篡改。 在数据发送前,首先使用消息摘要算法生成该数据的签名,然后签名和数据一同发送给接收者。接收者收到数据后,对收到的数据采用消息摘要算法获得签名,最后比较签名是否一致,以此来判断数据在传输过程中是否发生修改。 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出,SHA

加密、解密、数字签名和数字证书详解

大兔子大兔子 提交于 2019-12-02 03:22:31
1. 概述 随着电子商务的迅速发展,信息安全已成为焦点问题之一,尤其是网上支付和网络银行对信息安全的要求显得更为突出。为了能在因特网上开展安全的电子商务活动,公开密钥基础设施(PKI, Public Key Infrastructure)逐步在国内外得到广泛应用。我们是否真的需要PKI,PKI究竟有什么用?下面通过一个案例一步步地来剖析这个问题。 2. 案例 2.1 案例内容 甲想将一份合同文件通过Internet发给远在国外的乙,此合同文件对双方非常重要,不能有丝毫差错,而且此文件绝对不能被其他人得知其内容。如何才能实现这个合同的安全发送? 2.2 问题1 问题1 :最自然的想法是,甲必须对文件加密才能保证不被其他人查看其内容。那么,到底应该用什么加密技术,才能使合同传送既安全又快速呢?   可以采用一些成熟的 对称加密算法 ,如DES、3DES、RC5等对文件加密。对称加密采用了对称密码编码技术, 对称加密的特点是文件加密和解密使用相同的密钥 ,即加密密钥也可以用做解密密钥,这种方法在密码学中叫做对称加密算法, 2.3 问题2 问题2: 如果黑客截获此文件,是否用同一算法就可以解密此文件呢?   不可以,因为加密和解密均需要两个组件:加密算法和对称密钥,加密算法需要用一个对称密钥来解密,黑客并不知道此密钥。 2.4 问题3 问题3: 既然黑客不知密钥

非对称加密RSA的C#实现

孤人 提交于 2019-12-02 02:57:28
1.对称加密算法 对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。 对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。对称加密通常使用的是相对较小的密钥, 一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密, 不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。 密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。 常用对称加密:DES、3DES、AES等 (代码后续添加) 2.非对称加密算法 非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。 私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。 比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。 与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。 常用非对称加密:DSA、RSA等 目前C

对称加密与非对称加密和HTTPS

独自空忆成欢 提交于 2019-12-01 16:25:55
为什么需要加密,因为HTTP是明文传输,不安全。 对称加密 浏览器和服务器使用同一个密钥进行加密和解密。没有该密钥不能获取到传输的内容。看似是正确的没有错误。但是怎么保证该密钥能安全的让双方知道呢,服务器生成密钥发送给浏览器的过程中是有可能被截获该密钥的。有的人可能会想,如果浏览器一开始就有该密码就可以了,但是你想想让浏览器去保存所有HTTPS网站的密钥?这不现实吧。 非对称加密 浏览器和服务器同时拥有公钥和私钥,公钥用来加密,私钥用来解密。公钥是可以在网络中传输的。 过程是这样的: 浏览器拥有公钥A和私钥A',服务器拥有公钥B和私钥B' 浏览器向服务器发送请求时,服务器明文传输公钥B给浏览器。 浏览器用公钥B进行加密发送给服务器,服务器收到后用私钥B'进行解密,因为只有服务器有该密钥B',所以是安全的。 同理,服务器向浏览器传输的道路上用浏览器的公钥加密,浏览器收到后用浏览器的私钥进行解密。 这样两条路的安全都可以保证是安全的了(其实是不安全的) 先抛开非对称加密的不安全性不说来谈谈为什么HTTPS不是用的这种加密? 很简单,这种方式太过于繁琐和耗时,效率不高。而对称加密算法则比这快的多,那么我们可不可以使用两者的结合呢? 非对称加密+对称加密 HTTPS真正采用的是这种加密方式。 大致的过程就是使用非对称加密的方式传送密钥,那么该密钥就是双方就安全的得到了

利用Python爬取基于AES对称加密算法的网易云音乐用户评论数据

杀马特。学长 韩版系。学妹 提交于 2019-12-01 13:25:51
本文利用Python2.7根据网易云音乐歌曲ID爬取了该歌曲的所有用户评论数据。以id是28875120的歌曲《小岁月太着急》为示例,通过Chrome的DevTools工具获取已加密评论数据,然后基于AES对称加密算法对已加密数据进行解密实现,最后使用Python成功实现了对用户评论数据的抓取与保存。本文部分算法实现参考于 知乎 回答,全部代码可在 Github项目地址 查看。 利用DevTools工具获取加密数据 进入 http://music.163.com/#/song?id=28875120 页面,打开Chrome的DevTools工具选择Network并重载页面,找到与评论数据相关的请求即name为R_SO_4_28875120?csrf_token=90e04572eb42b040167323ec2fcdd79f的POST请求,如下图所示: 查看该请求信息,可知Request Headers参数如下: 其中的POST Request URL完整地址为 : http://music.163.com/weapi/v1/resource/comments/R_SO_4_28875120?csrf_token=90e04572eb42b040167323ec2fcdd79f 并且,该Form Data含有params和encSecKey两个参数,显然

RSA非对称加密方式

纵饮孤独 提交于 2019-12-01 12:10:00
记录一下所学到的东西,不一定适合各种情况,因为架构的原因所以使用了jfinal的两个包,可以参考一下。 import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import javax.crypto.Cipher; import org.apache.commons.codec.binary.Base64; import com.jfinal.kit.StrKit; import com.jfinal.plugin.redis.Redis; public class RSAtool { /** * 生成密钥对 * @throws

比特币非对称加密详解

蹲街弑〆低调 提交于 2019-12-01 09:57:41
先来理论概念上的简单总结 交易准备: 我的地址A(公钥)和配对的私钥(保存在钱包) 对方的地址B(公钥) 交易过程: 两个账户转账时,比如我(A)给对方(B)转账,我发送一条信息“A给B转账10个BTC” 先用B公开的公钥加密,再用我的私钥加密(两层加密) 然后把双层加密信息广播到比特币网络节点,所有节点收到后他们会用我的公钥(A)来校验是不是我(第一层加密,确认是我的身份的东西后会进行记录 因为我做了两层加密,所以里面的数据只有B用他的私钥能解开,B也一样先检验第一层我的公钥确认是我,再用自己的私钥匙来解密第二层从而拿到数据 B收到钱后也会类似我发数据的方式进行全网广播 done!! 下面详细记录流程 首先我作为发送方,我拥有: 付款地址(公钥):“1FKDZ3s2H787sa” 私钥:“2SYFs2SU89H8YH” Hash ( Hash ( func ( 私钥“2SY...” ) ) ) -> 付款地址"1FKDZ..." (第一次哈希) 公钥和私钥是一对非对称关系,可以理解为用户名和密码的关系。 比特币交易流程 比特币的账户是用地址来表示,账本上不显示个人信息,转账是把比特币从一个地址转移到另一个地址。 例如一段交易信息记录: { "付款地址":"1FKDZ3s2H787sa" "收款地址":"3SKC9CBa239aFcc" "金额":"0.5btc"

数字证书,数字签名,https,ssl等安全概念的解释

こ雲淡風輕ζ 提交于 2019-12-01 06:52:39
讲这些概念之前,先讲讲非对称加密,与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥( publickey )和私有密钥( privatekey )。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。非对称加密通常以 RSA ( Rivest Shamir Ad1eman )算法为代表。 tips: 上面的概念中, 公钥和私钥都可以加 密解密, 也就是说一个密钥是公钥或者是私钥不是定死的, 是由你在使用的过程中自己划分的。 数字证书 一种文件的名称,好比一个机构或人的签名,能够证明这个机构或人的真实性。其中包含的信息,用于实现上述功能。其作用类似于现实生活中的身份证。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。一般情况下证书中还包括密钥的有效时间,发证机关 ( 证书授权中心 ) 的名称,该证书的序列号等信息。 数字证书是由认证中心颁发的。根证书是认证中心与用户建立信任关系的基础。在用户使用数字证书之前必须首先下载和安装。 认证中心是一家能向用户签发数字证书以确认用户身份的管理机构。为了防止数字凭证的伪造,认证中心的公共密钥必须是可靠的

RSA非对称加密——前台加密后台解密

三世轮回 提交于 2019-11-30 20:56:35
写在前面 项目安全测试需要将登录功能修改, AES加密不符合要求, 现改为RSA非对称加密.(将登录密码加密后传给后台, 后台解密后再进行一系列的校验) 步骤及关键代码 1.rsasecurity.js 1 (function ($w) { 2 3 if (typeof $w.RSAUtils === 'undefined') 4 var RSAUtils = $w.RSAUtils = {}; 5 6 var biRadixBase = 2; 7 var biRadixBits = 16; 8 var bitsPerDigit = biRadixBits; 9 var biRadix = 1 << 16; 10 var biHalfRadix = biRadix >>> 1; 11 var biRadixSquared = biRadix * biRadix; 12 var maxDigitVal = biRadix - 1; 13 var maxInteger = 9999999999999998; 14 15 16 var maxDigits; 17 var ZERO_ARRAY; 18 var bigZero, bigOne; 19 20 var BigInt = $w.BigInt = function (flag) { 21 if (typeof flag ==