精华内容
参与话题
问答
  • RSA加密原理详解

    千次阅读 2019-02-18 09:57:31
    RSA加密的核心其实是欧拉定理,通过这个定理得到了这种非对称加密算法 一、算法介绍 找到两个素数p和q,并计算n=p*q 找到(d,φ(n))=1,即d与φ(n)互质,其中0<d<φ(b),φ(n)为欧拉函数,是指...

    RSA加密的核心其实是欧拉定理,通过这个定理得到了这种非对称加密算法

    一、算法介绍

    找到两个素数ppqq,并计算n=pqn=pq
    找到(d,φ(n))(d,\varphi(n)),即ddφ(n)\varphi(n)互质,其中0<d<φ(b)0<d<\varphi(b)φ(n)\varphi(n)为欧拉函数,是指<n<n且与nn互质的正整数的个数
    因为n=pqn=pq,所以φ(n)=(p1)(q1)\varphi(n)=(p-1)(q-1),也就是说dd(p1)(q1)(p-1)(q-1)互质
    再找到0<e<φ(n)0<e<\varphi(n)使得de1(mod φ(n))de\equiv1(mod\space\varphi(n)),即dede除以φ(n)\varphi(n)余数为1
    那么形成秘钥对(n,d)(n,d)(n,e)(n,e),分别是私钥和公钥
    使用秘钥对(n,x)(n,x)加密的方法为f(a,n,x)=ax(mod n)f(a,n,x)=a^x(mod\space n),解密为同一函数
    那么就可以用公钥加密私钥解密或用私钥加密公钥解密,即
    B=f(A,n,d)B=f(A,n,d)A=f(B,n,e)A=f(B,n,e)
    但细心的人会发现,知道nn就知道了φ(n)\varphi(n),结合dd就可以算出ee,这样知道公钥就知道私钥
    其实,RSA加密的核心就在于ppqq的选择,这两个质数一定要选择的很大,相乘容易,分解难
    所以破解往往长达数月(nn的长度为512和七百多的RSA已经被成功破解)
    所以现在nn的长度至少为1024,有很多是2048

    二、欧拉定理

    nnxx为正整数,(x,n)=1(x,n)=1,则有xφ(n)1(mod n)x^{\varphi(n)}\equiv1(mod\space n),这就是欧拉定理,下面简单的证明一下
    构造modnmod n的既约剩余系(不懂的同学们看第三块)
    设为a1,a2,...,aφ(n)a_1,a_2,...,a_{\varphi(n)},并找一个与nn互质的数xx,根据既约剩余系的积不变性(见第三块),有
    既约剩余系xa1,xa2,...,xaφ(n)xa_1,xa_2,...,xa_{\varphi(n)}的积与上述既约剩余系的积mod nmod\space n同余
    a1,a2,...,aφ(n)a_1,a_2,...,a_{\varphi(n)}的积为kk,那么第二个既约剩余系的乘积为kxφ(n)kx^{\varphi(n)}
    则有kkxφ(n)(mod n)k\equiv kx^{\varphi(n)}(mod\space n),而因为aia_inn互质,所以kknn互质,所以两边同时除去kk
    xφ(n)1(mod n)x^{\varphi(n)}\equiv 1(mod\space n),得证!

    三、既约剩余系

    设有正整数nn,找到rr的集合,其中1rn1\le r\le n(r,n)=1(r,n)=1
    设这个集合为r1,r2,...,rk{r_1,r_2,...,r_k},那么根据欧拉函数的定义,k=φ(n)k=\varphi(n)
    对于一个φ(n)φ(n)元正整数集合,如果对其每一个元素mod nmod\space n后得到的集合与上述集合相等
    那么称这个集合为mod nmod\space n的既约剩余系
    而根据上述定义,所有mod nmod\space n的既约剩余系mod nmod\space n的性质类似
    显然,任何两个mod nmod\space n的既约剩余系的和与积mod nmod\space n同余(因为每个元素对应mod nmod\space n同余)
    所以既约剩余系有和不变性积不变性

    四、总结

    RSA加密算法是通过欧拉定理得到的,该算法的安全性来源于大数分解质因数的困难,在选取ppqq的时候要尽可能的大一些
    RSA因为涉及到大数运算,甚至包括幂运算,所以速度比对称加密算法慢得多,一般用于加密对称加密的较短秘钥

    展开全文
  • 非对称加密算法--RSA加密原理

    万次阅读 多人点赞 2018-12-24 00:33:58
    在说RSA加密算法之前, 先说下密码学的发展史。其实密码学的诞生,就是为了运用在战场,在公元前,战争之中出现了秘密书信。在中国历史上最早的加密算法的记载出自于周朝兵书《六韬.龙韬》中的《阴符》和《阴书》。...

    密码学是在编码与破译的斗争实践中逐步发展起来的,并随着先进科学技术的应用,已成为一门综合性的尖端技术科学。

    密码学发展史

    在说RSA加密算法之前, 先说下密码学的发展史。其实密码学的诞生,就是为了运用在战场,在公元前,战争之中出现了秘密书信。在中国历史上最早的加密算法的记载出自于周朝兵书《六韬.龙韬》中的《阴符》和《阴书》。在遥远的西方,在希罗多德(Herodotus)的《历史》中记载了公元前五世纪,希腊城邦和波斯帝国的战争中,广泛使用了移位法进行加密处理战争通讯信息。

    相传凯撒大帝为了防止敌人窃取信息,就使用加密的方式传递信息。那么当时的加密方式非常的简单,就是对二十几个罗马字母建立一张对照表,将明文对应成为密文。那么这种方式其实持续了很久。甚至在二战时期,日本的电报加密就是采用的这种原始加密方式。
    凯撒密码对照表

    早期的密码学一直没有什么改进,几乎都是根据经验慢慢发展的。直到20世纪中叶,由香农发表的《秘密体制的通信理论》一文,标志着加密算法的重心转移往应用数学上的转移。于是,逐渐衍生出了当今重要的三类加密算法:非对称加密、对称加密以及哈希算法(HASH严格说不是加密算法,但由于其不可逆性,已成为加密算法中的一个重要构成部分)。

    1976年以前,所有的加密方法都是同一种模式:加密和解密使用同样规则(简称"密钥"),这被称为"对称加密算法",使用相同的密钥,两次连续的对等加密运算后会回复原始文字,也有很大的安全隐患。

    1976年,两位美国计算机学家Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完成解密。这被称为"Diffie-Hellman密钥交换算法"。也正是因为这个算法的产生,人类终于可以实现非对称加密了:A给B发送信息

    1. B要先生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
    2. A获取B的公钥,然后用它对信息加密。
    3. B得到加密后的信息,用私钥解密。
      理论上如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。

    1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是232个十进制位,也就是768个二进制位,因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全,当然量子计算机除外。

    RSA算法的原理

    下面进入正题,解释RSA算法的原理,其实RSA算法并不难,只需要一点数论知识就可以理解。

    1. 素数:又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。
    2. 互质,又称互素。若N个整数的最大公因子是1,则称这N个整数互质。
    3. 模运算求余运算。“模”是“Mod”的音译。和模运算紧密相关的一个概念是“同余”。数学上,当两个整数除以同一个整数,若得相同余数,则二整数同余
    欧拉函数

    任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?)计算这个值的方法就叫做欧拉函数,以φ(n)表示。

    • 计算8的欧拉函数,和8互质的 1、2、3、4、5、6、7、8
      φ(8) = 4
      如果n是质数的某一个次方,即 n = p^k (p为质数,k为大于等于1的整数),则φ(n) = φ(p^k) = p^k - p^(k-1)。也就是φ(8) = φ(2^3) =2^3 - 2^2 = 8 -4 = 4
    • 计算7的欧拉函数,和7互质的 123456、7
      φ(7) = 6
      如果n是质数,则 φ(n)=n-1 。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
    • 计算56的欧拉函数
      φ(56) = φ(8) * φ(7) = 4 * 6 = 24
      如果n可以分解成两个互质的整数之积,即 n = p * k ,则φ(n) = φ(p * k) = φ(p1)*φ(p2)

    欧拉定理:如果两个正整数m和n互质,那么m的φ(n)次方减去1,可以被n整除。
    欧拉定理.png

    费马小定理:欧拉定理的特殊情况,如果两个正整数m和n互质,而且n为质数!那么φ(n)结果就是n-1。
    费马小定理.png

    模反元素

    还剩下最后一个概念,模反元素:如果两个正整数e和x互质,那么一定可以找到整数d,使得 ed-1 被x整除,或者说ed被x除的余数是1。
    那么d就是e相对于x的模反元素。
    d是模反元素

    等式转换
    1. 根据欧拉定理
      等式转换1

    2. 由于1^k ≡ 1,等号左右两边都来个k次方
      等式转换

    3. 由于1* m ≡ m,等号左右两边都乘上m
      等式转换3.png

    根据模反元素,因为e*d 一定是x的倍数加1。所以如下:
    等式转换

    通过多次的等式转换。终于可以将这两个等式进行合并了!如下:
    最终等式转换

    这个等式成立有一个前提!就是关于模反元素的,就是当整数e和φ(n)互质!一定有一个整数d是e相对于φ(n)的模反元素。
    我们可以测试一下。
    m取值为4
    n取值为15
    φ(n)取值为8
    e 如果取值为3
    d 可以为 11、19…(模反元素很明显不止一个,其实就是解二元一次方程)
    如果你测试了,那么你可以改变m的值试一下,其实这个等式不需要m和n 互质。只要m小于n 等式依然成立。
    这里需要注意的是,我们可以看做 m 通过一系列运算得到结果仍然是 m。这一系列运算中,分别出现了多个参数n、φ(n)、e还有d。

    m 的 e乘上d 次方为加密运算,得到结果 c
    c 模以 n 为解密运算,得到结果 m
    这似乎可以用于加密和解密。但这样,加密的结果会非常大。明文数据将非常小(虽然RSA用于加密的数据也很小,但是没这么大悬殊),真正的RSA要更加强大,那么RSA是怎么演变来的呢??
    早期很多数学家也停留在了这一步!直到1967年迪菲赫尔曼密钥交换打破了僵局!

    迪菲赫尔曼密钥交换

    这个密钥交换当时轰动了整个数学界!而且对人类密码学的发展非常重要,因为这个伟大的算法能够拆分刚才的等式。当非对称加密算法没有出现以前,人类都是用的对称加密。所以密钥的传递,就必须要非常小心。
    迪菲赫尔曼密钥交换 就是解决了密钥传递的保密性,我们来看一下
    迪菲赫尔曼密钥交换
    假设一个传递密钥的场景。算法就是用3 的次方去模以17。 三个角色

    • 服务器 随机数 15
      这个15只有服务器才知道。通过算法得到结果 6 因为 3的15次方 mod 17 = 6 。然后将结果 6 公开发送出去,拿到客户端的 12 ,然后用12^15 mod 17 得到结果10(10就是交换得到的密钥)
    • 客户端 随机数13
      客户端用3 的 13次方 mod 17 = 12 然后将得到的结果12公布出去。
      拿到服务器的 6 ,然后用6^13 mod 17 得到结果10(10就是交换得到的密钥)
    • 第三者
      第三者只能拿到6 和 12 ,因为没有私密数据13、15,所以它没法得到结果10。

    为什么 6的13次方会和12的15次方得到一样的结果呢?因为这就是规律,我们可以用小一点的数字测试一下3^3 mod 17 = 10和10 ^ 2 mod 17 ; 3 ^ 2 mod 17 = 9和9^3 mod 17结果都是15。迪菲赫尔曼密钥交换最核心的地方就在于这个规律
    迪菲赫尔曼密钥交换转换

    RSA的诞生

    RSA原理

    现在我们知道了m^e % n = c是加密,c^d % n = m是解密,m就是原始数据,c是密文,公钥是n和e,私钥是n和d,所以只有n和e是公开的。加密时我们也要知道φ(n)的值,最简单的方式是用两个质数之积得到,别人想破解RSA也要知道φ(n)的值,只能对n进行因数分解,那么我们不想m被破解,n的值就要非常大,就是我们之前说的,长度一般为1024个二进制位,这样就很安全了。但是据说量子计算机(用于科研,尚未普及)可以破解,理论上量子计算机的运行速度无穷快,大家可以了解一下。

    以上就是RSA的数学原理

    检验RSA加密算法

    我们用终端命令演示下这个加密、解密过程。
    假设m = 12(随便取值,只要比n小就OK),n = 15(还是随机取一个值),φ(n) = 8,e = 3(只要和φ(n)互质就可以),d = 19(3d - 1 = 8,d也可以为3,11等等,也就是d = (8k + 1)/3 )
    终端分别以m=12,7输入结果
    终端演示

    OpenSSL进行RSA的命令运行

    Mac可以直接使用OpenSSL,首先进入相应文件夹

    • 生成公私钥
    // 生成RSA私钥,文件名为private.pem,长度为1024bit
    openssl genrsa -out private.pem 1024
    
    // 从私钥中提取公钥
    openssl rsa -in private.pem -pubout -out publick.pem
    

    生成私钥

    // 查看刚刚生成好的私钥
    cat private.pem
    
    // 查看刚刚生成好的公钥
    cat publick.pem
    

    查看公私钥

    我们可以看到base64编码,明显私钥二进制很大,公钥就小了很多。
    这时候我们的文件夹内已经多了刚刚生成好的公私钥文件了

    公私钥文件

    // 将私钥转换为明文
    openssl rsa -in private.pem -text -out private.txt
    

    96111F25-0954-4854-9B36-75413A439AFD.png

    里面就是P1、P2还有KEY等信息。

    • 对文件进行加密、解密
    // 编辑文件message内容为hello Vincent!!!
    // 刚刚的public.pem写成了publick.pem(哎。。。)
     $ vi message.txt
     $ cat message.txt
     hello Vincent!!!
    // 通过公钥加密数据时,使用encrypt对文件进行加密
     $ openssl rsautl -encrypt -in message.txt -inkey publick.pem -pubin -out enc.txt
    // 此时查看该文件内容为乱码
     $ cat enc.txt
    j��E]֌a��d�kUE�&<
                     ��I*��V/��pL[���ˋ�O�+�-�M��K�ܱ�&⪅ծO��2���o34�:�$���6��C�L��,b�'M�S�k�0���A��3%�[I���1�����ps"%
    // 通过私钥解密数据
     $ openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
    // 已成功解密,正确显示文件内容
     $ cat dec.txt
      hello Vincent!!!
    
    // 通过私钥加密数据时,要使用sign对文件进行重签名
    $ openssl rsautl -sign -in message.txt -inkey private.pem -out enc.bin
    // 此时查看该文件内容同样为乱码
    $ cat enc.bin
    {���Ew�3�1E��,8-OA2�Is�:���:�ԅ@MU����؜
                                          �i1B���#��6���ׂm�D(�t#/���	�ہ�������ݬ>(�>�^@�C��3�ӸMQт�O%
    // 通过公钥解密数据
    $ openssl rsautl -verify -in enc.bin -inkey publick.pem -pubin -out dec.bin
    // 已成功解密,正确显示文件内容
    $ cat dec.bin
     hello Vincent!!!
    
    RSA用途及特点

    到这里,大家都知道RSA通过数学算法来加密和解密,效率比较低,所以一般RSA的主战场是加密比较小的数据,比如对大数据进行对称加密,再用RSA给对称加密的KEY进行加密,或者加密Hash值,也就是数字签名。

    关于RSA数字签名后面再慢慢阐述。该文章为记录本人的学习路程,希望能够帮助大家,也欢迎大家点赞留言交流!!!https://mp.csdn.net/mdeditor/85228078#

    展开全文
  • RSA加密原理与过程

    2017-09-10 22:24:13
    RSA加解密原理 C#实现 JAVA实现

    一、基本的数学概念与理论

    1. 最大公因数,又叫最大公约数,是指两个或多个整数共有约数中最大的一个,使用符号gcd来表示,例如gcd(a,b)表示a和b的最大公约数。
    2. 欧几里得算法又称辗转相除法,用于计算两个整数的最大公约数,公式表示为gcd(a,b)=gcd(b,a mod b)。
    3. 欧几里得扩展算法,对于不完全为 0 的非负整数 a,b,必然存在存在整数对 x,y ,使得 gcd(a,b)=ax+by。
    4. 最小公倍数,两个或多个整数公有的倍数叫做它们的公倍数,其中除0以为最小的一个公倍数就叫做这几个整数最小公倍数,使用符号lcm来表示,例如lcm(a,b)表示,a和b的最小公倍数。
    5. 质数,又称为素数,是指只能被1或自身整除的正整数。如果整数a和b的最大公约数为1,也就是gcd(a,b)=1,则称a和b互质。
    6. 同余,使用符号≡表示,假设m是大于1的正整数,a和b是整数,如果m|(a-b),则称a与b关于模m同余,记做a≡b(mod m),读作a同余于b模m。
    7. 模反元素,如果两个正整数a和n互质,那么一定能知道整数b,使得ab≡1(mod n),那么我们称b为a关于模n的模反元素。
    8. 欧拉函数,在数论中,对正整数n,小于n的正整数中与n互质的数目称为欧拉函数,使用符号φ(n)来表示。
    9. 费马小引理,假设a为不能被质数p整除的正整数,则必有a^(p-1)=1(mod p)。
    10. 欧拉定理又叫费马欧拉定理,假设a和n都是正整数,并且gcd(a,n)=1,则存在a^φ(n)≡1(mod n)。
    11. 中国余数理论(CRT),假设p和q是两个不同的质数,n=pq,对于任意两个数x1,x2,其中0 ≤ x1 < p, 0 ≤ x2 < q,必然存在唯一的数x,使得 x1 = x mod p 并且 x2 = x mod q。
    12. 算数基本定理又叫正整数唯一分解定理,对于任意自然数n(n>=2),均可分解为质数的乘积,如果不考虑排列顺序,该分解是唯一的。

    二、RSA加密算法概要

    非对称加密又叫公开秘钥加密,需要两个秘钥:公开秘钥(publickKey)和私有秘钥(privateKey)。公钥与私钥是一对儿,私钥由公钥决定,一般使用公钥加密,私钥解密,当然使用私钥加密,使用公钥解密也可以,但因为公钥是公开的,失去了加密的的意义。
    RSA加密算法,是非对称加密的一种实现,是基于一个简单的数论事实,即将两个大的质数相乘非常容易,但是想要对其乘积进行因式分解为两个大的质数缺非常困难,因此可以将乘积公开作为加密秘钥,使用公式表示为(m^e)^d≡m(mod n),m表示消息,(n,e)表示公钥,(n,d)表示私钥,根据初等数论,即使知道e,n也很难推导出d。

    三、RSA秘钥生成步骤

    1. 选取两个大的质数p和q,出于安全考虑p和q都要随机产生,并且足够大位数也要有差别。
    2. 计算n=pq,n被用做公钥和私钥的模数。一般以n的二进制表示的位数作为秘钥的长度。
    3. 计算欧拉函数φ(n)=(p-1)(q-1)。
    4. 选取一个整数e,使得e大于1小于 φ(n)并且gcd(e,φ(n))=1,也就是说e要与φ(n)互质。
    5. 计算d使得d*e≡ 1 (mod φ(n))。
    6. 使用(n,e)作为公钥,(n,d)作为私钥。

    四、加密

    假设M代表要加密的密文,需要将M转换为一个大数m,使用公钥(n,e)加密,加密后的密文用c来表示,公式表示如下:c≡m^e(mod n)

    五、解密

    使用私钥(n,d)来解密,公式表示如下:c^d≡(m^e)^d≡m(mod n)

    六、例子

    1. 选取p=61,q=53
    2. 计算n=61*53=3233
    3. 计算欧拉函数φ(n)=(61-1)(53-1)=3120
    4. 选取一个数e,取自范围为(1,3120),并且要与3120互质,这里选取e=17
    5. 计算d,d*17≡1(mod 3120),根据欧几里得扩展算法,得到d等于2753
    6. 公钥加密c=m^17(mod 3233),假设m取65,c=65^17(mod 3233)=2790
    7. 私钥解密c^d≡2790^2753≡m^17^2790≡m(mod 3233)。

    七、使用中国余数定理加快解密过程

    1. d mod (p-1) =2753 mod (61-1)=53,使用符号dp表示
    2. d mod(q-1)=2753 mod (53-1)=49,使用符号dq表示
    3. q^-1 mod p = 53 ^ -1 mod 61 = 38,使用符号qinv来表示,其实就是q的关于模p的模反元素。通过模反元素可以得到(qinv * q) mod p = 38 * 53 mod 61 = 1。下面是使用这些常数来计算m的过程:
    m1 = c^dp mod p = 2790^53 mod 61 = 4;
    m2 = c^dq mod q = 2790^49 mod 53 = 12;
    h = (qinv * (m1 - m2)) mod p = (38 * -8) mod 61 = 1;
    m = m2 + h * q = 17 + 1 * 53 = 65

    上面的加解密可以使用欧拉定理和费马费马小引理来证明,这里不给出证明过程。
    我们在RSA算法过程称中使用到的有如下量:

    变量 说明
    d the private exponent
    dp d mod (p-1)
    dq d mod (q-1)
    e the public exponent
    qinv q^-1 mod p
    n modulus
    p prime 1
    q prime 2

    以下是以C#生成的私钥钥,Modulus节点是n,Exponent节点代表e,由n和e构成公钥,
    InverseQ表示qinv,其他都与小写的对应,节点内部都是对大数的字符串表示进行base64的加密。

    <RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D>
    </RSAKeyValue>

    八、C#RSA加密代码实现

    using System;
    using System.Security.Cryptography;
    using System.Text;
    using System.Xml;
    using Org.BouncyCastle.Asn1.Pkcs;
    using Org.BouncyCastle.Crypto;
    using Org.BouncyCastle.Crypto.Encodings;
    using Org.BouncyCastle.Crypto.Engines;
    using Org.BouncyCastle.Crypto.Parameters;
    using Org.BouncyCastle.Math;
    using Org.BouncyCastle.Pkcs;
    using Org.BouncyCastle.Security;
    
    namespace RSATest
    {   
        // 下面的key都必须是xml格式
        class RSAUtils
        {
            public void GetRSAKeyPair(ref string privateKey, ref string publicKey)
            {
                RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
                privateKey = rsaProvider.ToXmlString(true);
                publicKey = rsaProvider.ToXmlString(false);
            }
    
            //C#默认只能使用[公钥]进行加密
            public string EncryptByPublicKey(string publicKey, string data)
            {
                RSACryptoServiceProvider rsaPublic = new RSACryptoServiceProvider();
                rsaPublic.FromXmlString(publicKey);
    
                byte[] publicValue = rsaPublic.Encrypt(Encoding.UTF8.GetBytes(data), false);
                return Convert.ToBase64String(publicValue); 
            }
    
            //C#默认只能使用[私钥]进行解密
            public string DecryptByPrivateKey(string privateKey, string data)
            {
                RSACryptoServiceProvider rsaPrivate = new RSACryptoServiceProvider();
                rsaPrivate.FromXmlString(privateKey);
                byte[] privateValue = rsaPrivate.Decrypt(Convert.FromBase64String(data), false);
                return Encoding.UTF8.GetString(privateValue);
            }
    
            // 使用第三方组件进行私钥加密
            public string EncryptByPrivateKey(string privateKey, string data)
            {
                RSACryptoServiceProvider privateRsa = new RSACryptoServiceProvider();
                privateRsa.FromXmlString(privateKey);
                AsymmetricCipherKeyPair keyPair = DotNetUtilities.GetKeyPair(privateRsa);
    
                IBufferedCipher cipher = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");
                cipher.Init(true, keyPair.Private);
    
                byte[] dataToEncrypt = Encoding.UTF8.GetBytes(data);
                byte[] outBytes = cipher.DoFinal(dataToEncrypt); 
                return Convert.ToBase64String(outBytes);
            }
    
            // 使用第三方组件公钥解密
            public string DecryptByPublicKey(string publicKey, string data)
            {
                RSACryptoServiceProvider rsaPublic = new RSACryptoServiceProvider();
                rsaPublic.FromXmlString(publicKey);
                RSAParameters rsaParameters = rsaPublic.ExportParameters(false);
                BigInteger biModulus = new BigInteger(1, rsaParameters.Modulus);
                BigInteger biExponent = new BigInteger(1, rsaParameters.Exponent);
                RsaKeyParameters publicParameters = new RsaKeyParameters(false, biModulus, biExponent);
                IAsymmetricBlockCipher eng = new Pkcs1Encoding(new RsaEngine());
                eng.Init(false, publicParameters);
                byte[] encryptedData = Convert.FromBase64String(data);
                encryptedData = eng.ProcessBlock(encryptedData, 0, encryptedData.Length);
                return Encoding.UTF8.GetString(encryptedData, 0, encryptedData.Length);
            }
            // C#格式秘钥转java格式
            public string RSAPrivateKeyDotNet2Java(string privateKey)
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(privateKey);
                if (doc.DocumentElement == null)
                    return null;
    
                BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
                BigInteger exp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
                BigInteger d = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));
                BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));
                BigInteger q = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));
                BigInteger dp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));
                BigInteger dq = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));
                BigInteger qinv = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText));
    
                RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);
    
                PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);
                byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();
                return Convert.ToBase64String(serializedPrivateBytes);
            }
        }
    }
    
    展开全文
  • linux 无密码登录 rsa加密原理

    千次阅读 2016-12-20 18:21:51
    linux的无密码登录,利用RSA加密原理。 使用rsa生成公钥和私钥。 可以理解为:公钥是锁放在被登录的服务器上,私钥是钥匙放在客户端。锁和钥匙匹配就可以登录。 1 安装相关软件:  yum install ssh  ssh里包含ssh...
    linux的无密码登录,利用RSA加密原理。
    使用rsa生成公钥和私钥。
    可以理解为:公钥是锁放在被登录的服务器上,私钥是钥匙放在客户端。锁和钥匙匹配就可以登录。
    1 安装相关软件:   
      yum install ssh
       ssh里包含ssh和ssh-keygen
    2 在客户机生成公钥和私钥
       cd ~/.ssh/
       ssh-keygen -t rsa (默认3次回车)
       生成:id_rsa.pub(公钥-锁) 和 id_rsa(私钥-钥匙)
    3 将公钥放的被登录机器:
       cd ~/.ssh/
       如果没有authorized_keys,创建并设置权限。
       touch authorized_keys 
       chmod 600 authorized_keys (必须是600)
       cat id_rsa.pub >> authorized_keys
       如果拷贝id_rsa.pub到authorized_keys(注意可能会多拷贝回车,可以拷贝编辑器检查一下)
    4 登录服务器:  
      ssh root@ip 
    5 文件介绍;
       客户机端:
          id_rsa.pub(公钥-锁) 
          id_rsa(私钥-钥匙)
          known_hosts
    (记录链接到对方时,对方给的hostkey,连线会检查目前对方给的hostkey 与记录的hostkey是否相同,进行简单的验证)
        被登录机端:
             authorized_keys (被登录机的公钥放置文件--锁的位置,可能会有多个锁)
    展开全文
  • 非对称密钥体制&RSA加密原理

    千次阅读 2016-12-10 18:58:12
    非对称密钥加密概述  前面讲述了对称密钥加密体制。使用对称密钥加密体制进行保密通信时,任意不同的两个用户之间都应该使用互不相同的密钥。这样,如果一个网络中有n个用户,他们之间彼此都可能进行秘密通信,...
  • #include<stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> //质数判定函数 intlong IsPrime(intlong n) { int i=2; int m=sqrt(n); if(n<... for(i=...
  • RSA 加密算法原理简述

    万次阅读 2018-07-23 22:32:42
    本文旨在说明RSA加密算法的原理及实现,而其相关的数学部分的证明则不是本文内容。 版权说明 著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:Q-WHai 发表日期: 2016年2月29...
  • RSA加密算法原理

    千次阅读 2019-10-08 00:58:01
    一、什么是RSA加密算法: 二、RSA加密过程: 三、RAS解密过程: 四、生成密钥对: 五、实践: 六、Java进行 RSA 加解密时不得不考虑到的那些事儿: 一、什么是RSA加密算法: RSA加密算法是一种非对称加密算法...
  • RSA加密原理——为什么被公钥加密的可以被私钥解密? 目录 一,RSA 数学理论基础 二,RSA实现原理 三,RSA加密的过程 四,参考文献 引言 在密码学最开始,都是使用的普通加密模式 A 用加密...
  • RSA加密解密原理深度剖析:请参考作者原文:http://www.freebuf.com/articles/others-articles/166049.html
  • 轻松学习RSA加密算法原理

    万次阅读 多人点赞 2013-09-24 23:54:57
    http://blog.csdn.net/q376420785/article/details/8557266 ... ...以前也接触过RSA加密算法,感觉这个东西太神秘了,是数学家的事,和我无关。但是,看了很多关于RSA加密算法原理的资料之后,我发现其
  • 非对称加密 RSA加密算法原理简述

    千次阅读 2016-10-24 08:54:20
    非对称加密是与对称加密完全相反的概念,对称加密指的是加密解密使用的是同样的密钥Key,如流加密,块加密,一次性密码本之类的。而非对称加密,使用加密Key叫公钥,解密用的是私钥。 至于为什么要这样做呢?因为...
  • RSA算法是一种很经典的非对称性算法,所谓的非对称性加密即指的是任何一个人都有两个密钥,一个公钥(别人可以知道),一个私钥(只有自己知道),非对称性加密在能保证信息安全的前提下,相比于对称性加密能极大地...
  • RSA加密算法原理及RES签名算法简介

    万次阅读 2014-11-28 15:00:42
    一、RSA加密过程简述 A和B进行加密通信时,B首先要生成一对密钥。一个是公钥,给A,B自己持有私钥。A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密内容。 二、RSA加密算法基础 整个R...
  • RSA加密算法原理和java简单实现

    千次阅读 2016-06-06 11:17:07
     RSA加密算法中,用到素数、互质数、指数运算、模运算等几个数学知识。 素数  素数又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。 互质数  百度百科:公因数只有1...
  • 一.RSA算法的数学理论依据 1. 费尔玛(Fermat)定理 2.欧拉函数 3.欧拉定理
  • RSA加密算法的基本原理

    千次阅读 2012-11-12 12:26:10
    1978年 RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们...
  • RSA加密算法是一种非对称加密算法,目前被广泛应用。本文介绍RSA算法的基本原理和破解方法。”RSA在互联网上被广泛应用,典型的如各个网站的证书。很多应用数据的加密也...
  • 公钥、私钥、数字签名和RSA加密算法一、前言信息安全从古至今,从中到外都是非常重要的事情。从我理解数据的安全可以从从两个方面讲: 正确数据内容只让所期望的接受者得到,其他人无法获取或者获取后也无法获得...
  • RSA加密算法中的数学原理

    千次阅读 2018-07-23 11:22:38
    RSA加密算法是非对称加密算法中的一种,在1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的,并取三人名字的首字母命名该算法。 RSA加密算法因...
  • RSA算法原理——(1)目前常见加密算法简介

    万次阅读 多人点赞 2018-06-18 21:50:53
    文章可能会稍微有点长,但是内容绝对是目前全网最详细的,最通俗易懂的,跟着昌昌来一起揭开RSA非对称加密算法的面纱,保你看完本篇文章之后可以说:RSA just so so! 一、常见加密算法 目前常见的加密算法可以分成...
  • 今天在原来的系统上增加网页操作的功能,原来系统是JAVA写的,数据传输用的是RSA加密,为了实现网页登录,研究了javascript的RSA加密方法。 这个系统是一个移动电话会议系统,是手机上就能发起电话会议的为数不多...

空空如也

1 2 3 4 5 ... 20
收藏数 55,900
精华内容 22,360
关键字:

rsa加密原理