基于FPGA的RSA加密信息

在上一篇博客我们简单了解了一下RSA算法,这篇博客我们以基于FPGA的RSA加密信息为例,具体实现RSA对信息的加密应用。

按照FPGA流水线的数据处理思路,这里初步可以划分成五个模块

前提:在RSA的加密算法开始前,首先我们要准备好两个不同的素数p和q(实际应用中建议这两个素数至少是一百位的,即在硬件资源支持的情况下这两个数要尽可能选大)

1:公钥的生成
根据RSA算法的底层原理,我们将pq的乘积定义为N,根据欧拉函数性质,在不大于N的自然数中与N互斥的自然数个数就是(p-1)(q-1)(前提是pq都为素数),现在我们需要选取一个自然数e,e要满足的条件就是 1<e<(p-1)(q-1),且e要与(p-1)*(q-1)互素,选取好e的数值数值之后,我们的公钥(e,N)也就确定下来了

举例:p=53 q=59
求N: N = 5359 = 3127
求e: (53-1)
(59-1) = 3016,即在1到3016之间选取一个数,且这个数与 3016互素即可,这里可以选e=3
公钥: 到此我们就得到了公钥为(3,3127)

2:加密算法

加密算法的本质就是一个单向函数,f(m) = c,这里我们用m来表示要发送的信息(明文),用c来表示明文经过加密之后得到的密文,这个函数需要满足的性质有三点
1:有公钥的话,就可以加密m得到c
2:只有密文c的话,很难反向推导出明文m
3:有密文c,同时还有密钥的话,很容易反向推导出明文m

这里提供一个加密公式供参考
m^e mod N = c(明文m的e次方对N取余得到密文c)

举例
假设要发送的信息m=89 (RSA发送的明文要小于N)

加密:(89^3)mod(N) = (704969)mod(3127) = 1394
到此我们就得到了加密之后的密文c=1394,让这个数据在互联网上传递

3:私钥的生成
私钥一般表示为(d,N),前面公钥中我们已经知道N的值了,这里只需要求出d的值就可以生成私钥了,而关于私钥和公钥的数学关联,上面已经说过
这里还是提供一种私钥d的数学公式
d = (k(p-1)*(q-1)+ 1)/e (k不定,使得d为整数即可)*

举例:根据前面的数据 p=53 q=59 e=3 ,当k=2时,我们可以得到整数d=2011, 密钥为(d=2011,N=3127)

4:解密算法
该模块的输入有两个,一个为密文c,一个是私钥(d,N),输出有一个,即为明文m
这里提供一个解密公式供参考
c^d mod N = m
举例:由前面的数据我们知道 c=1394 d=2011 N=3127,最后可算出m=89,表示解密成功
5:模幂运算
无论是加密公式 m^e mod N = c
还是解密公式 c^d mod N = m
还或者是其它数学算法推导出来的公式,我们发现这里面都有大量的取模以及幂次方的计算,可以说模幂运算的计算能力直接决定RSA运行的速度,尤其是我们想充分发挥FPGA快速处理数据的能力, 那模幂运算这一块必须充分优化,常见的有montgomery算法,关于模幂运算的展开我会在下一篇博客展开。一个RSA加密算法实现得好不好,可以毫不夸张得说绝大部分看的就是它的模幂运算这块设计的质量

6:补充说明
1:RSA的安全性是基于大数分解,所以在实际应用中p和q的选值建议至少都要100bit以上
2:RSA的难点在于如何适当选择出e和N的值,如何运算出d

猜你喜欢

转载自blog.csdn.net/jiyishizhe/article/details/105134659