rsa算法

RSA加密算法

亡梦爱人 提交于 2020-01-27 05:14:31
RSA加密算法   RSA公钥加密算法是1977年由Ron Rivest, Adi Shamir 和Leonard Adleman一起提出,RSA就是他们三人姓氏开头字母拼在一起组成的。RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,至今未被完全攻破。目前已被ISO推荐为公钥数据加密标准。   RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,截止2017年被普遍认为是最优秀的公钥方案之一。 RSA公开密钥密码体制 所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。 在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。    根据密钥的使用方法,可以将密码分为对称密码和公钥密码     对称密码:加密和解密使用同一种密钥的方式     公钥密码:加密和解密使用不同的密码的方式,因此公钥密码通常也称为非对称密码。 RSA算法实现过程 RSA 算法基于一个十分简单的数论事实:将两个大素数相乘十分容易

签名与确认签名 RSA算法

╄→гoц情女王★ 提交于 2020-01-20 20:52:42
1.使用RSA算法生成密钥对 /** * 生成RSA随机密钥对(公钥和私钥) * @return */ public static Map<String, String> createKeyPair() throws Exception { Map<String,String> keyPairMap = new HashMap<>(); // 密钥生成器,基于RSA算法 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); // 初始化密钥生成器,密钥大小为96-1024位 keyPairGenerator.initialize(1024, SecureRandom.getInstance("SHA1PRNG")); // 生成一个密钥对,保存在KeyPair中 KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 获取公钥及公钥字节数组 PublicKey publicKey = keyPair.getPublic(); byte[] publicKeyBytes = publicKey.getEncoded(); // 获取私钥及私钥字节数组 PrivateKey privateKey = keyPair.getPrivate(

加密与安全

泪湿孤枕 提交于 2020-01-19 17:49:08
一, URL 编码 为什么要使用 URL 编码? 我们都知道Http协议中参数的传输是 "key=value" 这种简直对形式的,如果要传多个参数就需要用 “&” 符号对键值对进行分割。如 "?name1=value1&name2=value2" ,这样在服务端在收到这种字符串的时候,会用 “&” 分割出每一个参数,然后再用 “=” 来分割出参数值。 现在有这样一个问题,如果我的参数值中就包含=或&这种特殊字符的时候该怎么办。 比如说 “name1=value1” ,其中value1的值是 “va&lu=e1” 字符串,那么实际在传输过程中就会变成这样 “name1=va&lu=e1” 。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了奇异。 如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码? URL编码只是简单的在特殊字符的各个字节前加上%,例如,我们对上述会产生奇异的字符进行URL编码后结果: “name1=va%26lu%3D” ,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。 类似于这种 实际操作 public static void main(String[] args) { //url编码 String str="测试"; String urlStr=URLEncoder.encode

RSA算法的Java实现

半世苍凉 提交于 2020-01-07 14:54:24
pom.xml导入jar包 < dependencies > <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> < dependency > < groupId > commons-io </ groupId > < artifactId > commons-io </ artifactId > < version > 2.6 </ version > </ dependency > <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> < dependency > < groupId > commons-codec </ groupId > < artifactId > commons-codec </ artifactId > < version > 1.13 </ version > </ dependency > </ dependencies > 代码: package com . echo . servlet ; import org . apache . commons . codec . binary . Base64 ; import org . apache . commons . io .

第四课 RSA算法

筅森魡賤 提交于 2019-12-24 23:40:23
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然秘密密钥SK 是由公开密钥PK决定的,但却不能根据PK计算出SK。 准备工作: 1.选择两个 质数p, q 2.令N = pq, e 为 与(p-1)(q-1)互质的数 (为了快速解密,若符合条件一般选择最小的3) (N, e)为公钥 3.令d为e mod (p-1)(q-1)的逆。 (N,d) 为私钥 现在就得到3个数,N e d。 设x为信息 加密:密文为 y = x^e (mod N) 解密:x = y^d (mod N) Example: 取p = 11, q = 5, 所以 (p-1)(q-1) = 40 N = pq = 55, gcd(3, 40) = 1, e = 3 d = 3^-1 mod 40 = 27 所以 加密 y = x^3 mod 55 解密 x = y^27 mod 55 RSA安全性在于,若不知道d,知道了y要解出x是很困难的。 来源: https://www.cnblogs.com/chenyg32/archive/2013/04/13/3017806.html

RSA算法笔记+理解

淺唱寂寞╮ 提交于 2019-12-21 14:14:44
明天网络安全考试了,看了一下午,还没理解透,持续更新... 质数: 除了1和它本身以外不再有其他因素的数 互质关系: 两个正整数,除了1以外,没有其他公因子 RSA实现了非对称加密 DES实现了对称加密 ************************************************** RSA密钥生成的步骤 step1: 随机选择两个不相等的质数p和q step2: 计算p和q的乘积n step3: 计算n的欧拉函数φ(n)=(p-1)(q-1) step4: 随机选择一个整数e,条件是1< e < φ(n),且e与φ(n)互质 step5: 计算e对于φ(n)的模反元素d(多组取一) ed ≡ 1 (mod φ(n))   p q    //基础随机 公 n 私   φ(n) 公 e     //在上一步基础随机上随机   d 私   //d多组取一,在解密过程中效果一样(为什么效果一样,只是我一知半解的猜测) *************************************************** RSA算法的可靠性 若已知n、e要推出d ->先推出φ(n) ->将n因式分解 ->大整数的因式分解基本不能完成, 虽然此处只有除1外的一对因子,现存方法只有暴力破解 成对的生成公钥、私钥,却无法单独由公钥推出私钥 ******************

算法篇——RSA算法

跟風遠走 提交于 2019-12-21 02:45:16
1.导语:公钥和私钥原理 公钥和私钥就是俗称的不对称加密方式,是从以前的对称加密(使用用户名与密码)方式的提高。我用电子邮件的方式说明一下原理。 使用公钥与私钥的目的就是实现安全的电子邮件,必须实现如下目的: 1. 我发送给你的内容必须加密,在邮件的传输过程中不能被别人看到。 2. 必须保证是我发送的邮件,不是别人冒充我的。 要达到这样的目标必须发送邮件的两人都有 公钥和私钥 。 公钥,就是给大家用的,你可以通过电子邮件发布,可以通过网站让别人下载,公钥其实是用来加密/验章用的。私钥,就是自己的,必须非常小心保存,最好加上密码,私钥是用来解密/签章,首先就Key的所有权来说,私钥只有个人拥有。公钥与私钥的作用是:用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密。 比如说,我要给你发送一个加密的邮件。首先,我必须拥有你的公钥,你也必须拥有我的公钥。 首先,我用你的公钥给这个邮件加密,这样就保证这个邮件不被别人看到,而且保证这个邮件在传送过程中没有被修改。你收到邮件后,用你的私钥就可以解密,就能看到内容。其次我用我的私钥给这个邮件加密,发送到你手里后,你可以用我的公钥解密。因为私钥只有我手里有,这样就保证了这个邮件是我发送的。 当A->B资料时,A会使用B的公钥加密,这样才能确保只有B能解开,否则普罗大众都能解开加密的讯息,就是去了资料的保密性

总结公开密钥RSA算法

孤者浪人 提交于 2019-12-13 03:52:50
对称加密从名字上很容易理解,就是加密和解密使用相同的密钥和算法,加密解密过程是可逆的。与之对应还有一种非对称加密算法,即加密和解密使用不同的密钥,非对称密钥我比较喜欢叫公开密钥算法,因为公开密钥中使用的密钥是一对的,分为公钥和私钥两部分,其中公钥是可以公开的,私钥则不公开,通常由密钥对的生成方持有。总结下对称加密和公开密钥(非对称加密)的不同点: 密钥:对称加密中的密钥是一串数字,加密和解密都使用相同的密钥。公开密钥中使用密钥对,分为公钥和私钥,私钥需要保密,公钥则可以被公开。 性能:对称加密速度较公开密钥快很多,对称加密中的流密码方式支持并行处理,块密码中的CTR计数器模式,由于特殊的迭代方式,也可以做到并行处理。公开密钥算法由于密钥长度较大,通常为2048比特(对称加密AES算法通常不超过256比特),所以计算量大,导致整体运算慢,当然密钥长度越长,安全性也就越好。 功能:对称加密算法通常就只用来做信息的加密和解密,而公开密钥除了加密解密外,还可以用在数字签名和密钥协商方面。 使用场景 实际上,公开密钥由于速度太慢,很少用在加密解密中,尤其是HTTP应用中通常包含的内容很多,且是明文形式传输,所以使用公开密钥算法的性能就十分差。不过使用到公开密钥进行加密解密的情况还是有的,例如下面的场景。 单向加密 假设一个用户取款的场景,在用户登录自己账户时,输入了账号和密码

几种加密算法的测试,包括对称加密和非对称加密

℡╲_俬逩灬. 提交于 2019-12-10 01:49:16
对称加密算法   Blowfish 加密解密 Blowfish 加密算法介绍:BlowFish是对称加密算法的其中一种,加密后的数据是可逆的。由于BlowFish加密/解密速度快,更重要的是任何人都可以免费使用不需要缴纳版权费,所以有不少游戏都采用BlowFish加密资源文件数据。BlowFish 每次只能加密和解密8字节数据,加密和解密的过程基本上由ADD和XOR指令运算组成,所以速度非常快。 Blowfish 加密算法实现 1 /** 2 * Blowfish加密 3 * 4 * @param text 需要加密的数据 5 * @param privateKey 加密密钥 6 * @return 7 */ 8 public static String f_EnBlowfish(String text, String privateKey) 9 { 10 byte[] cifrado1 = null; 11 byte[] cifrado2 = null; 12 byte[] mensaje = text.getBytes(); 13 try 14 { 15 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 16 byte[] keys = privateKey

iOS 加密与解密

感情迁移 提交于 2019-12-06 02:21:25
iOS RSA的网络安全模型、iOS签名机制总结(登录、token安全、签名) 一.登录、登录保持(http请求) 登录机制大概可以分为一下三个阶段: 1. 登录验证:是指客户端提供用户名和密码,向服务器提出登录请求,服务器判断客户端是否可以登录并向客户端确认。 2. 登录保持:是指客户端登录后, 服务器能够分辨出已登录的客户端,并为其持续提供登录权限的服务器。 3. 登出:是指客户端主动退出登录状态。 第一种网络请求情况(安全级别:II) 一般的情况是这个样子的:一但用户登陆成功(单方面MD5加密:服务器加密则客户端不加密,客户端加密则明文传输),服务器为客户端分配 sessionID(也可以称为userID),当然有些服务器不但为客户端分配了userID还有可能会为用户提供token了(这个下面会做解释), 然后每次网络请求都将sessionID当做参数传递给服务器。 优点 能够保持用户登录状态、区分用户,相对于不返回任何信息的登录要安全了一些。 缺点 如果通过网络嗅探器(例如:青花瓷)可以获取到http链接,这样子服务器返回的sessionID便会被获取到,这样子依然会造成信息泄露,并且还能被伪造请求(浏览器请求)。 第二种网络请求情况 (安全级别:III) 第一种存在明显的安全隐患,但是目前市面上的好多app依然采用第一种方法去实现登录、网络请求