什么是RSA算法,有公钥和私钥对他的处理过程是这样的

什么是RSA算法,有公钥和私钥对他的处理过程是这样的,第1张

分类: 电脑/网络 >> 互联网

解析:

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(解题方法汇总一)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9877702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存