幂运算

论文笔记:公钥密码算法的硬件实现及侧信道攻击研究(RSA部分)

纵饮孤独 提交于 2020-03-03 01:53:39
论文笔记:公钥密码算法的硬件实现及侧信道攻击研究 作者:王晖(天津大学,2017届硕士学位论文) RSA 算法计算流程 1. 密钥对生成(软件实现) • 选取两个大素数 p 和 q; • 计算𝑛 = 𝑝 × 𝑞,以及 n 的欧拉函数𝜙(𝑛) = (𝑝 − 1) ∙ (𝑞 − 1); • 随机选取一个整数𝑒 (1 < 𝑒 < 𝜙(𝑛)),满足𝑔𝑐𝑑(𝑒, 𝜙(𝑛)) = 1; • 计算私钥 d,满足𝑑 × 𝑒 ≡ 1 𝑚𝑜𝑑 𝜙(𝑛); • 其中 n, e 可以公开为公钥;p, q 可以抛弃但不能泄露, d 需要保密 为私钥。 2. 加密过程 • 加密方拥有公钥信息 n, e,首先需要将明文信息数字化,即转换成 二进制数据,保证每次加密明文信息 m 的长度小于log2𝑛; • 加密方对明文 m 进行加密,即进行模幂运算𝑐 = 𝑚^e 𝑚𝑜𝑑 𝑛; • 加密方将加密好的密文 c 通过可信通信渠道发送给解密方。 3. 解密过程 • 解密方拥有私钥信息 d; • 解密方接收密文信息 c; • 解密方对密文 c 进行解密操作,即𝑚 = 𝑐^d 𝑚𝑜𝑑 𝑛。 显然,加解密过程的基本运算单元都是:message = 𝑚𝑒𝑠𝑠𝑎𝑔𝑒^k𝑒𝑦 𝑚𝑜𝑑 𝑛。最后通过设计状态机调用模幂模块,分别能够实现 RSA 的加解密过程。RSA整个模块在 Xilinx ISE 开发环境中基于 Xilinx

快速幂运算

人盡茶涼 提交于 2020-03-02 22:38:08
快速幂运算: 对于一个数x,我们对其进行n次幂运算。如果按照一般的算法,也就是x * x * x…,这样的复杂度为O(n 2 )。 如果我们利用快速幂运算,那么复杂度为O(logn),效率就会有极大的提高。 那么如何进行快速幂运算? 我们对x进行n次幂运算,此时如果n可以表示为2的幂次的和,n表示为:n=2 k1 +2 k2 +2 k3 …。那么x n =x 2的k1次 × x 2的k2次 × x 2的k3次 …。这样,在求每个分量的同时计算出x的n次幂,比一般的算法节约时间。 C代码实现: # include <stdio.h> # include <stdlib.h> typedef long long ll ; ll power ( ll x , ll n ) { ll res = 1 ; while ( n > 0 ) { if ( n & 1 ) res = res * x ; //n&1,将n表示为二进制形式,最低位为1,则执行 x = x * x ; n >>= 1 ; //二进制的n右移且高位补零之后再赋值给n。>=有点像+=等的用法 } return res ; } int main ( int argc , char * argv [ ] ) { ll x , n , res ; scanf ( "%ld %ld" , & x , & n ) ; res =

矩阵快速幂

会有一股神秘感。 提交于 2020-02-07 18:13:49
这周学习了矩阵快速幂,就在这里记录下我的一下理解吧。 要学习矩阵快速幂,首先得先知道“矩阵”和“快速幂”的写法。 先说快速幂 顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为O(log₂N),与朴素的O(N)相比效率有了极大的提高。 ——百度百科 以NOIP2013的麦森数为例题,讲一下快速幂 从文件中输入P(1000<P<3100000),计算2^P-1的位数和最后500位数字(用十进制高精度数表示) 本题显然要使用高精度运算。对2^P-1位数可以用公式log10(2^P-1)+1来求。因为2^P最后一位不可能为0,所以原式可化简为log10(2^P)+1=P*log10(2)+1。于是就能快速得到麦森数的位数了。 我们主要看求最后500位的运算。这显然要用到高精度。但是使用普通的高精度运算,时间复杂度就为P*500^2=2500P。对于最大的P=3100000,显然超时。那有没有更快的算法呢? 这就要牵扯到二进制了,二进制一直是很神奇的一个东西。 以十进制数5举例子,5的二进制为101,这可以通过取模然后反过来得到。看一下101是怎样表示5的。 二进制逢二进一。所以十位上的数就表示这个数有几个2,这就像十进制的十位表示这个数有几个10一样。所以像十进制一样往上推,百位上的数就表示这个数有几个2^2,千位上的数就表示这个数有几个2^3……那么根据这样,就可以看出,101=1