)
\mathsf{Enc}\_k(m\_b)
Enck(mb)后得到挑战密文
c
c
c,并发送给
A
\mathcal{A}
A;
3. A
\mathcal{A}
A输出对所加密明文的猜测
b
′
b'
b′,若
b
=
b
′
b=b'
b=b′,则
A
\mathcal{A}
A成功;否则,失败;
* 这与之前在完美保密中的不可区分实验类似的,区别在于本实验不是无条件的,而是输入“安全参数”,该参数将作用于安全定义。窃听不可区分实验既用在了信息论安全定义,也用在了计算安全定义,这就在两者之间建立了联系。
-
私钥加密安全定义
- 一个加密方案在出现窃听者时是不可区分加密,若对于任意概率多项式时间的敌手,存在一个可忽略函数,使得不可区分实验成功概率与1/2相比(两者间的差异)是可忽略的。
- 其中,多项式时间和可忽略都是对于“安全参数”的函数。
-
理解不可区分性的定义
- 一次一密方案在出现窃听者时是否是不可区分的?
- 若一个敌手一直在实验中失败,该方案是安全的吗?
- 在两个连续窃听不可区分实验中,使用同一个密钥的概率有多大?
- 若从密文中猜测到消息中最低比特的概率是3/4,该方案是安全的吗?
- 若从密文中猜测到消息中最低3个比特的概率是3/8,该方案是安全的吗?
- 相关性:
X
X
X和
Z
Z
Z的分布不可区分,
Y
Y
Y和
Z
Z
Z的分布不可区分,那么
X
X
X和
Y
Y
Y的分布是不可区分的吗?
-
语义安全(semantic security)
- 之前在导论部分有一个问题:如何定义不泄漏“meaningful”的信息。下面引入语义安全的概念来解决这个问题。
- 直觉:没有关于明文的任何有意义的信息泄漏
- 关于明文的信息用明文的函数来表示,
h
(
m
)
h(m)
h(m)表示敌手预先了解的关于明文的外部信息,
f
(
m
)
f(m)
f(m)表示敌手希望获取的关于明文的有意义的信息
- 定义:加密方案是窃听者出现时语义安全的,如果对于任意敌手,任意明文分布,任意函数
f
f
f和
h
h
h,一个敌手根据密文和
h
(
m
)
h(m)
h(m)获得
f
(
m
)
f(m)
f(m),另一个敌手只根据
h
(
m
)
h(m)
h(m)获得
f
(
m
)
f(m)
f(m),这两个敌手成功的概率之间的差异是可以忽略的
- 定理:一个私钥加密方案是窃听者不可区分的,当且仅当该方案是语义安全的。
- 证明略。直觉上,从右到左:若敌手能够在不可区分实验中成功(不是不可区分的),则意味着根据密文获得了关于区分明文的某些信息(不是语义安全);反之,若敌手能够获得关于明文的某些信息(不是语义安全),那么可以利用这些信息来区分明文(不是不可区分的)。
伪随机性
-
伪随机性概念(Pseudorandomness)
- 回顾之前完美保密的局限性,密钥长度需要和明文一样长才安全;计算安全中放松了安全的定义,那密钥能不能短一些,或者说能不能放松对随机性的要求,产生足够长但不完全随机的密钥?下面我们来学习伪随机性概念。
- 真随机性不能由一个可描述的机制产生。这里的“可描述的机制”显然是不包括“掷骰子”,而是指确定性的机制;
- 伪随机对于不知道其机制的观察者来说,看起来是真的随机;
- 一个固定的字符串谈不上是否随机/伪随机,随机/伪随机指的是产生字符串的过程;
- 问题:能否绝对地证明随机性?不能,因为我们可能是不知道其机制的观察者。
-
区分器(Distinguisher):统计测试
- 一类判断是否随机的务实的方法是,从一个随机生成器中得到多个随机序列并进行一套统计测试。
- 例如,序列中0和1的数量之差不应该太大,最大连续0的长度不应该太长等等。
- 伪随机性意味着下一比特不可预测(next-bit unpredictable),通过所有下一比特测试等且仅当通过所有统计测试。(这是姚期智的贡献)
- 问题是难以确定多少测试才足够?
-
定义伪随机性的直觉
- 直觉:从一个短的真随机种子生成一个长的随机串,这个伪随机串与真随机串是不可区分的。
- 这是不是和图灵测试类似?
- 区分器输入一个比特串,输出1位比特。注意:该比特不一定表示输入的串是否是随机的。
伪随机生成器(PRG)
-
伪随机生成器 (Pseudorandom Generator) 定义
- 一个确定性的多项式时间算法
G
:
{
0
,
1
}
n
→
{
0
,
1
}
ℓ
(
n
)
G : {0,1}^n \to {0,1}^{\ell(n)}
G:{0,1}n→{0,1}ℓ(n)是一个伪随机生成器(PRG),如果:
+ 延展:∀ n , ℓ ( n ) > n \forall n, \ell(n) > n ∀n,ℓ(n)>n。只有生成更长的串才有意义,否则可以直接从种子中复制一段输出; + 伪随机:对于任意PPT区分器 D D D, ∣ Pr [ D ( r ) = 1 ] − Pr [ D ( G ( s ) ) = 1 ] ∣ ≤ n e g l ( n ) \left|\Pr[D(r)=1] - \Pr[D(G(s))=1]\right| \le \mathsf{negl}(n) ∣Pr[D(r)=1]−Pr[D(G(s))=1]∣≤negl(n)。其中, r r r是随机的,种子 s s s随机的, ℓ ( ⋅ ) \ell(\cdot) ℓ(⋅)是延展因子。这里的意思是输出不同结果的概率差可以忽略,如果有一个区分器始终输出1,则两个概率都是1,差为0;另外,输出1并不需要表示特定含义,改成输出0也可以。
- 存在性:若单向函数存在或
P
≠
N
P
\mathcal{P} \ne \mathcal{NP}
P=NP,则PRG存在。后面我们会进一步学习。
-
真实案例
- C语言的
random()
- Netscape早期版本的漏洞https://people.eecs.berkeley.edu/~daw/papers/ddj-netscape.html
- C语言的
- 从这两个例子可以看出来,输出都是可预测的。
-
关于PRG的一些问题
- 利用下一比特不可预测,还有PRG的不可区分实验定义可以解决这些问题。
-
充分种子空间
- 稀疏输出:当扩展因子为
2
n
2n
2n时,在长度为
2
n
2n
2n的串中只会产生
2
−
n
2^{-n}
2−n。
- 蛮力攻击:给定无穷的时间,通过枚举所有种子来产生所有串,能以较高的概率区分出伪随机串。
- 充分种子空间:种子必须长来抵抗蛮力攻击。
-
不充分的随机性
- 2008年,为了避免一个编译警告,Debian的一个发布版本中误删了一行代码,引起OpenSSL中关于随机生成器的漏洞。
规约法
-
规约法(Reduction)
- 规约法是将一个问题A变换为另一个问题B。变换的意思可以理解为,A可以通过解决B来解决。
- 规约
A
≤
m
B
A \le_m B
A≤mB:
A
A
A可规约为B,如果B的解存在并且给定该解时A可解,其中
m
m
m表示映射规约;这里可以将规约理解为A对B的子函数调用,除了子函数B是一个黑盒,解决A的步骤都应该是明确的。
- 解决A不能比解决B更难,因为A可以通过解决B来得到解决。
- 例题,测量矩形面积可规约到测量矩形边长;计算一个数的平方可规约到两个数乘积,相反可以规约吗?
规约证明
-
规约证明
- 我们现在站在敌手的角色来思考,希望解决“破解”加密方案这个问题,并且在此之前我们已经知道有个一“假设”问题是不可解决的;
- 为了证明一个加密方案
Π
\Pi
Π在假设
X
X
X下是安全的,就是证明“破解”问题不可解。
- 将解决“假设”
X
X
X问题的算法
A
′
\mathcal{A}’
A′规约到“破解”
Π
\Pi
Π的算法
A
\mathcal{A}
A。如果加密方案可以被破解,则假设问题也可以解决。然而,由于假设问题是难以解决的,这导致矛盾,说明加密方案不可以被破解。
- 先令一个概率多项式时间的算法
A
\mathcal{A}
A能够以概率
ε
(
n
)
\varepsilon(n)
ε(n)破解
Π
\Pi
Π ;
- 假设:一个问题
X
X
X是难以解决的,即不存在多项式时间算法来解决
X
X
X;
A
′
\mathcal{A}’
A′是一个解决
X
X
X的概率算法;
- 规约:解决假设问题
X
X
X可以通过破解加密方案
Π
\Pi
Π,即将
A
′
\mathcal{A}’
A′规约到
A
\mathcal{A}
A,
A
′
\mathcal{A}’
A′通过以
A
\mathcal{A}
A作为子函数可以以概率
1
/
p
(
n
)
1/p(n)
1/p(n)有效地解决问题
X
X
X;
- 矛盾:若加密方案可以被有效破解,即
ε
(
n
)
\varepsilon(n)
ε(n)是不可忽略的,则
A
′
\mathcal{A}’
A′可以以不可忽略的概率
ε
(
n
)
/
p
(
n
)
\varepsilon(n)/p(n)
ε(n)/p(n)解决问题
X
X
X,这与假设矛盾,因而
ε
(
n
)
\varepsilon(n)
ε(n)一定是可忽略的。
-
一个规约法证明PRG的例子
- 假设
F
F
F是PRG,证明
G
G
G也是PRG。
- 问题A:如何区分
F
F
F;问题B:如何区分
G
G
G;
- 从A规约到B:区分
F
F
F的算法输入按位取反后作为区分
G
G
G的算法输入,区分
G
G
G的算法输出作为区分
F
F
F的算法输出。
-
一个规约法证明PRG的例子(续)
- 由此,建立了不可区分定义中概率的联系。
构造安全的加密方案
-
一个安全的定长加密方案
- ∣
G
(
k
)
∣
=
ℓ
(
∣
k
∣
)
|G(k)| = \ell(|k|)
∣G(k)∣=ℓ(∣k∣),
m
∈
{
0
,
1
}
ℓ
(
n
)
m \in {0,1}^{\ell(n)}
m∈{0,1}ℓ(n), 一个PRG以长度为
n
n
n的密钥作为种子,输出与明文相同长度的pad;
- G
e
n
\mathsf{Gen}
Gen:
k
∈
{
0
,
1
}
n
k \in {0,1}^n
k∈{0,1}n,密钥作为种子,长度小于明文长度;
- E
n
c
\mathsf{Enc}
Enc:
c
:
=
G
(
k
)
⊕
m
c := G(k)\oplus m
c:=G(k)⊕m,加密方法和一次一密一样;
- D
e
c
\mathsf{Dec}
Dec:
m
:
=
G
(
k
)
⊕
c
m := G(k)\oplus c
m:=G(k)⊕c,解密也是;
- 定理:该定长加密方案是窃听下不可区分的。
- 直觉上,这个方案和一次一密是类似的,除了密钥更短并且用伪随机生成器生成的比特串来与明文异或。因为伪随机对于任何敌手都可以认为是真随机,所以对于敌手而言,该方案与一次一密是一样的。由此,我们得到了一个安全的加密方案,同时避免了一次一密的最大局限性——密钥过长。
-
证明不可区分加密方案
- 思路:区分伪随机性为难题假设,破解加密方案为规约的子函数。针对伪随机生成器
G
G
G的区分器
D
D
D以
A
\mathcal{A}
A为子函数,使得当
A
\mathcal{A}
A破解了
Π
\Pi
Π则
D
D
D可以区分出
G
G
G,与
G
G
G的伪随机性矛盾。注意这里我们用了符号
Π
~
\tilde{\Pi}
Π~来表示
Π
\Pi
Π的一个变体,来刻画加密方案中可能使用了真随机串来加密;
- 回顾针对伪随机生成器的区分器
D
D
D的问题是,输入一个串
w
w
w,输出一个比特;这里关键问题是输出的比特从何而来?
- 将
D
D
D规约到
A
\mathcal{A}
A。回顾窃听者不可区分实验中,
A
\mathcal{A}
A与一个挑战者进行3轮交互:
1. A\mathcal{A} A选择两个不同明文 m 0 , m 1 m\_0, m\_1 m0,m1,并发送给挑战者; 2. 挑战者生成密钥,并随机挑选一个明文 m b m\_b mb加密后得到挑战密文 c c c,并发送给 A \mathcal{A} A; 3. A \mathcal{A} A输出对所加密明文的猜测 b ′ b' b′,若 b = b ′ b=b' b=b′,则 A \mathcal{A} A成功;否则,失败;
- 区分器
D
D
D成为窃听不可区分实验中的挑战者,特别之处在于:在第2步,不需要生成密钥,而是直接以输入串
w
w
w作为pad来加密,
c
:
=
w
⊕
m
b
c := w \oplus m_b
c:=w⊕mb;根据
w
w
w的两种可能,分两种情况:
+ 当w w w是由 G G G生成的,即伪随机串,则 c c c就是加密方案 Π \Pi Π中密文, A \mathcal{A} A面对的就是 Π \Pi Π; + 当 w w w是真随机串,则 c c c不同于加密方案 Π \Pi Π中密文,而与一次一密中一样, A \mathcal{A} A面对的就是
如何自学黑客&网络安全
黑客零基础入门学习路线&规划
初级黑客
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!
7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.
如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。
8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。
网络安全工程师企业级学习路线
如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的
视频配套资料&国内外网安书籍、文档&工具
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。
一些笔者自己买的、其他平台白嫖不到的视频教程。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!