P
k
P_k
Pk和解密密钥(私钥)
S
k
S_k
Sk,两者是不同的,且从加密密钥(公钥)无法推出解密密钥(私钥)。若B要给A发送加密信息,需要用A的加密密钥(公钥)
P
k
P_k
Pk(可在公开目录中查找)加密消息;A收到密文后,用自己的解密密钥(私钥)
S
k
S_k
Sk解密密文。
非对称密码体制主要是为了解决对称密码体制中的密钥分发和管理问题,与对称密码体制相比,非对称密码体制加解密速度较慢,密钥较长,密文长度往往大于明文长度。常见公钥密码体制包括基于大整数因子分解问题的RSA公钥密码体制,基于有限域乘法群上的离散对数问题的ElGamal公钥密码体制,基于椭圆曲线上离散对数问题的椭圆曲线公钥密码体制等。
三、分组密码
35.分组密码
分组密码(block cipher)本质是一个从明文空间
P
P
P(
m
m
m长的比特串集合)到密文空间
C
C
C(
n
n
n长的比特串集合)的一一映射(一般
m
=
n
=
t
m=n=t
m=n=t)。明文消息经编码表示后的二进制序列
p
0
,
p
1
,
…
,
p
i
,
…
p0,p1,…,pi, …
p0,p1,…,pi,…划分成若干固定长度的组(或块)
p
=
(
p
0
,
p
1
,
…
,
p
m
−
1
)
p=(p_0,p_1,…,p_{m-1})
p=(p0,p1,…,pm−1),各组分别在密钥
k
=
(
k
0
,
k
1
,
…
,
k
t
−
1
)
k=(k_0,k_1,…,k_{t-1})
k=(k0,k1,…,kt−1)的控制下转换成长度为
n
n
n的密文分组
c
=
(
c
0
,
c
1
,
…
,
c
n
−
1
)
c=( c_0,c_1,…,c_{n-1})
c=(c0,c1,…,cn−1)。
分组密码主要提供数据保密性,也可用于构造伪随机数生成器、流密码、认证码和哈希函数。分组密码分为对称分组密码和非对称分组密码(公钥密码),在很多场合一般指是对称分组密码。
36.扩散
扩散(diffusion)指算法使每一比特明文的变化尽可能多地影响到输出密文序列的变化,以便隐蔽明文的统计特性;并且每一位密钥的影响也尽可能迅速地扩展到较多的输出密文比特中去。即扩散的目的是希望密文中的任一比特都要尽可能与明文、密钥相关联,或者说,明文和密钥中任何一比特值得改变,都会在某种程度上影响到密文值的变化(又称雪崩效应),以防止将密钥分解成若干个孤立的小部分,然后各个击破。
37.混乱
混乱(confusion)指在加密变换过程中是明文、密钥以及密文之间的关系尽可能地复杂化,以防密码破译者采用统计分析法进行破译攻击。混乱可以用“搅拌”来形象地解释,将一组明文和一组密文输入到算法中,经过充分混合,最后变成密文。同时要求,执行这种“混乱”作业的每一步都必须是可逆的,即明文混乱以后能得到密文,反之,密文经过逆向混乱操作后能恢复出明文。
38.白化
白化(whitening)是将分组密码算法的输入与一部分密钥异或,并将其输出与另一部分密钥异或的技术,用于阻止密码分析者在已知基本密码算法的前提下获得一组明文/秘文对。
39.雪崩效应
雪崩效应(Avalance Criteria)指输入(明文或密钥)即使只有很小的变化,也会导致输出(密文)产生巨大变化。严格雪崩效应(Strict Avalance Criteria)指当一个输入位发生改变时,输出位将有一半发生改变。
40.代换-置换网络
代换-置换网络(Subsituation Permutation Network)简称SP网络,是由多重**S变换(S盒,混乱)和P变换(P盒,扩散)**组合成的变换网络,是乘积密码的一种常见表现形式。SP网络中的S盒是许多密码算法唯一的非线性部件,其密码强度决定了整个密码算法的强度。
41.Feistel网络
Feistel网络由Feistel提出,将长度为
n
n
nbit(
n
n
n为偶数)的明文分组分为左右各半长为
n
/
2
n/2
n/2的两部分:
L
L
L和
R
R
R。定义迭代算法如下:
L
i
=
R
i
−
1
L_i = R_{i-1}
Li=Ri−1
R
i
=
L
i
−
1
⊕
f
(
R
i
−
1
,
K
i
)
R_i = L_{i-1}\oplus f(R_{i-1},K_i)
Ri=Li−1⊕f(Ri−1,Ki)其中,
K
i
K_i
Ki是第
i
i
i轮使用的子密钥,
f
f
f是任意轮函数。
Feistel网络保证了算法可逆性,即加密和解密可以采用同一算法实施。
42.DES
DES(Data Encryption Standards)是第一个广泛应用于商用数据保密的密码算法,为对称加密算法。美国国家标准局(NBS,National Bureau of Standards)于1973年开始征集联邦数据加密标准,许多公司提交了算法,IBM公司的Lucifer加密系统最终胜出。经过两年多的公开讨论,1977年1月15日NBS决定利用这个算法,并将其更名为数据加密标准(DES)。
43.AES
1997年美国国家标准与技术研究院(NIST,National Institute of Standards and Technology)公开征集高级加密标准(AES,Advanced Encryption Standard),基本要求是安全性能不低于三重DES,性能比三重DES快,并特别提出高级加密标准必须是分组长度为128位的对称分组密码,且支持长度为128位、192位、256位的密钥。此外,如果算法被选中,在世界范围内须是可免费获得的。
2000年10月2日,NIST宣布最终评选结果,根据安全性(稳定的数学基础、无算法弱点、可抗密码分析)、性能(速度快)、大小(内存与存储空间占用小)、易实现(良好的软硬件适应性)等标准,比利时密码学家Joan Daemen和Vincent Rijmen提出的“Rijndael数据加密算法”最终获胜。修改的Rijndael算法成为高级加密标准AES,2001年11月26日,NIST正式公布高级加密标准AES,并于2002年5月26日正式生效。
44.IDEA
国际数据加密算法(IDEA, International Data Encryption Algorithm)由瑞士的来学嘉(Xuejia Lai)和 James Massey于1990年公布,当时称为推荐加密标准(PES, Proposed Encryption Standard)。1991年,为抗击差分密攻击,他们对算法进行了改进,称为改进推荐加密标准(IPES,Im proved PES),并于1992年改名为国际数据加密算法IDEA。
IDEA受专利保护,要先获得许可证之后才能在商业应用程序中使用,著名的电子邮件隐私技术PGP就是基于IDEA的。
45.分组密码的工作模式
实际消息长度一般大于分组密码的分组长度,分组密码将消息分为固定长度的数据块来逐块处理。人们设计了许多不同的块处理方式,称为分组密码的工作模式,通常是基本密码模块、反馈和一些简单运算的组合。这些工作模式同时为密文分组提供了一些其他性质,如隐藏明文的统计特性、错误传播控制、流密码的密钥流生成等。
46.电子密码本
电子密码本(ECB, Electronic Code Book)模式一次处理一个明文分组,各个明文分组被独立加密成相应的密文分组,主要用于**内容较短且随机的报文(如密钥)**的加密传递。
- 相同明文(在相同密钥下)得出相同的密文,易受实现统计分析攻击、分组重放攻击和代换攻击
- 链接依赖性:各组的加密都独立于其它分组,可实现并行处理
- 错误传播:单个密文分组中有一个或多个比特错误只会影响该分组的解密结果
47.密码分组链接
密码分组链接(CBC, Cipher Block Chaining)模式应用了反馈机制,明文在加密之前需要与前面的密文进行异或,即每个密文分组不仅依赖于产生它的明文分组,还依赖于它前面的所有分组。CBC适合文件加密,是软件加密的最佳选择。
- 相同的明文,即使相同的密钥下也会得到不同的密文分组,隐藏了明文的统计特性
- 链接依赖性:对于一个正确密文分组的正确解密要求它之前的那个密文分组也正确,不能实现并行处理
- 错误传播:密文分组中的一个单比特错误会影响到本组和其后分组的解密,错误传播为两组
48.密码反馈
密码反馈(CFB, Cipher Feedback Block)将消息看作比特流,无需接受完整个数据分组后才能进行加解密,是自同步序列密码算法的典型例子,通常用于加密字符序列。
- 可用于同步序列密码,具有CBC模式的优点
- 对信道错误较敏感且会造成错误传播
- 数据加解密的速率降低,其数据率不会太高
49.输出反馈
输出反馈(OFB, Output Feedback Block)是基于分组密码的同步序列密码算法的一种例子。
- CFB模式的一种改进,克服由错误传播带来的问题,但对密文被篡改难于进行检测
- OFB模式不具有自同步能力,要求系统保持严格的同步,否则难于解密
四、序列密码
50.序列密码
序列密码,又称流密码,属于对称密码体制,它一次只对明文消息的单个字符(通常是二进制位)进行加解密变换,具有实现简单、速度快、错误传播少等特点.
在序列密码中,将明文消息按一定长度分组,对各组用相关但不同的密钥逐位加密产生相应密文,相同的明文分组会因在明文序列中的位置不同而对应不同的密文分组,接收者用相同的密钥序列对密文序列逐位解密恢复出明文。
令明文序列
p
=
p
n
−
1
.
.
.
p
1
p
0
p=p_{n-1}…p_1p_0
p=pn−1…p1p0密钥序列
k
=
k
n
−
1
.
.
.
k
1
k
0
k=k_{n-1}…k_1k_0
k=kn−1…k1k0
密文序列
c
=
c
n
−
1
.
.
.
c
1
c
0
=
E
k
n
−
1
(
p
n
−
1
)
.
.
.
E
k
1
(
p
1
)
E
k
0
(
p
0
)
c=c_{n-1}…c_1c_0=E_{k_{n-1}}(p_{n-1})…E_{k_1}(p_1)E_{k_0}(p_0)
c=cn−1…c1c0=Ekn−1(pn−1)…Ek1(p1)Ek0(p0)若
c
i
=
E
k
i
(
p
i
)
=
p
i
⊕
k
i
c_i=E_{k_i}(p_i)=p_i\oplus k_i
ci=Eki(pi)=pi⊕ki则称此类为加法序列密码。
51.反馈移位寄存器
反馈移位寄存器(FSR,Feedback Shift Register)一般由移位寄存器和反馈函数(Feedback Function)组成。移位寄存器是由位组成的序列,其长度用位表示,每次移位寄存器中所有位右移一位,最左端的位根据寄存器中某些位计算得到,由寄存器某些位计算最左端位的部分被称为反馈函数,最右端一个寄存器移出的值是输出位。移位寄存器的周期是指输出序列从开始到重复时的长度。
52.线性反馈移位寄存器
线性反馈移位寄存器(LFSR,Linear Feedback Shift Register)的反馈函数是寄存器中某些位简单异或,这些位叫做抽头序列(Tap Sequence),有时也叫 Fibonacci 配置(Fibonacci Configuration)。
**53.
m
m
m序列**
线性反馈移位寄存器输出序列的性质完全由其反馈函数决定,一个
n
n
n位LSFR能够处于
2
n
−
1
2^{n}-1
2n−1个内部状态中的一个,即**理论上,
n
n
n位LFSR在重复之前能够产生
2
n
−
1
2^{n}-1
2n−1位长的伪随机序列**(由于全0的状态将使LFSR无止尽地输出0序列,因此是
2
n
−
1
2^{n}-1
2n−1而不是
2
n
2^{n}
2n)。
只要选择合适的反馈函数便可使序列的周期达到最大值
2
n
−
1
2^{n}-1
2n−1,即只有具有一定抽头序列的LFSR才能循环地遍历所有
2
n
−
1
2^{n}-1
2n−1个内部状态,这个输出序列被称为**
m
m
m序列**。为了使LFSR成为最大周期LFSR,由抽头序列加上常数1形成的多项式必须是本原多项式,多项式的阶即移位寄存器的长度。
54.RC4
RC4(Ron RivestCipher)以随机置换为基础,是一个可变密钥长度、面向字节操作的序列密码,该算法由于加解密速度快(比DES快约10倍)、易于软件实现,广泛应用于Microsoft Windows、Lotus Notes等软件中,以及安全套接字层(SSL,Secure Sockets Layer)传输信息。
与基于移位寄存器的序列密码不同,RC4是典型的基于非线性数组变换的序列密码。它以一个足够大的数组为基础,对其进行非线性变换,产生非线性的密钥序列,一般把这个大数组称为S盒。RC4的S盒的大小根据参数
n
n
n(通常
n
=
8
n=8
n=8)的值变化,RC4算法理论上可生成总数
N
=
2
n
N=2^n
N=2n个的S盒。
55.A5
A5算法是GSM 系统中要使用的序列密码加密算法之一,用于加密手机终端基站之间的传输的语音和数据,目前已被攻破。
A5算法是一种典型的基于线性反馈移位寄存器的序列密码算法,由一个22bit长的参数(帧号码, Fn)和64 bit长的参数(会话密钥,Kc)生成两个114 bit长的序列(密钥流),然后与GSM会话每帧(228 bit/帧)异或。
五、哈希函数
56.Hash函数
Hash函数也称哈希函数/散列函数、杂凑函数,是一个从消息空间到像空间的不可逆映射,可将“任意”长度的输入经过变换以后得到固定长度的输出。它是一种单向密码体制,即只有加密过程,不存在解密过程。
57.消息摘要
Hash函数的单向性和输出长度固定的特征使其可生成消息的“数字指纹”(Digital Fingerprint),也称消息摘要(MD,Message Digest)或哈希值/散列值(Hash Value),主要应用于消息认证、数字签名、口令的安全传输与存储、文件完整性校验等方面。
58.MD5
MD5算法由美国麻省理工学院著名密码学家Rivest设计,他于1992年向IETF提交的RFC1321中对MD5作了详尽的阐述。MD5是在MD2、MD3、MD4的基础上发展而来,由于在MD4上增加了Safety-Belts,MD5又被称为是“系有安全带的MD4”。
算法的输入是最大长度小于
2
64
2^{64}
264bit的消息,输入消息以
512
512
512+bit的分组为单位处理,输出为
128
b
i
t
128bit
128bit的消息摘要。
59.SHA1
1993年,美国国家标准技术研究所NIST公布了安全散列算法SHA0(Secure Hash Algorithm)标准,1995年4月17日,公布的修改版本称为SHA-1,是数字签名标准中要求使用的算法。
SHA1算法的输入是最大长度小于
2
64
2^{64}
264bit的消息,输入消息以
512
512
512 bit的分组为单位处理,输出为
160
160
160bit的消息摘要,因此抗穷举性更好。
60.消息认证
消息认证指验证消息的真实性,包括验证消息来源的真实性,一般称之为信息源认证;验证消息的完整性,即验证消息在传输和存储过程中没有被篡改、伪造等
61.消息认证码
消息认证码(MAC,Message Authentication Code)用来检查消息是否被恶意修改,利用消息和双方共享的密钥通过认证函数来生成一个固定长度的短数据块,并将该数据块附加在消息后。
利用DES、AES等对称分组密码体制的密码分组链接模式(CBC)一直是构造MAC的最常见的方法,如FIPS PUB 113中定义的CBC-MAC。由于MD5、SHA-1等Hash函数软件执行速度比DES等对称分组密码算法要快,目前提出了许多基于Hash函数的消息认证算法,其中HMAC(RFC 2014)已作为FIPS 198标准发布,并且在SSL中用于消息认证。
六、公钥密码
62.RSA公钥密码
1978年,美国麻省理工学院的Rivest、Shamir、Adleman联合提出了RSA公钥密码体制,是第一个安全实用的公钥码算法,其安全性依赖于大整数因子分解的困难性。RSA公钥密码体制可用于加密,也可用于数字签名,且具有安全、易实现等特点。
(1)公私密钥对生成
选取两个大素数
p
、
q
p、q
p、q(不可泄露),计算
n
=
p
q
n=pq
n=pq及
n
n
n的欧拉函数
φ
(
n
)
=
(
p
−
1
)
(
q
−
1
)
\varphi(n) = (p-1)(q-1)
φ(n)=(p−1)(q−1)
随机选取整数
e
(
1
<
e
<
φ
(
n
)
)
e(1<e<\varphi(n))
e(1<e<φ(n))作为公钥,满足
g
c
d
(
e
,
φ
(
n
)
)
=
1
gcd(e,\varphi(n))=1
gcd(e,φ(n))=1,即
e
e
e与
φ
(
n
)
\varphi(n)
φ(n)互素
使用Euclid扩展算法计算私钥
d
≡
e
−
1
m
o
d
φ
(
n
)
d \equiv e^{-1} \bmod \varphi(n)
d≡e−1modφ(n),即
e
e
e的逆元
(2)加解密算法
公钥:
(
e
,
n
)
(e,n)
(e,n)
私钥:
d
d
d
加密:
c
≡
m
e
m
o
d
n
c \equiv m^e \bmod n
c≡memodn
解密:
m
≡
c
d
m
o
d
n
m \equiv c^d \bmod n
m≡cdmodn
63.ElGamal公钥密码
ElGamal公钥密码体制由T.ElGamal于1985年提出,该体制基于有限域上离散对数问题,既可用于加密,又可以用于数字签名。由于其较好的安全性,且同一明文在不同的时刻会生成不同的密文,在实际中得到了广泛的应用,尤其在数字签名方面的应用,著名的**数字签名标准(DSS,Digital Signature Standard)**其实就是ElGamal签名方案的一种变形。
(1)公私密钥对生成
随机选择一个大素数
p
p
p,且要求
p
−
1
p-1
p−1有大素数因子,
g
∈
Z
p
∗
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
φ
(
n
)
)
=
1
gcd(e,\varphi(n))=1
gcd(e,φ(n))=1,即
e
e
e与
φ
(
n
)
\varphi(n)
φ(n)互素
使用Euclid扩展算法计算私钥
d
≡
e
−
1
m
o
d
φ
(
n
)
d \equiv e^{-1} \bmod \varphi(n)
d≡e−1modφ(n),即
e
e
e的逆元
(2)加解密算法
公钥:
(
e
,
n
)
(e,n)
(e,n)
私钥:
d
d
d
加密:
c
≡
m
e
m
o
d
n
c \equiv m^e \bmod n
c≡memodn
解密:
m
≡
c
d
m
o
d
n
m \equiv c^d \bmod n
m≡cdmodn
63.ElGamal公钥密码
ElGamal公钥密码体制由T.ElGamal于1985年提出,该体制基于有限域上离散对数问题,既可用于加密,又可以用于数字签名。由于其较好的安全性,且同一明文在不同的时刻会生成不同的密文,在实际中得到了广泛的应用,尤其在数字签名方面的应用,著名的**数字签名标准(DSS,Digital Signature Standard)**其实就是ElGamal签名方案的一种变形。
(1)公私密钥对生成
随机选择一个大素数
p
p
p,且要求
p
−
1
p-1
p−1有大素数因子,
g
∈
Z
p
∗
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-TaRSlkyz-1713027375252)]
[外链图片转存中…(img-S4nIXtwa-1713027375253)]
[外链图片转存中…(img-Ns2kUeQY-1713027375253)]
[外链图片转存中…(img-3QOYl3Ao-1713027375254)]
[外链图片转存中…(img-WP33bS9n-1713027375254)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-ys0PrJ45-1713027375255)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!