非对称加密RSA算法原理及实际应用场景

引言

我数学差的离谱,所以我朋友去学AI,我还在这搞这些。虽然数学差也能学那些,但是毕竟不想当调包侠,没走那条路。所以本文如果在数学方面有问题,请留言给我,避免误人子弟

写这个文章还一个原因就是,最早SMB漏洞导致恶意利用出来很多勒索病毒,虽然实际上是通过SMB漏洞执行的,但是外行并不懂,他们认为勒索病毒=漏洞,甚至有人让我帮忙解密,我解个憨憨哟,RSA加密我拿什么给你解,这篇文章算是科普。

应用场景

对称加密算法有AES,DES,3DES,RC4等,加密解密方共用1个密钥,这就导致了很容易被破解,因为密钥客户端中也存在,无论你如何加密这个字符串,程序跑起来的时候这密钥总会在内存里
一般情况下,我们会使用RSA加密RSA使用一个公钥和一个私钥公钥加密的数据由私钥解密私钥加密的数据由公钥解密,但是性能会比对称加密算法要差很多。对于数据量大的情况,我们可以不加密信息整体

我的解决方案是这样:

  • 创建RSA密钥对。(服务端保留私钥,客户端保留公钥)
  • 创建AES密钥(服务端客户端共有)
  • 动态创建AES IV初始向量,即每次信息AES都用不同的IV加密。
  • 使用RSA私钥加密IV
  • 使用AES密钥使用CTROFB模式加密信息整体
  • 传递给客户端被加密的AES初始向量IVAES加密过的信息整体
  • 客户端利用RSA公钥解密出AES的IV,再用AES密钥解密信息整体

这样做的结果就是无论如何你都无法进行重放(伪造服务端),因为无法自己造出来AES的IVAES的IV由服务器中的RSA私钥进行加密AES的IV每次随机生成,想要伪造服务端重放唯一的办法是爆破RSA私钥hook掉解密AES密钥的地方或修改公钥使用自己的密钥,针对hook点我们做检查就很容易了,无论是通过线程上下文(int 3)还是jmp法或者dr寄存器,我们只要确保函数首部没被篡改即可,然后再针对公钥那段内存地址做检测。
这里说一下为什么动态生成的是AES的IV而不是动态生成AES密钥,因为IV只需要16字节(128位加密),而我们要做的只是为了随机性

RSA 算法原理

RSA建议使用1024bits或以上的长度生成公钥和私钥RSA-768 (768 bits, 232 digits) 在2009年被成功分解,虽然没到1024bits,我自己建议2048bits,这个长度每增加1bit难度都会上升2的n+1次方,至于为什么需要长度这么长的大数呢,看完原理你就知道了。

数学基础

质数

质数有时被称为素数,是指在大于1的自然数中除了1和它本身以外不再有其他因数的自然数。

互质数性质

  • 两个不相同质数一定是互质数。
  • 相邻的两个自然数是互质数。p是大于1整数,则p和p-1构成互质关系。
  • 相邻的两个奇数互质数。p是大于1奇数,则p和p-2构成互质关系。
  • 两个相差4奇数互质数。
  • 任意两个自然数,大数质数的两个数是互质数。
  • 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系。

欧拉定理

计算从1到n有多少个数与其互质的方法叫做欧拉函数,以φ(n)表示。

欧拉定理,是一个关于同余的性质欧拉定理表明,若n,a正整数,且n,a互质,则a^φ(n)≡1(mod n)

  • 如果n质数,则 φ(n)=n-1
  • 如果p质数npk 次方,即φ(n)=φ(p ^ k) = p ^ k - p ^ (k-1)=(p ^ k)( 1 - 1/p ) ,比如φ(8) = φ(2 ^ 3) = 2 ^ 3 - 2 ^ 2 = (2 ^ 3)(1 - 1 / 2) = 8 * 0.5 = 4
  • 如果n为两个互质的积.
    n = p × q
    φ( n ) = φ( pq ) = φ( p )φ( q )

模指数运算

指数运算很简单,取模也很简单,模指数是个啥玩意?
就是先进行指数运算,然后再取模,就叫模指数。
比如 (2^5) mod 4,先进行2的5次方运算,再取模,编程语言中为 pow(2,5)%4,这下看懂了吗。

小白理解

注意:下面的^符号是指数运算,并不是异或运算,虽然异或运算也算是简单的加密解密,但是这里是指数运算指数运算指数运算!!!

密文=(明文^e) mod n
明文=(密文^d) mod n
实际上公钥私钥就是在算(e,n)(d,n),其中n是固定的,只需要求出ed的值。白话就是算出3个值e,d,n

我们现在要做的就是算出公钥和私钥对应的指数固定模数

  • 先找2个足够大质数pq
  • 计算n = p * q
  • 计算 p-1q-1最小公倍数(也就是乘积),记作l(L不是1).
  • 计算ee必须满足两个条件1 < e < l,e和l互质
  • 计算dd必须满足两个条件e * d mod l = 1

为什么需要足够大的质数

从上面我们知道私钥的d计算就是通过公钥的e得到的,如果知道公钥(e,n),那么就可以进行爆破计算私钥(爆破出pq的值)。

pq是一个足够大的质数的时候,从它们的积(p * q)也就是n,去分解因子pq,这是一个公认的数学难题。当pq大到1024bits时,你无法通过n分解因子得到pq的值。如果爆破不出pq的值,也就无法计算私钥了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没事干写博客玩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值