RSA加解密技术

RSA在实际应用中并不是简单的做大数运算,为了提高安全性,在加解密过程中都需要添加一定的随机因素。随机因素有两方面,一个是为了让同一明文每次加密产生的密文都不一样,加密前先填充一部分随机数,这个不止RSA有,DES等对称加密也都有,称为padding。另一方面是RSA解密(加密与解密用的同一个方法)的时候在做模幂运算时加入随机数,似的做运算的时间不固定,让黑客无法统计计算时间, 致盲黑客,称为blinding。 上面出现的问题都是blinding引起的。

加密随机数

加密的时候,一般需要在明文上填充一部分随机数,这样每次产生的密文都不一样,这个过程称为padding,而且加密标准里有各种类型的padding标准,比如PCKS1。

比如明文是D,通过一些填充,形成一个0011xxxxxxx11D的待加密串,00是开头,两个11中间是随机数,而且这些随机数不能含有1。这样同一个D,每次产生的待加密串是不一样的,解密后,按照这个格式把D取出来就行了。加密和解密端要使用同样的padding格式。

以下过程依次为

原始明文 -> padding后明文 -> 密文 -> padding后明文 -> 原始明文

对明文D做第一次加密

D -> 00112311D -> 123456 -> 00112311D -> D

对明文D做第二次加密

D -> 00117811D -> 783719 -> 00117811D -> D




为什么要使用padding呢?这个比较容易理解,比如有一种gongji类型叫做短消息gongji,如果我已知加解密双方的明文空间是四个字节的字符串,那我就可以通过观察明文对应的密文把所有的对应关系枚举出来,不需要密钥我就能知道这个密文对应的明文了。

关于随机数

真正意义上的随机数,是很难产生的,因为即使小到原子,它的规律也是有迹可循的。所以我们产生的随机数都是伪随机数,但是伪随机数的随机性也是不一样的,如果产生的随机数规律性很强,那就很容易被预测到,而如果产生的随机数被预测的难度特别大,那么我们就可以认为它是真随机数了,只有强度高的随机数用来加解密等操作上才是安全的。

目前大部分操作系统都会提供两种随机数的产生方式,以Linux为例,它提供了/dev/urandom和/dev/random两个特殊设备,可以从里面读取一定长度的随机数。/dev/random是blocking pseudo random number generator (阻塞式伪随机数产生器),它是通过网络事件,键盘敲击事件等物理上随机的事件,收集一些随机bit到熵池来产生随机数。这个随机生成函数可能因为熵池为空而等待,所以需要大量随机数的情况下它会显得很慢,但诸如产生证书之类的操作需要这种强度的随机数。 而/dev/urandom就是unblocking,它不会阻塞,但是产生的随机数不够高,是以时间戳之类的种子来产生随机数。比如Linux的/dev/random 生成随机数一段随机数

SGC7bUMkhnUVFuX09kOmc8bUdnW2kybkU4bD5OPDh8OTM9VQFSWzopWwwHVFBbEjQqU1AhLhsQcHIhOHRyNS5wFTtxOxgRN3cOJHMADHZwJgpwCSAsdhUIGnMvejh2BnsKDQ4qNjgANC15at

其它操作系统的实现方式可能不同,但是本质都是一样的。总之,要想获得一个真随机数,不管用什么语言,都需要等。在Java里面,可以用SecureRandom产生随机数,而且可以在JVM参数里配置是使用/dev/random还是/dev/urandom,如果安全性要求改,就用/dev/random,但是性能是就会有折扣。

总之,RSA作为一种低效的加密方法,用在加密大量数据上面是不合适的,即使是签名之类的地方,能尽量少用也要少用,否则对性能影响很大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值