密码学
文章平均质量分 83
国科大网安二班
中国科学院大学网安学院二班,会分享密码学、编程、数学相关知识和学习心得,欢迎大家一起讨论。想看什么帖子也可以给我留言。
展开
-
关于NP与co-NP、RP与coRP的理解
关于NP与co-NP、RP与coRP的理解在相信大多数人在接触计算复杂性领域时,都会被P、NP、NPC、NP-Hard、co-NP、RP……的等一系列困难问题的各种分类搞蒙。关于基本的定义,例如什么是P类问题什么是NP类或者NPC类问题,网上有很多很好的回答,我就不介绍了。这篇主要讲什么是co-NP以及如何理解它。定义语言LLL属于coNPcoNPcoNP当且仅当LLL的补集L‾∈NP\overline{L}\in NPL∈NP。这么简短的一句话该如何理解?若要证明一个问题属于coNPcoNPcoN原创 2021-08-14 16:32:43 · 5174 阅读 · 0 评论 -
分解因子算法——Pollard rho算法
分解因子算法——Pollard ρ\rhoρ 算法攻击RSA密码体制最明显的方法就是分解大整数。关于大整数分解的算法有许多,常见的有试除法、p±1p\pm1p±1算法、Pollard ρ\rhoρ算法、数域筛法、二次筛法等等。这篇分享的就是其中之一的Pollard ρ\rhoρ算法。我们说因子分解,很多时候并不一定要把大整数nnn彻底分解成素数乘积,而是求出nnn的某个非平凡因子即可。求大整数的一个因子固然困难,但是Euclidean算法告诉我们求两个数的最大公因子是可以在O(logn)O(\log原创 2021-03-22 12:45:47 · 3204 阅读 · 2 评论 -
求离散对数问题——指数演算法
求离散对数问题——指数演算法离散对数(DLP)问题:设有群(G,⋅)(G,\cdot)(G,⋅),α∈G\alpha \in Gα∈G是一个nnn阶元素。给定β∈<α>\beta \in \left< \alpha \right>β∈⟨α⟩,找到指数a,0≤a≤n−1a,0\le a\le n-1a,0≤a≤n−1,满足αa=β\alpha ^{a} =\betaαa=β这时aaa也表达成:a=logαβa=\log_{\alpha}\betaa=logαβ.前面介绍原创 2021-03-14 20:42:51 · 1713 阅读 · 0 评论 -
RSA密码——Wiener的低解密指数攻击(利用连分数理论)
RSA密码——Wiener的低解密指数攻击依旧考虑RSA密码体制:n=pqn=pqn=pq,其中ppp和qqq是素数。ϕ(n)=(p−1)(q−1)\phi(n)=(p-1)(q-1)ϕ(n)=(p−1)(q−1)。我们知道RSA的加解密主要进行模幂运算,如果利用快速平方乘方法的话,选择一个较小的解密指数会大幅度降低计算时间,提高效率。但是这里指出:应该避免解密指数过小。这里介绍由M.Wiener提出的一种攻击,可以计算出解密指数aaa。前提条件是:3a<n14且p<q<2q3a&原创 2021-03-13 18:59:09 · 4840 阅读 · 8 评论 -
RSA解密正确性证明
RSA解密正确性证明先描述一下RSA密码体制:RSA密码体制:大素数p,qp,qp,q,模数n=pqn=pqn=pq,加密指数bbb,解密指数aaa,满足ab≡1(modϕ(n))ab\equiv1 \pmod{\phi(n)}ab≡1(modϕ(n))。加密:c=mb mod nc=m^{b}\bmod{n}c=mbmodn;解密:m=ca mod nm=c^{a}\bmod{n}m=camodn。本篇是证明RSA解密确实能够得到明文mmm。当m∈Zn∗m\in \mathbb{Z}_{原创 2021-03-12 16:41:18 · 1701 阅读 · 0 评论 -
利用解密指数来攻击RSA密码体制
利用解密指数来攻击RSA密码体制先描述一下RSA密码体制:RSA密码体制:大素数p,qp,qp,q,模数n=pqn=pqn=pq,加密指数bbb,解密指数aaa,满足ab≡1(modϕ(n))ab\equiv1 \pmod{\phi(n)}ab≡1(modϕ(n))。加密:c=mb mod nc=m^{b}\bmod{n}c=mbmodn;解密:m=ca mod nm=c^{a}\bmod{n}m=camodn。这篇文章要讲的是这样一个结论:如果解密指数aaa已知,那大整数nnn可以在多项式原创 2021-03-12 16:09:45 · 603 阅读 · 1 评论 -
IDEA加密算法的C++实现
IDEA加密算法的C++实现国际数据加密标准(International Data Encryption Algorithm,IDEA)是由瑞士联邦学院的Xuejia Lai(来学嘉)和James Massey提出的分组密码。目前许多开源组织都使用IDEA作为加密算法,例如PGP。关于IDEA算法的原理讲解可以参考IDEA数据加密算法。这里给出IDEA的C++实现代码(参考书籍:王静文, 吴晓艺. 密码编码与信息安全:C++实践[M]. 清华大学出版社, 2015.)头文件IDEA.h//type原创 2021-03-09 17:28:39 · 2359 阅读 · 0 评论 -
关于欧几里得算法(Euclidean Algorithm)的迭代次数的证明
关于欧几里得算法(Euclidean Algorithm)的迭代次数的证明我们直到欧几里得算法是计算两个数的最大公因数(或者两个多项式的最大公因式),并且在其他算法中(例如因子分解算法)经常会用到欧几里得算法。本篇专门证明欧几里得算法的迭代次数和计算复杂度。欧几里得算法描述设我们研究的问题是利用欧几里得算法求gcd(a,b)gcd(a,b)gcd(a,b),求解算法流程如下:Euclidean Algorithm(a,b)r0=a,r1=b,m=1r_{0}=a,r_{1}=b,m=1r0=a原创 2021-03-06 12:06:41 · 1437 阅读 · 1 评论 -
因子分解算法——Pollard 的p-1方法
因子分解算法——Pollard 的p−1p-1p−1方法1 算法核心为了分解合数nnn。设数nnn的一个因子是ppp,那么并且p−1p-1p−1的每个因子qqq满足q≤Bq\le Bq≤B(B是自己选的一个数,称为界),此时必有(p−1)∣B!(p-1)|B!(p−1)∣B!证:设p−1=q1q2⋯qmp-1=q_{1}q_{2}\cdots q_{m}p−1=q1q2⋯qm,并且q1、q2、⋯、qm≤Bq_{1}、q_{2}、\cdots、q_{m}\le Bq1、q2、⋯、qm原创 2021-03-06 10:22:13 · 5408 阅读 · 5 评论 -
大整数分解因子算法——Dixon的随机平方算法
大整数分解因子算法——Dixon的随机平方算法许多分解因子算法的理论依据是这样的事实:假设我们可以找到x≢±y(modn)x\not\equiv \pm y\pmod{n}x≡±y(modn),但是有x2≡y2(modn)x^{2}\equiv y^{2}\pmod{n}x2≡y2(modn)。那么有n∣(x−y)(x+y)n|(x-y)(x+y)n∣(x−y)(x+y)但是n∤(x+y)n\nmid (x+y)n∤(x+y)且n∤(x−y)n\nmid (x-y)n∤(x−y),所以gc原创 2021-03-05 21:36:12 · 2536 阅读 · 1 评论 -
Pollard rho 算法求解离散对数问题
Pollard ρ\rhoρ 算法求解离散对数问题离散对数(DLP)问题:设有群(G,⋅)(G,\cdot)(G,⋅),α∈G\alpha \in Gα∈G是一个nnn阶元素。给定β∈<α>\beta \in \left< \alpha \right>β∈⟨α⟩,找到指数c,0≤c≤n−1c,0\le c\le n-1c,0≤c≤n−1,满足αc=β\alpha ^{c} =\betaαc=β前面分享过因子分解的Pollard ρ\rhoρ 算法(为了更好地理解Pollar原创 2021-02-28 20:40:52 · 3916 阅读 · 9 评论 -
流密码之m序列中的线性无关组
m序列中的线性无关组1、简介在流密码的基础学习中,最重要的是理解线性反馈移位寄存器和二元序列的相关性质。这类知识与代数基础联系紧密,通常需要花大的精力认真理解线性序列的各种定理推论。这里讨论m序列的一个问题:设a1,a2,⋯ ,ana_{1},a_{2},\cdots,a_{n}a1,a2,⋯,an是NNN级mmm序列的一个连续子列,则矩阵A=[a1a2⋯ana2a3⋯an+1⋮⋮⋮⋮anan+1⋯a2n−1]A=\begin{bmatrix}a_{1} & a_{2} &原创 2021-02-21 16:17:43 · 299 阅读 · 0 评论 -
Pohlig-Hellman算法求解离散对数问题
Pohig-Hellman算法求解离散对数问题离散对数(DLP)问题:ax≡b(modp)a^{x} \equiv b \pmod{p}ax≡b(modp)ppp是大素数。前面已经介绍了求解离散对数问题的小步大步算法(BSGS)(时间复杂度是O(p)O(\sqrt{p})O(p)),这里介绍另外一种求解光滑阶循环群上的离散对数的方法——Pohig-Hellman方法。事实上,Pohlig-Hellman算法的复杂度在一般情况下比BSGS算法高!但是在特殊情况下(循环群的阶是光滑数,即可以因子分原创 2021-02-12 10:14:06 · 5979 阅读 · 5 评论 -
线性密码分析(简单笔记)
线性密码分析(简单笔记)关于差分密码分析的可以看差分密码分析读书报告。欢迎大家讨论留言。1、发现在1993年的欧洲密码年会上,日本学者Matsui提出了对DES算法的一种新的攻击方法,即线性密码分析.同年的国际密码年会上,Matsui发现了DES算法中2条新的线性逼近关系,他利用这两条新的逼近关系对DES算法进行攻击,并引入了纠错码中的阵列译码思想来优化攻击过程.在动用12台工作站,花费50天左右的时间后,Matsui成功地破译了DES算法,这是公开文献中第一个对DES算法的实验分析结果。2、简介原创 2021-02-05 19:33:31 · 6977 阅读 · 7 评论 -
小步大步算法(BSGS)求解离散对数问题
小步大步算法(BSGS)求解离散对数问题众所周知,离散对数问题(Discrete Logarithm Problem,DLP)一直被认为是困难问题。离散对数问题可以是基于循环群的,也可以是基于椭圆曲线的,本篇以循环群上的离散对数问题为例。主要描述的是这样一个问题:DLP问题求解同余方程Ax≡B(modP)A^{x}\equiv B \pmod{P}Ax≡B(modP)其中,PPP是大素数。如果是在整数上,求对数就可以解决。但是在循环群上,离散对数求解却是难之又难。问题分析和算法主要思想根原创 2021-02-05 12:26:06 · 3221 阅读 · 0 评论 -
DES加解密代码实现(C++)
DES加解密代码实现(C++)今天花了时间实现了一遍DES算法的加解密全过程。分享一下欢迎交流。AES的可以参考AES算法代码实现(完整C++源代码)参考书籍是《密码编码与信息安全:C++实践》#include <iostream>#include <string>#include <vector>using std::vector;using namespace std;/* unsigned long long 类型正好是64bit */cla原创 2021-02-04 21:52:44 · 1251 阅读 · 4 评论 -
快速模幂算法—重复平方乘方法(附C++实现)
快速模幂算法—重复平方乘方法(附C++实现)在密码学中,经常碰见大整数的模幂运算,例如RSA的加解密或者Rabin密码的加密等等(Rabin解密需要利用循环群的开方算法)。前面讲过快速模幂的蒙哥马利算法,其实蒙哥马利模幂需要结合重复平方乘方法来计算。总的来说,重复平方乘方法使用更为广泛。1、主要思想考虑计算ab(modn)a^{b}\pmod{n}ab(modn),直接算无疑是复杂的,因为aba^{b}ab这个数太大了,会溢出。常见的乘方法是对指数bbb做因子分解,例如b=b1b2b3⋯b=b_{1原创 2021-01-25 09:38:09 · 7429 阅读 · 1 评论 -
AES算法代码实现(完整C++源代码)
AES加解密算法全过程实现(C++)利用C++编程实现了AES的加解密过程。关于列混合计算不清楚的可以看上一篇博客。主要针对128bit的明文和密钥给出实现,其他情况需要改一下Nk,Nb,Nr的值和某些地方的数组维度。byte GFMultiplyByte(byte L, byte R)这个函数是计算多项式模乘的结果(列混淆中的那一步)。其他想自己动手编编的可以复制一下这里的S盒和逆S盒或者其他常量。参考书籍是《密码编码与信息安全:C++实践》。#include <iostream>原创 2021-01-23 19:31:37 · 11654 阅读 · 6 评论 -
蒙哥马利算法(Montgomery Algorithm)|蒙哥马利约简、模乘、模幂
Montgomery Algorithm(蒙哥马利算法)蒙哥马利算法分为3种,蒙哥马利模乘,蒙哥马利约简,蒙哥马利模幂1、从蒙哥马利模乘说起模乘是为了计算ab(modN)ab\pmod{N}ab(modN)。普通算法中,在计算模N时,利用的是带余除法,除法运算需要太多次乘法,计算复杂度较高,蒙哥马利算法的思想就是利用进制表示简化除法运算,转化成位运算。蒙哥马利形式:为了计算ab(modN)ab\pmod{N}ab(modN),找一个RRR,然后使得a′≡aR(modN),b′≡bR(modN)a'原创 2021-01-22 16:25:42 · 21177 阅读 · 32 评论 -
关于AES的列混合计算和解密流程问题
关于AES的列混合计算和解密流程问题我们知道AES的加解密过程都可以用有限域中的计算表示出来。关于AES的加解密过程,很多教材资料都有详细描述,这里我想强调①关于AES加密过程中的MixColumn阶段是如何计算的;②AES的解密流程问题。AES的列混合计算我们经常会看到参考资料说AES的列混合过程是对状态矩阵的每一列左乘一个确定的矩阵(如下图),一般表示为然后我们乘了之后会发现结果并不对。事实上,这里表示的并不是简单的矩阵乘法,而是GF(28)GF(2^{8})GF(28)上的多项式模乘。从A原创 2021-01-18 19:45:22 · 9644 阅读 · 9 评论 -
求n阶循环群上平方根的方法
求n阶循环群上平方根的方法前面讨论勒让德符号计算问题时,就说明了二次同余式是否有解的问题的重要性。今天来讨论,对于二次同余方程:x2≡a(modp)x^{2} \equiv a\pmod{p}x2≡a(modp)有解,即Legendre符号(ap)=1(\frac{a}{p})=1(pa)=1,那么如何求xxx的值呢?这就是今天讨论的nnn阶循环群的平方根求法(由于模p的乘法群的阶是p−1p-1p−1,所以这里的nnn就是$p-$1)。其实我本来也觉得这个证明过程和计算过程偏复杂,不想深入理解记住,但原创 2021-01-18 14:01:03 · 636 阅读 · 0 评论 -
欧几里得算法和扩展的欧几里得算法C++递归实现
欧几里得算法和扩展的欧几里得算法C++递归实现关于欧几里得算法的流程不再赘述,不清楚的可以搜得到。本篇主要通过C++代码利用递归的思想实现,参考书籍是《密码编码与信息安全:C++实践》。1、欧几里得算法实现欧几里得算法比较简单,主要用于求两个数(多项式)的最大公因数(式),直接上代码。#include <iostream>using namespace std;int Euclidean(int a, int b){ if(b==0){ return a; }else{原创 2021-01-16 09:26:07 · 1175 阅读 · 2 评论 -
一种求周期二元线性序列的极小多项式的方法
一种求线性周期序列的极小多项式和线性复杂度的方法前面说到了BM算法,这里再介绍一个求周期序列的线性复杂度的方法。本方法看起来似乎比Berlekamp-Massey算法(BM算法一般用于求有限长序列的线性复杂度,求周期序列的线性复杂度的话,至少要取2个周期来生成)流程简单,本方法可以推广到有限域FqF_{q}Fq,但是具体形式需要重新导出。1.原理设已经给定一个周期为lll的线性序列aaa,则序列aaa一定有可以生成多项式是xl+1x^{l}+1xl+1,并且其极小多项式f(x)∣xl+1f(x)|x原创 2021-01-14 15:45:57 · 1126 阅读 · 0 评论 -
Legendre符号可以在多项式内计算
Legendre符号可以在多项式内计算在密码学中,二次剩余是一个重要的问题。要知道二次同余式x2≡a(modm)x^{2}\equiv a \pmod{m}x2≡a(modm)是否有解,就要求Legendre符号(am)(\frac{a}{m})(ma)的值(雅可比符号是Legendre符号的推广)。本篇讨论Legendre符号计算复杂性问题。1、问题假设ppp是一个奇素数,对任意整数yyy,Legendre符号(yp)(\frac{y}{p})(py)定义如下:问:Legendre符号是否在原创 2021-01-10 21:55:34 · 750 阅读 · 5 评论 -
关于求解线性序列的极小多项式和线性复杂度的BM算法实操理解
关于求解线性序列的极小多项式和线性复杂度的BM算法实操理解在流密码中,线性反馈移位寄存器(LFSR)是非常重要部件。学过线性移位寄存器序列相关知识的朋友都知道,Berlekamp-Massey算法(以下简称BM算法)是求解序列的线性复杂度的有效的方法。网上有很多BM算法的流程,笔者在学习的时候,感觉对着流程能够计算序列的线性复杂度,但是如果是闭卷考试,这个过程也太难记住了!所以本篇重新理解了一下BM算法的求解流程,重在教你如何快速掌握BM算法的计算过程。 如果你已经了解BM算法,你可以直接看第3点。1、原创 2021-01-08 13:33:50 · 3047 阅读 · 3 评论 -
差分密码分析读书报告
分组密码的差分分析读书报告近期,学习了差分密码分析和线性密码分析,借此机会整理一下学习心得,方便自己梳理一遍知识,也能发出来和大家一起交流。本篇主要讲差分分析,如果有描述错误或者不准确的地方,欢迎大家在帖子下方回复,谢谢~1、简介1990年国际密码年会上,Biham和Shamir首次提出了对DES的差分攻击,从此国际上开启了分组密码分析的热潮[1]。差分分析方法是用于攻击分组密码的,准确地说,它是攻击迭代型分组密码最有效地方式之一,经过这么多年地发展,差分分析已经成为了衡量密码体制安全性的重要指标之一原创 2021-01-07 21:50:12 · 2619 阅读 · 12 评论