密码技术小总结
密码技术与编码技术不同,但现在很多人把两者的技术混在一起,但两者某些地方界限确实有些模糊。密码技术与信息隐藏也不同,密码技术是让你看得到但是看不懂,信息隐藏是让你看不到找不到
不错的密码学入门文章
参考和查看更多内容推荐#
本文只是简要总结
http://www.mamicode.com/info-detail-2252602.html
https://blog.csdn.net/pdsu161530247/article/details/75667218
《码书 解码与编码的战争》
《图解密码技术 第三版》
《现代密码学》杨波
古典密码#
主要是置换(搞乱明文顺序)和代换(将明文字符替换成其它字符)
凯撒密码#
加密:将字母按照字母表顺序进行x的平移,x即为秘钥
解密:将密文进行x的反向平移
破译:暴力破解法:平移26次,找出明文
简单替换密码#
加密:建立26个字母与另外26个字母的一一对应关系(成为一张密码表),按照密码表将明文替换
解密:按照密码表解密
破译:因为秘钥空间足够大,暴力破解困难。采用频率分析——在英文中一些字母,组合,单词出现的频率不同。(为了对抗频率分析,还有同音法,出现频率越多的字母有越多的替换字符,如出现最多的e可以用数字14,16 74,82等代替,出现频率少的如v只用一个数字34代替)
维吉尼亚密码#
加密:有一个单词作为密钥,在26组密码中替换,具体https://baike.baidu.com/item/维吉尼亚密码/4905472?fr=aladdin
破译:找重复组合,确定相隔距离,找距离的公因数可以确定密钥长度,将密文按密钥长度分组,用频率分析法
因为可能有相同明文被相同密钥加密变成了相同密文(其它的情况概率较小)
近代密码#
恩格玛密码#
恩格玛机加密部分主要由接线板、转盘组成,接线板可以对调字母,转盘有3到5个,每输入一次转盘1就转一次,转盘1每转26次转盘2就转1次。
密钥即接线板的接线,选用的转盘数和转盘的顺序以及转盘初始位置。
希尔密码#
即26个字母对应0到25,密钥为一个矩阵,将密文变为一个矩阵与密钥矩阵相乘后模26,即得密文,解密是将密文乘以密钥矩阵的逆,再模26
如密钥矩阵为
明文为abc,对应矩阵为
加密即
解密为
现代密码#
对称密码#
DES#
将明文64位为一组,密钥也为64(实际为56,因为每7位会有一位用于错误检验),进行DES加密,是分组密码的一种。DES结构采用Feistel结构,在Feistel中加密的步骤称为轮,加密的过程即为轮的循环。
加密:以三轮为例,将64比特分为两组,一组32比特。右侧32直接与轮函数运算,子密钥1再和运算结果组成一串序列,该序列与左侧32异或运算后的结果向下,将左侧向下结果和右侧向下结果调换,进行第2轮,此子密钥变化为密钥2,最后进行第三轮,输出是不再调换顺序。
解密:倒过来
破译:
(1)差分分析:将明文改变,分析密文的偏差
(2)线性分析:如果密钥随机,那么明文和密文异或为0的概率为0.5,如果能找到大幅偏离0.5的地方,则可找到密钥的一些信息。
三重DES
进行三次des,即进行加密-解密-加密
AES#
128个比特为一组,即16个字节
加密:进行逐字节替换,行移动,列运算,与密钥异或,进行10~14轮
解密:反过来
SM4#
https://www.cnblogs.com/Qi-Lin/p/11218845.html
RC4#
是流密码,以下为过程
s表初始化
对s表线性填充,如s[0]=0,s[1]=1……s[255]=255,共256个字节
使用密钥填充r表,如密钥123,那么r[0]=1,r[1]=2循环填充直至填满256字节
接着对s表置乱,算法如下
j = 0;
for (i = 0 ; i < 256 ; i++)
{
j = (j + S[i] + R[i]) mod 256;
swap(S[i] , S[j]);//交换
}
密钥流产生
明文有多长就循环多少次
i=0;
j=0;
while(明文长度--)
{
i = (i + 1) mod 256;
j = (j + S[i]) mod 256;
swap(S[i] , S[j]);
t = (S[i] + S[j]) mod 256;
k[i] = S[t];
}
k为密钥
加解密部分
明文与密钥的异或操作
公钥密码#
rsa#
基于大整数难分解
一、加解密步骤
1、选择两个大素数p和q
2、计算 与
3、随机挑选整数值e,使其满足,且与互素
4、计算
5、e,n作为公钥 d,n作为私钥
6、加密
7、解密
二、攻击
1、共模攻击
如果给每个用户的e不同但n都相同,那么对于明文m有
如果c1和c1泄露,那么可以求出r,s满足
假设其中r是负数的那一个则
得出m
2、低指数攻击
当e较小时出现,比如e=3,假设得到3组密文
那么密文可以通过此求出
背包密码#
这里只大概说明加解密过程
密钥产生
选择一个超递增背包如(1,3,5,11,21,44,87,175,349,701)以及两个互素的参数k=1590,t=43,并求出t的逆元,这个背包向量和t的逆元为私钥
然后分别对背包中的元素进行如下模运算,如对第一个元素1,进行运算,得出一个经过伪装的背包(43,129,215,473,903,302,561,1165,697,1523),这个背包作为公钥
加密过程
比如要加密nb,这个对应的二进制为0111000010,那么用公钥加密,即把二进制为1的位置对应的背包元素加在一起,为129+215+473+697=1514,这个就是密文
解密过程
通过运算得到368,之后解背包问题
368<701为0
368>349为1 368-349后为19
19<175为0
19<87为0
19<44为0
19<21为0
19>11为1 19-11后为8
8>5为1 8-5后为3
3>=3为1 3-3后为0
0<1为0
所以明文为0111000010,即nb
其它#
elgamal 基于模离散对数难解
rabin 基于模平方根难解https://www.cnblogs.com/Qi-Lin/p/12221751.html
椭圆曲线密码ECC
sm2
分组模式#
以下分组模式的配图均来自《图解密码学技术 第三版》
密码可以分为分组密码与流密码
流密码:以特定长度的比特为单位进行连续的处理。
分组密码:将明文按照密钥的长度进行分组,一次只能处理特定长度的明文。(如果明文分组长度不够,则要进行填充,由此产生一种填充攻击,不断发送相同的密文而只略微改变填充的数据,则会获得一部分与明文相关的信息)
分组密码的模式:因为明文比分组密码的长度长,就需要对分组密码算法进行迭代,而迭代的方式就是分组密码的模式。
ecb电子密码本模式#
明文分组加密的结果直接为密文分组
特点:
1、如果有相同的明文分组,则会产生相同的密文分组
2、攻击:可以对调不同的密文分组,而不需知道明文,密钥等
cbc密文分组链接模式#
开始先产生一个与密钥等长的随机序列(初始化向量),第一个分组与其进行异或后进行加密,之后的明文分组与上一个得到的密文分组进行异或后进行加密
特点:
1、如果密文值发生改变导致密文分组发生变化会导致无法解密。若分组没有发生变化则至多导致两个分组损坏。
2、攻击:如果对初始化向量的比特进行反转,则会操纵明文
3、初始化向量必须使用不可预测的随机数。如果相同,则用相同的密钥对相同的明文进行加密时会产生相同的密文
cfb密文反馈模式#
也要生成一个初始化向量,现对初始化向量加密后(这里的加密是用其来生成密钥流),然后和明文分组进行异或得到密文分组,下一组用上一组得密文加密(生成密钥流),在进行异或……
攻击:重放攻击
ofb输出反馈模式#
也先生成初始化向量,对初始化向量加密(用其来生成密钥流),再与明文分组异或,下一次用这一次生成的密钥流加密(生成密钥流),再与明文分组异或
ctr计数器模式#
相当于每一个明文分组都有一个计数器生成的密钥流与其异或得到密文分组
单向散列函数#
由不同长度的输入,生成固定长度的输出。可以由输入得到输出,由输出得不到输入。只要输入发生一点变化,输出就会变化。用于防篡改
1、评价其的一个标准
抗撞击性:弱抗撞击性:不容易找到一条消息与该消息的散列值相同 强抗撞击性:不容易找到两条消息的散列值相同
2、种类:
md4、md5:产生128比特的输出。
sha1:160比特输出
sha2:有256,384,512
ripemd:160
ripemd160:有128,256,320
sha3:采用与以上不同的结构,有海绵体和双工两种结构。采用keccak算法
sm3
3、对单向散列函数的攻击
暴力破解:对弱抗碰撞性攻击
生日攻击:对强抗碰撞性攻击(生日悖论)
消息认证码#
1、消息认证码的实现方法
单向散列函数
分组密码
其它密码
2、hmac一种使用单向散列函数实现消息认证的方法
https://www.cnblogs.com/Qi-Lin/p/11222226.html
3、对消息认证码的攻击
重放攻击
应对措施:加入序号,时间戳,nonce等
数字签名#
为了防止否认,利用单向散列函数
实现:
(1)对消息的散列值,用自己的私钥加密
(2)对方收到后用对应的公钥进行解密
(3)用解密的散列值与发送的散列值对比
证书#
1、证书大致应用过程:
bob生成密钥,认证机构生成密钥,将bob的私钥用自己的私钥生成数字签名并附上bob的公钥,证书放在仓库中,alice得到证书,用认证机构的公钥进行验证
2、kpi公钥基础设施
是认证机构,有层级,kpi由用户,仓库,认证机构组成。
密钥#
生成
1、通过随机数生成
真随机序列(完全随机,不可预测,不可重现)——如噪音
主密钥+强算法
高级密钥对随机数解密
2、基于口令的密钥生成
随机生成密钥加密消息,用口令和盐(一段随机数)生成的散列值作为密钥的密钥,加密该密钥,对盐和加密后的密钥进行保存,自己记住口令(盐的作用:防御字典攻击)
配送
1、事先直接共享
2、通过密钥中心共享
3、diffie-hellman密钥协商
可以通过椭圆曲线实现
可以通过离散对数实现:a与b事先生成两个质数p和g,g为p的原根,a生成自己的随机数x,范围为1到p-2,将g的x次方模p发给b,b生成自己的随机数y,同样的范围,将g的y次方模p发给a,然后生成共同的密钥,g的xy次方模p
保存
通过明文或密文保存,或者对根密钥有门限的方式,比如shamir门限https://www.cnblogs.com/Qi-Lin/p/11222067.html,asmuth-bloom门限
同态加密#
对密文的运算与对明文的运算等价,如a加密后与b加密后运算的结果解密,与a与b运算等价
有加同态和乘同态,如果都满足就叫全同态
乘同态,如rsa。加同态,如paillier
量子交换密钥#
爱丽丝发送一串不同偏振的光子,鲍勃尝试测定这些光子的偏振方向,爱丽丝告诉鲍勃哪些正确测定了,爱丽丝与鲍勃把正确的作为密钥,并且如果有人拦截过,光子就会发生变化,产生错误
其它在ctf中可能碰到的密码#
ROT5/13/18/47https://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php
Ook!加密后为Ook. Ook? Ook!组成的字符串https://www.splitbrain.org/services/ook
Brainfuck加密后为.<+[-组成的字符串https://www.splitbrain.org/services/ook
jsfuck加密后为 ! +组成的字符串,一般用于加密javascript代码,还有个jother密码与此很像
富强民主,加密后是由核心价值观组成的密文
猪圈密码https://baike.baidu.com/item/猪圈密码/5538711?fr=aladdin
曲路密码密钥:实现约定的行列数和路径加密:将密文排列为约定的行列,按照路径将其记下,打乱明文
放射密码字母按照如下公式加密 (ax+b)mod26,ab为密钥,26与a互质,当a为1时其实为凯撒密码,解密为(a-b)mod26
栅栏密码#
将明文分成几组,然后从各组取同位的字母组成新的组合,再将这些组合拼接在一起。几栏即几个一组。如:
加密:how are ok(明文)
两个一组:ho wa re ok
取同位:hwro oaek
拼接:hwrooaek(密文)
解密:hwrooaek(密文) 两栏
分成两组:hwro oaek
取同位: ho wa re ok
拼接:how are ok
另:
1、对于一串字母不知道它是几栏,可以尝试它的公因数。
2、一些可能有变形,如一个素数个数的字母串,可能是拼音按声母韵母分,有捆绑。
利用键盘#
1、即abcdefghigklmnopqrstuvwxyz对应键盘上的字母顺序qwertyuiopasdfghjklzxcvbnm
2、或者利用键盘包围,比如rgdv在键盘包围f,那么rgdv就是f
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性