分类: 电脑/网络 >> 互联网
解析:
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)(q-1)互质;再选择e2,要求(e2e1)mod((p-1)(q-1))=1。
(n及e1),(n及e2)就是密钥对。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;
e1和e2可以互换使用,即:
A=B^e2 mod n;B=A^e1 mod n;
补充回答:
对明文进行加密,有两种情况需要这样作:
1、您向朋友传送加密数据,您希望只有您的朋友可以解密,这样的话,您需要首先获取您朋友的密钥对中公开的那一个密钥,e及n。然后用这个密钥进行加密,这样密文只有您的朋友可以解密,因为对应的私钥只有您朋友拥有。
2、您向朋友传送一段数据附加您的数字签名,您需要对您的数据进行MD5之类的运算以取得数据的"指纹",再对"指纹"进行加密,加密将使用您自己的密钥对中的不公开的私钥。您的朋友收到数据后,用同样的运算获得数据指纹,再用您的公钥对加密指纹进行解密,比较解密结果与他自己计算出来的指纹是否一致,即可确定数据是否的确是您发送的、以及在传输过程中是否被篡改。
密钥的获得,通常由某个机构颁发(如CA中心),当然也可以由您自己创建密钥,但这样作,您的密钥并不具有权威性。
计算方面,按公式计算就行了,如果您的加密强度为1024位,则结果会在有效数据前面补0以补齐不足的位数。补入的0并不影响解密运算。
在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。
公钥用来给数据加密,用公钥加密的数据只能使用私钥解密
用来解密公钥加密的数据。
对需要传输的文本,做一个HASH计算,一般采用SHA1,SHA2来获得
使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名。
数据接收端,拿到传输文本,但是需要确认该文本是否就是发送发出的内容,中途是否曾经被篡改。因此拿自己持有的公钥对签名进行解密(密钥对中的一种密钥加密的数据必定能使用另一种密钥解密。),得到了文本的摘要,然后使用与发送方同样的HASH算法计算摘要值,再与解密得到的摘要做对比,发现二者完全一致,则说明文本没有被篡改过。
是将数据资料加密,使得非法用户即使取得加密过的资料,也无法获取正确的资料内容,所以数据加密可以保护数据,防止监听攻击。其重点在于数据的安全性。
公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:
1、客户端生成RSA公钥和私钥
2、客户端将自己的公钥存放到服务器
3、客户端请求连接服务器,服务器将一个随机字符串加密后发送给客户端
4、客户端根据自己的私钥解密这个随机字符串之后再发送给服务器
5、服务器接受到字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。
进入用户目录下ssh目录:
id_rsa:私钥文件
id_rsapub:公钥文件
authorized_keys: 保存其他公钥的的文件
known_hosts: 已经建立过连接的服务器信息,可以清空。
1执行命令:
此时会重新生成id_rsa私钥文件和id_rsapub公钥文件
用户将公钥发送给其他服务器,其他服务器将接受的公钥保存在authorized_keys里面。持有私钥的用户就可以登录服务器(authorized_keys存放自己的公钥,用户便可以使用私钥从其他的地方登录服务器)。
2将公钥导入到vps
3修改SSHD的配置文件/etc/ssh/sshd_config
4重启SSH后进行测试
p 和 q:两个大的质数,是另一个参数N的的两个因子。
N:大整数,可以称之为模数
e 和 d:互为无反数的两个指数
c 和 m:密文和明文
(N, e):公钥
(N, d):私钥
pow(x, y, z):效果等效pow(x, y)1 % z, 先计算x的y次方,如果存在另一个参数z,需要再对结果进行取模。
密钥长度:n以二进制表示的的位数,例如密钥长度为512代表n用二进制表示的长度为512bit。
对于RSA加密算法,公钥(N, e)为公钥,可以任意公开,破解RSA最直接(亦或是暴力)的方法就是分解整数N,然后计算欧拉函数φ(n)=(p-1) (q-1),再通过d e ≡ 1 mod φ(N),即可计算出 d,然后就可以使用私钥(N, d)通过m = pow(c,d,N)解密明文。
直接分解模数N是最直接的攻击方法,也是最困难的方法。具体的解析同上RSA安全性分析。
如果n小于256bit,可以使用本地工具进行暴力分解,例如windwods平台的RSATool,可以在数分钟之内完成256bit的n的分解。
如果n大于768bit,可以尝试利用在线网站 >
RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制 。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK 。
正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要 。
RSA算法是一个广泛使用的公钥算法。其密钥包括公钥和私钥。它能用于数字签名、身份认证以及密钥交换。RSA密钥长度一般使用1024位或者更高。RSA密钥信息主要包括:
n:模数
e:公钥指数
d:私钥指数
p:最初的大素数
q:最初的大素数
其中,公钥为n和e;私钥为n和d。
本文假设你已经安装好了OpenSSL,并且持有一份111的源码。
RSA相关的头文件在rsah中、源文件在crypto/rsa目录中。
这个结构定义了RSA内部数据信息。主要字段含义:
version —— 版本。
meth —— RSA运算抽象方法集合。
n,e,d,p,q,dmp1,dmq1,iqmp —— 密钥相关的大数。
这个结构定义了RSA内部各种运算抽象方法集合。主要字段含义:
name —— 名称描述。
rsa_pub_enc —— 公钥加密方法。
rsa_pub_dec —— 公钥解密方法。
rsa_priv_enc —— 私钥加密方法。
rsa_priv_dec —— 公钥解密方法。
rsa_sign —— 签名方法。
rsa_verify —— 验签方法。
rsa_keygen —— 生成密钥对方法。
在111中,大多数的数据结构已经不再向使用者开放,从封装的角度来看,这是更合理的。如果你在头文件中找不到结构定义,不妨去源码中搜一搜。
RSA RSA_new(void);
生成一个RSA密钥结构,采用默认的rsa_pkcs1_ossl_meth方法。
void RSA_free(RSA r);
释放RSA结构。
RSA RSA_generate_key(int bits, unsigned long e, void (callback) (int, int, void ), void cb_arg);
生成RSA密钥(旧版本)。
bits为密钥位数,e为公钥指数。
callback为密钥生成过程中的干预回调函数,通常传入NULL。cb_arg为回调参数。
成功返回RSA指针,失败返回NULL。
int RSA_generate_key_ex(RSA rsa, int bits, BIGNUM e, BN_GENCB cb);
生成RSA密钥(新版本)。
rsa为RSA对象指针。bits为密钥位置,e为公钥指数的大数形式指针。cb为干预回调函数,通常传入NULL。
成功返回1,失败返回0。
关于公钥指数e,主要有两个取值:
# define RSA_3 0x3L
# define RSA_F4 0x10001L
RSA RSAPublicKey_dup(RSA rsa);
复制RSA公钥部分。
成功返回RSA指针,失败返回NULL。
RSA RSAPrivateKey_dup(RSA rsa);
复制RSA私钥部分。
成功返回RSA指针,失败返回NULL。
int RSA_bits(const RSA rsa);
获取RSA密钥位数。
int RSA_size(const RSA rsa);
获取RSA密钥长度。
int RSA_check_key(const RSA );
int RSA_check_key_ex(const RSA , BN_GENCB cb);
检查RSA的有效性,必须为完整的密钥对。
成功返回1,失败返回0。
int RSA_print(BIO bp, const RSA r, int offset);
int RSA_print_fp(FILE fp, const RSA r, int offset);
将RSA信息输出到bp/fp中,off为输出信息在bp/fp中的偏移量,比如是屏幕bp/fp,则表示打印信息的位置离左边屏幕边缘的距离。
int RSA_public_encrypt(int flen, const unsigned char from,
unsigned char to, RSA rsa, int padding);
RSA公钥加密。
成功返回密文的长度,失败返回-1。
int RSA_public_decrypt(int flen, const unsigned char from,
unsigned char to, RSA rsa, int padding);
RSA公钥解密。
成功返回明文的长度,失败返回-1。
int RSA_private_encrypt(int flen, const unsigned char from,
unsigned char to, RSA rsa, int padding);
RSA私钥加密。
成功返回密文的长度,失败返回-1。
int RSA_private_decrypt(int flen, const unsigned char from,
unsigned char to, RSA rsa, int padding);
RSA私钥解密。
成功返回明文的长度,失败返回-1。
关于padding填充方式,取值:
其中PKCS1填充大小为11字节,所以加密明文长度必须不大于(密钥大小-11字节)。
# define RSA_PKCS1_PADDING_SIZE 11
int RSA_sign(int type, const unsigned char m, unsigned int m_length,
unsigned char sigret, unsigned int siglen, RSA rsa);
对数据m生成RSA签名,生成的签名长度与key的长度相同,如512位密钥生成64字节签名。
type指定摘要算法的NID,如NID_sha1。
成功返回1,失败返回0。
int RSA_verify(int type, const unsigned char m, unsigned int m_length,
const unsigned char sigbuf, unsigned int siglen, RSA rsa);
对数据m验证RSA签名。
type指定摘要算法的NID,如NID_sha1。
成功返回1,失败返回0。
以下函数在x509h中定义:
int i2d_RSAPrivateKey_bio(BIO bp, RSA rsa)
{
return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
}
将RSA公钥转换为DER编码,并写入到bp抽象IO中。
成功返回1,失败返回0。
RSA d2i_RSAPrivateKey_bio(BIO bp, RSA rsa)
{
return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
}
从bp抽象IO中读取DER编码,并转换为rsa结构私钥。
成功返回有效指定,失败返回NULL。
int i2d_RSAPublicKey_bio(BIO bp, RSA rsa)
{
return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
}
将RSA公钥转换为DER编码,并写入到bp抽象IO中。
成功返回1,失败返回0。
RSA d2i_RSAPublicKey_bio(BIO bp, RSA rsa)
{
return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
}
从bp抽象IO中读取DER编码,并转换为rsa结构公钥。
成功返回有效指定,失败返回NULL。
下面这个例子演示了RSA密钥对的生成、公私钥的复制、公钥加密和私钥解密的用法。
输出:
下面这个例子演示了公私钥的分开保存、读取,以及使用公私钥加解密。
输出:
RSA_generate_key_ex() ret:1
i2d_RSAPrivateKey_bio() ret:1
i2d_RSAPublicKey_bio() ret:1
copy' private key size:64
copy' public key size:64
RSA_public_encrypt() ret:64
RSA_private_decrypt() ret:10
text:[1234567890]
下面这个例子演示了签名的生成和验证 *** 作。
输出:
ret:1
RSA_sign() ret:1
sign 64
4ec0af099c49646b72fda88a4fb11e8deb3898da9c3f611a5f25f05d9d005631858239bbb732cd5060dbc975363fc1b9cdfdc5a04554115a916f06f98163189f
RSA_verify() ret:1
这个很简单 如果密码手工输入 理论上完全可以 但是密钥有时候二进制有时候会上百位 转化到其他进制要几十位 很容易出错 而且私钥 公钥是从一个推出另一个的 手工输入怎么保证你输入的公钥私钥就可以一定可以配成一对keyPair 而且公钥私钥 必须还要从用p q来算 等等如果手工输入太麻烦了为何我们不把这些繁琐的 容易出错的东西 封装起来来简化我们的开发呢所以我们有了各种各样的开发包 各种各样的架构 各种各样的库java中KeyPairGenerator keyGen = KeyPairGeneratorgetInstance("RSA");KeyPair key = keyGengenerateKeyPair(); cipherinit(CipherENCRYPT_MODE, keygetPublic()); cipherinit(CipherDECRYPT_MODE, keygetPrivate());这是我以前写的代码的片段 不是连续的 大体上就是先得到一个rsa的密钥对 然后调用getpublic()getprivatekey()获取公私钥就可以了
非对称加密需要两个密钥:公钥(publickey) 和私钥 (privatekey)。公钥和私钥是一对,如果用公钥对数据加密,那么只能用对应的私钥解密。如果用私钥对数据加密,只能用对应的公钥进行解密。因为加密和解密用的是不同的密钥,所以称为非对称加密。
非对称加密算法的保密性好,它消除了最终用户交换密钥的需要。但是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比对称加密慢上1000倍。
算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。
RSA、Elgamal、背包算法、Rabin、D-H、ECC (椭圆曲线加密算法)。使用最广泛的是 RSA 算法,Elgamal 是另一种常用的非对称加密算法。
收信者是唯一能够解开加密信息的人,因此收信者手里的必须是私钥。发信者手里的是公钥,其它人知道公钥没有关系,因为其它人发来的信息对收信者没有意义。
客户端需要将认证标识传送给服务器,此认证标识 (可能是一个随机数) 其它客户端可以知道,因此需要用私钥加密,客户端保存的是私钥。服务器端保存的是公钥,其它服务器知道公钥没有关系,因为客户端不需要登录其它服务器。
数字签名是为了表明信息没有受到伪造,确实是信息拥有者发出来的,附在信息原文的后面。就像手写的签名一样,具有不可抵赖性和简洁性。
简洁性:对信息原文做哈希运算,得到消息摘要,信息越短加密的耗时越少。
不可抵赖性:信息拥有者要保证签名的唯一性,必须是唯一能够加密消息摘要的人,因此必须用私钥加密 (就像字迹他人无法学会一样),得到签名。如果用公钥,那每个人都可以伪造签名了。
问题起源:对1和3,发信者怎么知道从网上获取的公钥就是真的?没有遭受中间人攻击?
这样就需要第三方机构来保证公钥的合法性,这个第三方机构就是 CA (Certificate Authority),证书中心。
CA 用自己的私钥对信息原文所有者发布的公钥和相关信息进行加密,得出的内容就是数字证书。
信息原文的所有者以后发布信息时,除了带上自己的签名,还带上数字证书,就可以保证信息不被篡改了。信息的接收者先用 CA给的公钥解出信息所有者的公钥,这样可以保证信息所有者的公钥是真正的公钥,然后就能通过该公钥证明数字签名是否真实了。
RSA 是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。
A 要把信息发给 B 为例,确定角色:A 为加密者,B 为解密者。首先由 B 随机确定一个 KEY,称之为私钥,将这个 KEY 始终保存在机器 B 中而不发出来;然后,由这个 KEY 计算出另一个 KEY,称之为公钥。这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥。接下来通过网络把这个公钥传给 A,A 收到公钥后,利用公钥对信息加密,并把密文通过网络发送到 B,最后 B 利用已知的私钥,就能对密文进行解码了。以上就是 RSA 算法的工作流程。
由于进行的都是大数计算,使得 RSA 最快的情况也比 DES 慢上好几倍,无论是软件还是硬件实现。速度一直是 RSA 的缺陷。一般来说只用于少量数据加密。RSA 的速度是对应同样安全级别的对称密码算法的1/1000左右。
比起 DES 和其它对称算法来说,RSA 要慢得多。实际上一般使用一种对称算法来加密信息,然后用 RSA 来加密比较短的公钥,然后将用 RSA 加密的公钥和用对称算法加密的消息发送给接收方。
这样一来对随机数的要求就更高了,尤其对产生对称密码的要求非常高,否则的话可以越过 RSA 来直接攻击对称密码。
和其它加密过程一样,对 RSA 来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡中间人攻击。假设 A 交给 B 一个公钥,并使 B 相信这是A 的公钥,并且 C 可以截下 A 和 B 之间的信息传递,那么 C 可以将自己的公钥传给 B,B 以为这是 A 的公钥。C 可以将所有 B 传递给 A 的消息截下来,将这个消息用自己的密钥解密,读这个消息,然后将这个消息再用 A 的公钥加密后传给 A。理论上 A 和 B 都不会发现 C 在偷听它们的消息,今天人们一般用数字认证来防止这样的攻击。
(1) 针对 RSA 最流行的攻击一般是基于大数因数分解。1999年,RSA-155 (512 bits) 被成功分解,花了五个月时间(约8000 MIPS 年)和224 CPU hours 在一台有32G 中央内存的 Cray C916计算机上完成。
RSA-158 表示如下:
2009年12月12日,编号为 RSA-768 (768 bits, 232 digits) 数也被成功分解。这一事件威胁了现通行的1024-bit 密钥的安全性,普遍认为用户应尽快升级到2048-bit 或以上。
RSA-768表示如下:
(2) 秀尔算法
量子计算里的秀尔算法能使穷举的效率大大的提高。由于 RSA 算法是基于大数分解 (无法抵抗穷举攻击),因此在未来量子计算能对 RSA 算法构成较大的威胁。一个拥有 N 量子位的量子计算机,每次可进行2^N 次运算,理论上讲,密钥为1024位长的 RSA 算法,用一台512量子比特位的量子计算机在1秒内即可破解。
DSA (Digital Signature Algorithm) 是 Schnorr 和 ElGamal 签名算法的变种,被美国 NIST 作为 DSS (DigitalSignature Standard)。 DSA 是基于整数有限域离散对数难题的。
简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名,如果数据和签名不匹配则认为验证失败。数字签名的作用就是校验数据在传输过程中不被修改,数字签名,是单向加密的升级。
椭圆加密算法(ECC)是一种公钥加密算法,最初由 Koblitz 和 Miller 两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成 Abel 加法群上椭圆离散对数的计算困难性。公钥密码体制根据其所依据的难题一般分为三类:大整数分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。
ECC 的主要优势是在某些情况下它比其他的方法使用更小的密钥 (比如 RSA),提供相当的或更高等级的安全。ECC 的另一个优势是可以定义群之间的双线性映射,基于 Weil 对或是 Tate 对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密 *** 作的实现比其他机制花费的时间长。
ECC 被广泛认为是在给定密钥长度的情况下,最强大的非对称算法,因此在对带宽要求十分紧的连接中会十分有用。
比特币钱包公钥的生成使用了椭圆曲线算法,通过椭圆曲线乘法可以从私钥计算得到公钥, 这是不可逆转的过程。
>
以上就是关于什么是RSA算法,有公钥和私钥对他的处理过程是这样的全部的内容,包括:什么是RSA算法,有公钥和私钥对他的处理过程是这样的、服务器公钥私钥总结、RSA(解题方法汇总一)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)