rsa中文加密
rsa加密算法如下:
算法原理:
RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥
B. RSA加密算法的内容是怎样的
1) 确定密钥的宽度。
2) 随机选择两个不同的素数p处q,它们的宽度是密钥宽度的二分之一。
3) 计算出p和q的乘积n 。
4) 在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e用做加密密钥(其中Φ(n)=(p-1)*(q-1))。
5) 从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。
6) 得公钥(e ,n ), 私钥 (d , n) 。
7) 公开公钥,但不公开私钥。
8) 将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为:
C = P^e mod n
9) 将密文C解密为明文P,计算方法为:
P = C^d mod n
然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密
C. RSA加解密原理以及三种填充模式
如果需要理解RSA的加密原理,需要理解以下理论:
等同于求一元二次方程 23 * d + 192 * y = 1
可以求得其中一解为(d=167,y=-20)
至此就完成了所有的计算
对于上述例子的到公钥(221,23)和私钥(221,167)
在上述的计算过程中一共用到了
上面用到的数中只有公钥部分是公开的,即(221,23)。那么我们是否可以通过公钥来推到出私钥部分,即已知n和e,推到出d?
(1)ed 1(mod (n)),只有知道 (n)才能解出d
(2) (n)= (p) (q)= (p-1) (q-1),只有知道p和q才能得到 (n)
(3)n=p q,就需要对n进行因式分解
那么如果可以对n因式分解就可以求出d,也就意味着私匙被破解
那么RSA加密的可靠性就在于对n因式分解的难度,而现在对一个整数n做因式分解并没有巧妙的算法,只有通过暴力破解计算。在实际应用中的n取值通常在1024位以上,而公开已知的可因式分解的最大数为768位。所以现阶段来说RSA加密是可靠的。
现在我们就可以进行加密和解密了
我们使用上面生成的公钥(221,23)来加密。如果我们需要加密的信息是m( m必须为整数并且m要小于n ),m取56,可以用以下公式求出加密串c:
c (mod n)
10 (mod 221)
可以求出加密后的结果c为10
密钥为(221,167),加密结果c=10,可以使用以下公式求出被加密的信息
m (mod n) 即加密结果的d次方除以n的余数为m
56 (mod 221)
RSA加密属于块加密算法,总是在一个固定长度的块上进行操作。如果被加密的字符串过长,则需要对字符串进行切割,如果字符串过短则需要进行填充。
以下主介绍一下RSA_PKCS1_PADDING填充模式以及RSA_NO_PADDING模式
此填充模式是最常用的填充模式,在此填充模式下输入的长度受加密钥的长度限制,输入的最大长度为加密钥的位数k-11。如果公钥的长度为1024位即128字节,那么输入的长度最多为128-11=117字节。如果长度小于117就需要填充。如果输入T的长度为55字节,填充后的块为EM,则EM格式如下:
EM= 0x00 || BT || PS || 0x00 || T
在此填充模式下,输入的长度最多和RSA公钥长度一样长,如果小于公钥长度则会在前面填充0x00。如果公钥长度是128字节,输入T的长度为55字节,填充后的块为EM,则EM格式如下:
EM=P || T
参考:
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
https://my.oschina.net/3pgp/blog/749195
D. RSA公钥加密是什么意思
RSA公钥密码是1977年由Ron Rivest、Adi Shamirh和LenAdleman在MIT(美国麻省理工学院〉开发的,1978年首次公布[RIVE78]。它是目前最有影响的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击。目前它已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想分解它们的乘积却极端困难,因此可以将乘积公开作为加密密钥。
RSA的算法结构相当简单,整个算法可以描述如下:
(1)选取两个大素数p和q(保密);
(2)计算n=pq(公开),γ=(p一1〉(q-1)(保密);
(3)随机选取整数e(公开,加密密钥),使得ed(ear)=1
(4)计算d(保密,私人密钥),使得ed≡1(mod r),即d=e-1(mod r);
(5)加密:c=me mod n
(6)解密:m=cd mod n。
利用RSA对被加密的信息m (长度小于log2n的整数)进行加密得到相应的密文c=me mod n;解密算法则是计算m=cd modn RSA的优点是不需要密钥分配,但缺点是速度慢。
E. RSA算法加密
RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法,于1978年由美国麻省理工学院(MIT)的三位学着:Ron Rivest、Adi Shamir 和 Leonard Adleman 共同提出。
它的原理较为简单,假设有消息发送方A和消息接收方B,通过下面的几个步骤,就可以完成消息的加密传递:
消息发送方A在本地构建密钥对,公钥和私钥;
消息发送方A将产生的公钥发送给消息接收方B;
B向A发送数据时,通过公钥进行加密,A接收到数据后通过私钥进行解密,完成一次通信;
反之,A向B发送数据时,通过私钥对数据进行加密,B接收到数据后通过公钥进行解密。
由于公钥是消息发送方A暴露给消息接收方B的,所以这种方式也存在一定的安全隐患,如果公钥在数据传输过程中泄漏,则A通过私钥加密的数据就可能被解密。
如果要建立更安全的加密消息传递模型,需要消息发送方和消息接收方各构建一套密钥对,并分别将各自的公钥暴露给对方,在进行消息传递时,A通过B的公钥对数据加密,B接收到消息通过B的私钥进行解密,反之,B通过A的公钥进行加密,A接收到消息后通过A的私钥进行解密。
当然,这种方式可能存在数据传递被模拟的隐患,但可以通过数字签名等技术进行安全性的进一步提升。由于存在多次的非对称加解密,这种方式带来的效率问题也更加严重。
F. RSA加密原理
RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。公钥加密--私钥解密,私钥加密--公钥解密
在 整数 中, 离散对数 是一种基于 同余 运算和 原根 的一种 对数 运算。而在实数中对数的定义 log b a 是指对于给定的 a 和 b ,有一个数 x ,使得 b x = a 。相同地在任何群 G 中可为所有整数 k 定义一个幂数为 b K ,而 离散对数 log b a 是指使得 b K = a 的整数 k 。
当3为17的 原根 时,我们会发现一个规律
对 正整数 n,欧拉函数是小于或等于n的正整数中与n 互质 的数的数目(因此φ(1)=1)。有以下几个特点
服务端根据生成一个随机数15,根据 3 15 mod 17 计算出6,服务端将6传递给客户端,客户端生成一个随机数13,根据 3 13 mod 17 计算出12后,将12再传回给服务端,客户端收到服务端传递的6后,根据 6 13 mod 17 计算出 10 ,服务端收到客户端传递的12后,根据 12 15 mod 17 计算出 10 ,我们会发现我们通过 迪菲赫尔曼密钥交换 将 10 进行了加密传递
说明:
安全性:
除了 公钥 用到 n 和 e ,其余的4个数字是 不公开 的(p1、p2、φ(n)、d)
目前破解RSA得到的方式如下:
缺点
RSA加密 效率不高 ,因为是纯粹的数学算法,大数据不适合RSA加密,所以我们在加密大数据的时候,我们先用 对称加密 算法加密大数据得到 KEY ,然后再用 RSA 加密 KEY ,再把大数据和KEY一起进行传递
因为Mac系统内置了OpenSSL(开源加密库),所以我们开源直接在终端进行RSA加密解密
生成RSA私钥,密钥名为private.pem,密钥长度为1024bit
因为在iOS中是无法使用 .pem 文件进行加密和解密的,需要进行下面几个步骤
生成一个10年期限的crt证书
crt证书格式转换成der证书
G. java给汉字进行RSA加密
类似的,楼上说的针对一个汉字的写法也没错。
假如是RSA,应该使用BigDecimal函数来做。
那么,把字符串按照某一编码格式进行转换成byte [] ,然后使用BigDecimal转换成大整数,就能进行RSA计算了。
String 转 byte [] 方法是String.getBytes (字符集) 字符集可能是“UTF-16” 或者汉字的“GBK” 。
H. rsa算法原理
RSA算法是最常用的非对称加密算法,它既能用于加密,也能用于数字签名。RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积。
我们可以通过一个简单的例子来理解RSA的工作原理。为了便于计算。在以下实例中只选取小数值的素数p,q,以及e,假设用户A需要将明文“key”通过RSA加密后传递给用户B,过程如下:设计公私密钥(e,n)和(d,n)。
令p=3,q=11,得出n=p×q=3×11=33;f(n)=(p-1)(q-1)=2×10=20;取e=3,(3与20互质)则e×d≡1 mod f(n),即3×d≡1 mod 20。通过试算我们找到,当d=7时,e×d≡1 mod f(n)同余等式成立。因此,可令d=7。从而我们可以设计出一对公私密钥,加密密钥(公钥)为:KU =(e,n)=(3,33),解密密钥(私钥)为:KR =(d,n)=(7,33)。
英文数字化。将明文信息数字化,并将每块两个数字分组。假定明文英文字母编码表为按字母顺序排列数值。则得到分组后的key的明文信息为:11,05,25。
明文加密。用户加密密钥(3,33) 将数字化明文分组信息加密成密文。由C≡Me(mod n)得:
C1(密文)≡M1(明文)^e (mod n) == 11≡11^3 mod 33 ;
C2(密文)≡M2(明文)^e (mod n) == 26≡05^3 mod 33;
C3(密文)≡M3(明文)^e (mod n) == 16≡25^3 mod 33;
所以密文为11.26.16。
密文解密。用户B收到密文,若将其解密,只需要计算,即:
M1(明文)≡C1(密文)^d (mod n) == 11≡11^7 mod 33;
M2(明文)≡C2(密文)^d (mod n) == 05≡26^7 mod 33;
M3(明文)≡C3(密文)^d (mod n) == 25≡16^7 mod 33;
转成明文11.05.25。根据上面的编码表将其转换为英文,我们又得到了恢复后的原文“key”。
当然,实际运用要比这复杂得多,由于RSA算法的公钥私钥的长度(模长度)要到1024位甚至2048位才能保证安全,因此,p、q、e的选取、公钥私钥的生成,加密解密模指数运算都有一定的计算程序,需要仰仗计算机高速完成。
I. 关于RSA对汉字加密乱码的问题
可能与你采用的字符编码有关,不同的编码在处理时会有不同的处理,有可能是将一个汉字计做了一个字符,导致数据的错误。建议先将你的数据转码为多字节进行RSA加密处理,解密后再还原为你原来的编码(如UNICODE)。
J. RSA加密原理概述
欧拉函数通式: 若a可以写成 a=P1^α1...Pn^αn,其中P1...Pn为素数,α1...αn为正整数,则我们有
φ(a) = (P1^(α1-1))(P1-1)...(Pn^(αn-1))(Pn-1),由此我们可得二元一次情况下的化简,若a = pq(pq均为素数),有φ(a) =(p-1)(q-1)
欧拉定理:(a,m)= 1时,a^φ(m) = 1(modm)
//上述定理参见初等数论2第8-14页。
若a,b是两个互素的正整数,一定存在两个数x,y使得ax+by=1,这里因为xy可以做正负变化,所以写成ax-by = 1也行
即,若a,b>0且(a,b)= 1,一定存在两个数使 ax = 1(modb)
//参见初等数论1第45页
a=b(modm)时,有a^n=b^n(modm)
//初等数论1第58页
我们取两个大素数pq,并令他们的积为模数n。
根据通式,我们有φ(n) =(p-1)(q-1)
取与φ(n)互素且小于φ(n)的公钥e,则一定存在e的逆元d使得 ed = 1(modφ(n)),取d为私钥
假设我们需要给消息M加密,我们的消息M必须与n互素,又由于n=pq,M只需要小于n且不等于p或者q即可。
加密时,我们求得加密数 C1 = M^e(modn)
解密时,我们求得解密数 C2 = C1^d(modn)
所以加密时,我们需要<e,n>对,而解密时,我们需要<d,n>对。
我们将要来证明C2=M:
因为 (M^e(modn))^d = M^ed(modn),所以有 C2 = M^ed(modn),
因为ed = 1+ kφ(n),所以有C2 = M^(1+kφ(n))(modn ) = M*(M^φ(n))^k(modn)
因为欧拉定理有M^φ(n) = 1(modn),所以C2 = M(modn),又因为C2与M运算过程中恒小于n,所以C2=M。
总结一下 C2 = C1^d(modn) = M^ed(modn) = M^(1+kφ(n))(modn) = M(modn)。
而秘钥运算的条件是,e与φ(n)互素,且M与n互素。
公钥和私钥是一对一的关系,因为私钥取的是公钥关于模数n的1(modφ(n))的逆元,所以公私钥是一对一的关系,不管公钥还是私钥改变,逆元一定会跟着改变。
虽然公钥和私钥都可以通过增加n的整数倍使其对n的余数不变,但是同余的新公钥是没有意义的,因为n是暴露在公钥里的。