看到字符串能想到是什么加密、编码方式、该加密/编码是否可逆(可解密/解码)、加密不可逆≠不可解密,如MD5仍可by碰撞枚举的方式解密、渗透测试基于Discuz、Joomla等CMS的网站时联想到其可能的加密算法。
如果解密不出来:
-
可能网站加密算法很复杂
-
你的算法选择不当,如可能不是单纯的MD5,而是加盐值的MD5,又或者老师做题遇到的,先对$data进行AES加密,再进行base64编码
解决:根据网站名字搜索其CMS的加密算法、想办法得到其代码(可能会用到目录扫描扫有没有源代码备份),代码审计。老师遇到的AES加密那步,它的CBC模式、无填充、密码ydhaqPQnexoaDu、偏移量2018201920202021,你不拿到源码,是猜/爆破不出来的,模式等可以试,但是密码、偏移量试不完。
,80%的简单明文的从密文反查询是免费的,否则收费,支持多种加密算法:
原理:通过穷举字符组合的方式,创建了明文密文对应查询数据库,创建的记录约90万亿条,占用硬盘超过500TB,查询成功率95%以上。
它还支持对明文用几十种加密算法加密,若加密算法无需盐值和Hash,留空即可:
加密算法
-
MD5值是 32或16位由数字 "0-9"和字母 "a-f"所组成的字符串。对输入大小写敏感 ,对输出大小写不敏感 。
-
SHA1这种加密的密文特征跟 MD5差不多,只不过位数是 40
-
NTLM这种加密是 Windows的哈希密码,标准通讯安全协议,特征和MD5差不多,32位由数字 "0-9"和字母 "a-f"所组成。例如32ed87bdb5fdc5e9cba88547376818d4
-
AES(Advanced Encryption Standard),DESData Encryption Standard),RC4(Rivest Cipher 4)这些都是对称性加密算法,引入密钥,密文特征与 Base64类似。加密过程涉及IV(Initialization Vector)等好几种参数,所以只有密文是不能解密的。
应用场景:各类应用密文,自定义算法,代码分析,CTF安全比赛等。
AES加密结果是二进制数据,通常会使用Base64编码将其转换为可打印的字符(也有用Hex编码的)。例如1_mozhe经过一系列参数配置且base64编码输出结果为pHbb5ydRjGSpq+l/osWf5A==
-
discuz密码加密:discuz是一个论坛CMS,其存储用户密码用的是有salt(盐值)的MD5
比如我的密码是123456,正常应该是echo md5("123456")即e10adc3949ba59abbe56e057f20f883e,但discuz加密会在第一次md5后的值再拼接盐值(salt)(随机的6位字符串如d82a35)再进行md5,即echo md5(md5('123456') . 'd82a35')即7839dc9437013b5c11a5d86e9b8350e9。在php5.5之前的版本,并没有很好的加密机制。这是个不错的方式。已经大大地加强了密码的安全性了。
在discuz论坛CMS中,md5(md5(password).salt)中的salt和最终密码的密文保存在ucenter_members表中
当已知MD5密文和salt时,在cmd5网站中以
密文:salt
格式查询即可。其他加密同理:
-
CMD5网站支持主流/常用的加密算法,其中有个md5($pass.$salt);Jooml类型。
全球2.7%的网站用的是Joomla的模板。Joomla对密码的加密方式有很多种,有ssha、md5、base64等等,大多数使用默认的md5加密方式。
在每次添加新用户或修改密码时,例如Joomla的明文密码是123456,程序随机生成一串key即密码如cW2r7QqdGQrp2Rw9sbxCxN85nSek6tlV,以md5(明文密码 拼接 key)加密,即echo md5('123456 '. 'cW2r7QqdGQrp2Rw9sbxCxN85nSek6tlV')得到密文6fa7069f6c2b4a7abc376669113acab8,存储在数据库中以6fa7069f6c2b4a7abc376669113acab8:cW2r7QqdGQrp2Rw9sbxCxN85nSek6tlV格式即'密文:key'存储。
mimikatz
工具和LM简介
Mimikatz是法国人benjamin开发的一款功能强大的轻量级调试工具,本意是用来个人测试,但由于其功能强大,能够直接读取WindowsXP-2012等操作系统的明文密码而闻名于渗透测试,可以说是渗透必备工具。
提升权限命令
privilege::debug
,mimikatz许多功能都需要管理员权限,比如这个命令,不是管理员,执行会报error。
LM是win7之前的加密算法,win7之后用NTLM,LM可以不管了,因为基本上没有人用win7之前的服务器。
查看密码明文和密文
管理员权限打开mimikatz.exe,在CLI输入privilege::debug,再输入sekurlsa::logonpasswords,会输出:
注意到管理员密码是123456,也能看到对应的LM、NTLM的密文。不是所有的时候都能显示其密码明文,有时只获取到密文,可以尝试用工具网站如CMD5破解。
我在windows server 2008上成功了,如果是比较新的windows,可能会失败,可以百度下解决办法。
传输数据编码
BASE64 URL HEX ASCII,一般明文越长,编码越长。
为什么ZUIJOGMzSmVMMHQWZHhNN3diM056Zz09(32位),像是Base64编码而不是MD5加密,因为字符串有刻意区分大小写。
当我们说某个编码/加密算法对大小写敏感时,通常是指对输入数据的大小写敏感,而不是指输出数据的大小写敏感,输出是否区分大小写可没说,都可能。
-
BASE64值是由数字 "0-9"和字母 "a-f"以及特殊字符+/=所组成的字符串 ,结尾通常有符号=,明文越长,编码越长,例如pHbb5ydRjGSpq+l/osWf5A==
对输入大小写敏感,结果也区分大小写。
-
URL编码是由数字 "0-9"和字母 "a-f"所组成的字符串 ,对输入大小写敏感 ,通常以 %数字字母间隔,例如1aA+为%31%61%41%2B,输出不区分大小写。
-
HEX编码是计算机中数据的一种表示方法 ,将数据进行十六进制转换 ,它由 十六进制的组成元素即0-9,A-F,组成。对输入大小写敏感例如a为61,A为41,输出不区分大小写,例如E5A4A7和e5a4a7都是‘大’。
-
ASCII编码是将128个字符进行进制数来表示 ,常见 ASCII码表大小规则: 0~9<A~Z<a~z
实例
加解密的应用场景:
-
参数传递(如注入影响 )
例如某网站网址为https://ip/id=MQ==,
所以我想SQL注入网站,就不能直接id=1、id=2...,得是id=数字的Base64编码,需要工具支持这种曲折的注入方式,甚至可能要自己用java、python、php等写脚本。
-
后期 WAF绕过干扰写法应用
后面《后端代码加密》标题会讲
-
视频地址还原等
https://tv.sohu.com/v/MjAyMzA5MjYvbjYwMTMzNTE4MC5zaHRtbA==.html?channeled=1200010001
搜狐一个视频,观察MjAyMzA5MjYvbjYwMTMzNTE4MC5zaHRtbA==.html
,发现MjAyMzA5MjYvbjYwMTMzNTE4MC5zaHRtbA==
像极了Base64编码,
识别算法编码类型
-
看密文位数,如40位may SHA1,16/32位may MD5
-
看密文的构成元素特征(数字,字母,大小写,符号等)
-
看当前密文应用场景( Web,数据库,操作系统等应用),如从win上获取的最可能是NTLM
-
猜的成功率高,但≠100%
扩展
.shtml是什么文件
今天发现tv.souhu.com/video.shtml,SHTML文件和HTML文件差不多,都是网页文件,只是SHTML文件中有SSI指令(server-side includes)(服务器端包含指令)。SHTML文件在发送到用户浏览器之前由web服务器进行处理(或解析)—— 把SHTML文件中包含的SSI指令解释出来,服务器传送给客户端的文件,是已经解释的SHTML,不会有SSI指令——SHTML文件实现了HTML所没有的功能。
网站维护常常碰到的一个问题是,网站的结构已经固定,却为了更新一点内容而不得不重做一大批网页。SSI提供了一种简单、有效的方法来解决这一问题,它将一个网站的基本结构放在几个简单的HTML文件中(模板),以后我们要做的只是将文本传到服务器,让程序按照模板自动生成网页,从而使管理大型网站变得容易。
难怪有的安装需要重启计算机
比如steam加速器正在占用host文件,而通达需要修改host,就修改失败,所以需要重启计算机。
JS前端代码混淆
Jother、JsFuck、JJEncode和AAEncode都属于JavaScript代码的混淆手段,他们通过对JavaScript代码进行各种转换、编码和替换,使代码变得难以阅读和解析,从而增加了代码的安全性和隐私性。
对JS代码混淆的意义
比如我创造了某炫酷JS特效,但是为了保护版权、怕别人研究学习技术学会了甚至基于我的代码二次开发,我把JS代码加密,让别人看不懂。
又如JS涉及重要信息,比如AES加密的密码和偏移量,加密可以让参数不泄露,防止代码审计。
或者将JavaScript代码转换为特定的字符集,以绕过过滤机制或隐藏代码的真实目的。
有四种加密方式:
JJEncode
JJEncode、AAEncode、JSFuck 都是同一个作者,实战可参考K哥以前的文章:,JJEncode 具有以下特征:
-
大量
$
、_
符号,大量重复的自定义变量; -
仅由 18 个符号组成:
[]()!+,\"$.:;_{}~=
正常的一段 JS 代码:
alert("Hello, JavaScript" )
经过 JJEncode 混淆(自定义变量名为 $)之后的代码:
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();
JS颜文字 / AAencode
JJEncode、AAEncode、JSFuck 都是同一个作者,实战可参考K哥以前的文章:
颜文字特征:一堆颜文字构成的js代码,特征是()+=[]等符号组成的颜文字,在 F12中可直接解密执行
正常的一段 JS 代码:
alert("Hello, JavaScript")
经过 AAEncode 混淆之后的代码:
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
用http://www.hiencode.com/的AAencode解码选项,显示所有原代码:
或者F12,但是只能看到console.log()和alert()想显示的话:
没有输出,而是弹窗显示:
jother
Jother 混淆和 JSFuck 有点儿类似,唯一的区别就是密文比 JSFuck 多了 {}
,其解密方式和 JSFuck 是一样的,Jother 混淆现在不太常见了,也很难找到在线混淆之类的工具了,原作者有个在线页面也关闭了,不过仍然可以了解一下,Jother 混淆具有以下特征:
-
仅由 8 个符号组成:
[]()!+{}
正常的一段代码:
function anonymous( ) { return location }
经过 Jother 混淆之后的代码类似于:
[][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+({}+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+(!![]+[])[+[]]+({}[[]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]])()
也可在 F12中解密执行
JSFUCK
JSFUCK特征:与 jother很像,只是少了 { },仅由 6 个符号组成:[]()!+
正常的一段 JS 代码:
alert(1)
经过 JSFuck 混淆之后的代码类似于:
[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[!+[]+!+[]+[+[]]])
eval(function(p,a,c,k,e,r)加密
特征:以eval(function(p,a,c,k,e,r)为代码开始,例如alert('admin123');let ttt = 1;加密后为:
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('2(\'1\');3 4 = 0;',62,5,'1|admin123|alert|let|ttt'.split('|'),0,{}))
一种非常古老的技术,约2004年,一名南非的JavaScript程序员dean.edwards发明了这种加密技术。巧在密文只是人看不懂而浏览器能执行。
解密方法一:直接在控制台粘贴这句话。缺点:该方法只能显示console.log()和alert()想显示的话。例子中明文的let ttt = 1;就发现不了。
方法二,原理就是把方法一的写在控制台改为写到源代码的script标签里,比方法一好在显示得全。
新建一个html文件,把上面eval替换成document.write,将代码放在script标签里。
方法三:工具网站https://www.w3cschool.cn/tools/index?name=evalencode
附该加密方法的加密函数:
<script>
a = 62;
function encode(js_code) {
var code = js_code;
code = code.replace(/[\r\n]+/g, '');
code = code.replace(/'/g, "\\'");
var tmp = code.match(/\b(\w+)\b/g);
tmp.sort();
var dict = [];
var i, t = '';
for (var i = 0; i < tmp.length; i++) {
if (tmp[i] != t) dict.push(t = tmp[i]);
}
var len = dict.length;
var ch;
for (i = 0; i < len; i++) {
ch = num(i);
code = code.replace(new RegExp('\\b' + dict[i] + '\\b', 'g'), ch);
if (ch == dict[i]) dict[i] = '';
}
return "eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}(" + "'" + code + "'," + a + "," + len + ",'" + dict.join('|') + "'.split('|'),0,{}))";
}
function num(c) {
return (c < a ? '' : num(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36));
}
console.log(encode("alert('admin123');let ttt = 1;"));
</script>
把需要加密的代码alert('admin123');let ttt = 1;例如写在倒数第二行即可,然后打开控制台查收密文。
后端代码加密
意义
-
保护版权。例如通达OA系统(一款办公系统CMS,收费,用于给广大公司搭建内部聊天软件),它怕自己辛苦开发两年投入资金的产品被被人下载源代码,然后基于此修改完善添加功能,改个名字叫张三OA系统和自己竞争,这岂不亏大了。所以将代码加密:
还有File browser的,将整套前后端源码封装成一个exe,别人甚至修改、查看不了源码一个字符,也是一种保护版权方式。
-
黑客遇到加密代码,需要解密才能代码审计
-
绕过WAF的一种方法。把我的后门代码加密,如果安全查杀工具不能识别这种加密方式,就不知道我这是后门代码。
PHP 代码解密后特征
乱码,头部有信息
什么是Zend Guard?
Zend Guard是PHP市场上第一个保护PHP知识产权的代码加密解决方案和电子许可管理方案。
我搞到了通达OAserver端V11版本的代码,其index.php由于加密,字符甚至无法被vs code理解而打不开,记事本能打开:
我用dephp.net解密,但是中文代码还是乱码,不过SeayDZend工具解密倒是成功的很:
注意到乱码文件头部有个Zend,暗示是php文件.
.NET
.NET经常用到DLL封装代码文件,例如从https://dll.website/mysql.data-dll下载了一份MySql.Data.dll文件:
用ILSpy查看(老师推荐),查看的过程涉及反编译:
或者用dnSpy查看:
dnspy是什么?
,它是一款开源的.NET 反编译器和调试器,它允许你查看、编辑、反编译和调试.NET 应用程序。 它还包含一个反汇编器,可以查看汇编代码并将其转换为更易于阅读的格式。 dnSpy 可以运行在 Windows、Linux 和 macOS 上,并支持.NET Framework、.NET Core 和 Mono。
反编译是什么意思?
反编译做的就是编译的相反动作。 举例来说,例如一个程序用C语言来写,写完之后要编译成CPU可以识别和运行的机器代码,也就是生成EXE程序。 而反编译是反过来,把EXE反编译成编程源代码,也就是C程序,不过一般反编译大多数都是从机器码反编译为汇编。
.NET开发到底是什么?:
通常找工作语境中“.net”就是指C#。.NET是微软发布的一个免费的、跨平台的、开源的开发者平台,理论上,各种语言都可以编译成它的IL,在上面运行。.NET开发,就是把它当作目标平台的开发。使用.NET你可以创建不同类型的应用程序。你可以使用多种开发语言、编辑器和工具库创建网页、手机、桌面以及游戏等应用。.NET平台支持的语言有:C#,F#,Visual Basic等等。
实际上,.NET上还分了阶级。C#是全能的亲儿子,ASP/VB/F#是能力较弱的亲儿子,其他语言那是干儿子或者过继的。所以,实际中,你可以认为就是在搞C#了。
什么是IL?
IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL的代码。
举例:
public static void Main()
{
// C#代码
int num1 = 1;
int num2 = 2;
int num3 = num1 + num2;
Console.WriteLine(num3);
} // 对应的IL代码如下
JAVA
类似.net有.dll,JAVA有JAR&CLASS文件,严格来讲,这是反编译,不是加密,反编译属于逆向领域。.dll有dnSpy和ILSpy工具查看,JAR&CLASS文件则可以用IDEA查看。
数据库密文加密
MYSQL MSSQL等数据库会对存储的数据加密,例如mysql5.7会把用户密码的加密密文存储在mysql库user表authentication_string字段中,假设密码是root,那么存储的就是*5395FA61F549F298A56A7525A29ACAED4DA8FF1E
我也不知道为什么密文要设定星号开头。密码加密使用的是单向哈希函数,这意味着无法从加密的值中还原出明文密码。如果密码明文蛮复杂,那么cmd5网站还查不出来。
这个故事是说,若我们通过某手段得到数据库的mysql.user表,或拿到数据库管理员权限继而查看其他用户卡密,得到其他用户的密码密文,若又能解密出来,横向渗透就有了。
数据显示编码
常用的有UTF-8、GBK2312等编码。
若打开网页或文件显示乱码,可以调整下编码:
IE浏览器可以设置编码:
其他浏览器我没有看找到。
编码特征详讲(扩展记得看)
扩展的笔记
编码和加密有什么区别?
编码以在不同的系统中传输或存储数据为目的,编码通常不提供安全性。编码通常是可逆的。明文越长编码越长。
加密以保护数据的机密性为目的。部分加密是可逆。加密更复杂,有的算法还涉及IV、密钥、key、salt。
编码算法们的识别特征
以DES为例解释为什么同样的明文,采用不同的编码方式,得到的加密/编码结果不一样。像这样:
DES本质是对二进制数据进行加密,所以要先将字符"胡"转换成二进制,采用不同的编码方案得到的字符的二进制不一样。所以输出才不一样。
Base 系列编码
Base64 是我们最常见的编码,其实还有 Base16、Base32、Base58、Base85、Base100 等,他们最明显的区别就是使用了不同数量的可打印字符对任意字节数据进行编码,比如 Base64 使用了64个可打印字符(A-Z、a-z、0-9、+、/)(所以base64输出区分大小写),Base16 使用了16个可打印字符(A-F、0-9)
-
Base16:结尾没有等号,数字要多于字母;字符集只有数字0-9以及大写字母ABCDEF
-
Base32:字母要多于数字,明文数量超过10个,结尾可能会有很多等号;字符集只有大写字母(A-Z)和数字234567。
与Base64相比,Base32具有许多优点:
-
适合不区分大小写的文件系统,更利于人类口语交流或记忆。
-
结果可以用作文件名,因为它不包含路径分隔符 “/”等符号。
-
排除了视觉上容易混淆的字符,因此可以准确的人工录入。(例如,RFC4648符号集忽略了数字“1”、“8”和“0”,因为它们可能与字母“I”,“B”和“O”混淆)。
-
Base32比Base16占用的空间更小。Base32比Base64多占用大约20%的空间。
-
-
Base58:结尾没有等号,字母要多于数字;Base58是用于比特币(Bitcoin)中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用容易混淆的数字和字母,数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+“和”/"符号。
-
Base64:一般情况下结尾都会有1个或者2个等号,明文很少的时候可能没有;
Base64编码要求把3个8位字节(3×8=24)转化为4个6位的字节(4×6=24),之后在6位的前面补两个0,形成8位一个字节的形式。如果剩下的字符不足3个字节,则用0填充,输出字符使用‘=’,因此编码后输出的文本末尾可能会出现1或2个‘=’。
-
Base85:特点是奇怪的字符比较多,等号一般出现在字符串中间;
-
Base100:密文由 Emoji 表情组成。Base100编码/解码工具(又名:Emoji表情符号编码/解码)
Unicode 编码
以 \u
、&#
或 &#x
开头,后面是数字加字母组合。\u
开头和 &#x
开头是Unicode且16进制,&#
则是 Unicode 字符且10进制。如汉字示例这 这
、字母示例t t
、数字符号示例5 5
在某些UTF-8编码网站上(英文和数字是土著,不需要编码,所以只有外文和UTF-8互转按钮):
将得到的结果拿去Unicode解码:
会发现明文也解对了。
Unicode编码和UTF-8编码区别
UTF-8编码是Unicode的一种实现方式,它保持了与ASCII编码的兼容性,也可以表示Unicode字符集中的所有字符。Unicode方案的每个字符都要占固定字节位数,例如0x0001明明可以省略成0x1,而UTF-8编码则根据字符的不同范围,采用1到4个字节的不等长度进行编码,大大节省空间。
Ascii编码
\x44\x61\x74\x65,这种\x开头是什么编码?
\x44\x61\x74\x65 是一种表示ASCII字符的转义序列编码。它是十六进制的表示方式,每个\x后面跟着两个十六进制数字,表示一个ASCII字符的编码,所以它表示Date。这种表示方式常用于在字符串中插入特殊字符或不可见字符,或者在编程语言中直接使用ASCII字符的编码值。
![]()
Escape 编码
Escape 编码又叫 %u 编码,Escape 编码就是字符对应 的UTF-16BE 表示方式前面加 %u,Escape 不对 字母和数字和* @ - _ + . /
符号进行编码, 其他则编码。其主要特征以 %u
开头,后面是数字加字母组合。因为目前%字符,常用作URL编码,所以%u这样编码已经逐渐被废弃了!
编码类型 | 示例一 | 示例二 |
---|---|---|
明文 | K哥爬虫 | 我爱Python |
Escape | K%u54E5%u722C%u866B |
%u6211%u7231Python |
UTF-8 | K哥爬虫 |
略 |
URL / Hex 编码
URL 和 Hex 编码的结果是一样的,不同的是当你用 URL(encodeURI) 编码网址时是不会把 http
、https
关键字和 /
、?
、&
、=
等连接符以及字母数字进行编码的,但URL(encodeURIComponent)相比URL(encodeURI)会对 /
、?
、&
、=
等连接符下手,而 Hex 编码则将所有符号全部转化了。URL编码结果的主要特征以 %
开头,后面是数字加字母组合。hex编码结果一般不带%的,这也是大多数网站的做法:
encodeURIComponent() 函数 与 encodeURI() 函数的区别 encodeURIComponent() 函数将转义用于分隔 URI 各个部分的标点符号如://如?
明文 | https://www.sojson.com/encodeurl.html?我是个中文参数123 |
---|---|
URL(encodeURI) | https://www.sojson.com/encodeurl.html?%E6%88%91%E6%98%AF%E4%B8%AA%E4%B8%AD%E6%96%87%E5%8F%82%E6%95%B0123 |
URL(encodeURIComponent) | https%3A%2F%2Fwww.sojson.com%2Fencodeurl.html%3F%E6%88%91%E6%98%AF%E4%B8%AA%E4%B8%AD%E6%96%87%E5%8F%82%E6%95%B0123 |
Hex | %68%74%74%70%73%3A%2F%2F%77%77%77%2E%73%6F%6A%73%6F%6E%2E%63%6F%6D%2F%65%6E%63%6F%64%65%75%72%6C%2E%68%74%6D%6C%3F%E6%88%91%E6%98%AF%E4%B8%AA%E4%B8%AD%E6%96%87%E5%8F%82%E6%95%B0%31%32%33 |
HTML实体编码
用一个编号写入HTML代码中来代替一个字符,在使用浏览器访问网页时会将这个编号解析还原为字符以供阅读。例如<是<
。这是为解决HTML代码编写中的一些问题。例如需要在网页上显示小于号<和大于号>,由于它们是HTML的预留标签,可能会被误解析,用<
代替<。
邮件编码之UUencode编码
UUencode是一种二进制到文字的编码!它不是MIME编码中一员。最早在unix 邮件系统中使用,全称:Unix-to-Unix encoding。它也是定义了用可打印字符表示二进制文字一种方法,并不是一种新的编码集合。Uuencode将输入文本以每三个字节为单位进行编码,如果最后剩下的资料少于三个字节,不够的部份用零补齐(所以有时解码出的明文末尾会有乱码符)。三个字节共有24个Bit,以6-bit为单位分为4个组,每个组以十进制来表示所出现的字节的数值。这个数值只会落在0到63之间。然后将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中。因为对所有文本都会编码一次可读性不是很好!
密码算法们的识别特征
MD5
-
密文一般为 16 位或者 32 位,其中 16 位是取的 32 位第 9~25 位的值;
-
组成方式为字母(a-f)和数字(0-9)混合,对输出大小写不敏感。
-
PS:某些特殊情况下,密文的长度也有可能不止 16 位或者 32 位,有可能是在官方算法上有一些魔改,通常也是在 16 位的基础上,左右填充了一些随机字符串。
示例:
编码类型 | 示例一 | 示例二 |
---|---|---|
明文 | 123456 | admin |
MD5(16位小写) | 49ba59abbe56e057 |
7a57a5a743894a0e |
MD5(16位大写) | 49BA59ABBE56E057 |
7A57A5A743894A0E |
MD5(32位小写) | e10adc3949ba59abbe56e057f20f883e |
21232f297a57a5a743894a0e4a801fc3 |
MD5(32位大写) | E10ADC3949BA59ABBE56E057F20F883E |
21232F297A57A5A743894A0E4A801FC3 |
SHA 系列
SHA 是比 MD5 更安全一点的摘要算法。 SHA 家族算法包括 SHA-1、SHA-2、SHA-3,其中 SHA-2 是 SHA-224、SHA-256、SHA-384、SHA-512 的并称,SHA-3 是 SHA3-224、SHA3-256、SHA3-384、SHA3-512、SHAKE128、SHAKE256 的并称,其名字的后缀的数字就代表了结果的大小(bit),注意,SHAKE 算法结果的大小并不是固定的,其他算法特征如下:
-
SHA-1:字母(a-f)和数字(0-9)混合(特征跟MD5差不多),只不过位数 40 位;
-
SHA-224/SHA3-224:字母(a-f)和数字(0-9)混合,固定位数 56 位;
-
SHA-256/SHA3-256:字母(a-f)和数字(0-9)混合,固定位数 64 位;
-
SHA-384/SHA3-384:字母(a-f)和数字(0-9)混合,固定位数 96 位;
-
SHA-512/SHA3-512:字母(a-f)和数字(0-9)混合,固定位数 128 位。
示例:
编码类型 | 示例 |
---|---|
明文 | 123456 |
SHA-1 | 7c4a8d09ca3762af61e59520943dc26494f8941b |
SHA-256 | 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 |
SHA3-256 | c888c9ce9e098d5864d3ded6ebcc140a12142263bace3a23a36f9905f12bd64a |
HMAC 系列
HMAC (Hash-based Message Authentication Code) 这种算法常用于接口签名验证,就是在 MD5、SHA 两种加密的基础上引入了秘钥,而秘钥又只有传输双方才知道,所以基本上是破解不了的。其密文也和 MD5、SHA 类似,密文的长度和使用的 MD5、SHA 算法对应密文的长度是一样的。特征如下:
-
HMAC-MD5:字母(a-f)和数字(0-9)混合,位数一般为 32 位;
-
HMAC-SHA-1:字母(a-f)和数字(0-9)混合,固定位数 40 位;
-
HMAC-SHA-224 / HMAC-SHA3-224:字母(a-f)和数字(0-9)混合,固定位数 56 位;
-
HMAC-SHA-256 / HMAC-SHA3-256:字母(a-f)和数字(0-9)混合,固定位数 64 位;
-
HMAC-SHA-384 / HMAC-SHA3-384:字母(a-f)和数字(0-9)混合,固定位数 96 位;
-
HMAC-SHA-512 / HMAC-SHA3-512:字母(a-f)和数字(0-9)混合,固定位数 128 位。
HMAC 和 SHA、MD5 的密文都很像,当无法确定是否为 HMAC 时,可以通过其名称搜索到加密方法,如果传入了密钥 key,说明就是 HMAC,当然你也可以直接当做是 SHA 或 MD5 来解,解密失败时就得考虑是否有密钥,是否为 HMAC 了,在 JS 中,通常一个 HMAC 加密方法是这样写的:
function HmacSHA1Encrypt(word, key) {
return CryptoJS.HmacSHA1(word, key).toString();
}
示例(密钥 123456abcde):
编码类型 | 示例 |
---|---|
明文 | 123456 |
HMAC-MD5 | 432bb95bb00005ddce4a1c757488ed95 |
HMAC-SHA-1 | 37a04076b7736c44460d330ee0d00014428b175e |
HMAC-SHA-256 | 50cb1345366df11140fb91b43caaf69627e3f5529705ddf6b0d0cae67986e585 |
HMAC-SHA3-256 | b808ed9f66436e89fba527a01d1d6044318fea8599d9f39bfb6bec4843964bf3 |
RSA
公钥加密,私钥解密。 同样私钥加密,公钥可以解密。在网站中通常使用 JSEncrypt 库来实现,其最大的特征就是有一个设置公钥的过程,我们可以通过以下方法来快速初步判断是否为 RSA 算法:
-
搜索关键词
new JSEncrypt()
,JSEncrypt
等,一般会使用 JSEncrypt 库,会有 new 一个实例对象的操作; -
搜索关键词
setPublicKey
、setKey
、setPrivateKey
、getPublicKey
等,一般实现的代码里都含有设置密钥的过程; -
RSA 的私钥、公钥、明文、密文长度也有一定对应关系,也可以从这方面初步判断:
私钥长度(Base64) 公钥长度(Base64) 明文长度 密文长度 428 128 1~53 88 812 216 1~117 172 1588 392 1~245 344
AES、DES、3DES(Triple DES)、RC4、Rabbit 等
对称加密又分为分组密码(也叫块加密(block cyphers))和序列密码(也叫流加密(stream cyphers))。 分组密码:一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。 序列密码:一次加密明文中的一个位。是指利用少量的密钥(制乱元素)通过某种复杂的运算(密码算法)产生大量的伪随机位流,用于对明文位流的加密。 解密是指用同样的密钥和密码算法及与加密相同的伪随机位流,用以还原明文位流。
分组加密算法中,有ECB,CBC,CFB,OFB这几种加密模式。
这些都是对称性加密算法,密文通常没有固定的长度,他们通常使用 crypto-js 来实现,比如 AES 加解密示例如下:
CryptoJS = require("crypto-js")
var key = CryptoJS.enc.Utf8.parse("0123456789abcdef");
var iv = CryptoJS.enc.Utf8.parse("0123456789abcdef");
function AESEncrypt(word) {
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
function AESDecrypt(word) {
var srcs = word;
var decrypt = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypt.toString(CryptoJS.enc.Utf8);
}
console.log(AESEncrypt("K哥爬虫"))
console.log(AESDecrypt("nSk3wCd92s08sQ9N+VHNvA=="))
在 crypto-js 中,也有一些特定的关键字,我们可以通过搜索这些关键字来快速定位到 crypto-js:
-
CryptoJS
、crypto-js
、iv
、mode
、padding
、createEncryptor
、createDecryptor
-
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
、0xffffffff
、0xffff
定位到 CryptoJS 后,观察加密方法,比如 AES 就是 CryptoJS.AES.encrypt
,DES 就是 CryptoJS.DES.encrypt
,3DES 就是 CryptoJS.TripleDES.encrypt
,注意他的 iv、mode、padding,拿下来就可以本地复现了。
附:为什么AES亦或DES等某些加密算法在同秘钥加密时每次结果都不一样,并且还能解密成功?
这是因为模式如CBC还有IV初始向量的不同,如果使用的是CryptoJS库,库还会key即123加了salt,也就是每次加密的密钥都不一样,于是就是双重随机。IV可能是系统/网站帮忙自动生成的,我们不知道,但是"写"在了密文里,所以每次加密的结果不同但解密结果一样。
SM 系列
SM 代表商密,即商业密码,是我国发布的一系列国产加密算法,SM 系列包括:SM1、SM2、SM3 、SM4、SM7、SM9,其中 SM1 和 SM7 的算法不公开,SM 系列算法在我国一些 gov 网站上有应用,有关国产加密算法 K 哥前期文章有介绍:,本文不再赘述。
在 SM 的 JavaScript 代码中一般会存在以下关键字,可以通过搜索关键字定位:
-
SM2
、SM3
、SM4
-
FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
-
FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
-
28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
-
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
-
getPublicKeyFromPrivateKey
、doEncrypt
、doDecrypt
、doSignature
VBScript.Encode
工具网站http://www.cftea.com/tools/online/vbscriptDecode/
许多多VBScript代码都使用VBScript.Encode进行了加密保护。其实并不是加密(encrypt)而仅仅是编码(encode),只不过乍一看是乱码,好像被加密过一样。
VBScript.Encode是什么?
VBScript.Encode 是一种内置的 VBScript 函数,用于将 VBScript 代码编码为一串字符序列。这个函数在 VBScript 中被用于保护代码的安全性,防止未经授权的访问或修改。VBScript.Encode 并不提供加密,只是简单的编码转换方式。
<%@ Language=VBScript.Encode%>
#@~^PQAAAA==@!u@#@&9ksP/DD@#@&/DD~',J^WD+lr@#@&"+/aGU/•RqDrYnckY.#@#@&]@*Ig8AAA==^#~@
非对称密码体系之RSA
常用解密工具:RSAtool
非对称密码体系之DSA(Digital Signature Algorithm)
DSA是Schnorr和ElGamal签名算法的变种。它是一种公开密钥算法,不能用作加密,只用作数字签名。DSA使用公开密钥,为接受者验证数据的完整性和数据发送者的身份。它也可用于由第三方去确定签名和所签数据的真实性。
原理是真不想看,等用到工具的时候再看吧,不然不会用工具:
非对称密码体系之ECC
Elliptic Curves Cryptography(椭圆曲线密码编码学)(ECC)是一种公钥加密体制,最初由Koblitz和Miller两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。公钥密码体制根据其所依据的难题一般分为三类:大整数分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。
混淆系列
Obfuscator
Obfuscator 就是混淆的意思,简称 OB 混淆,实战可参考K哥以前的文章:,OB 混淆具有以下特征:
-
一般由一个大数组或者含有大数组的函数、一个自执行函数、解密函数和加密后的函数四部分组成;
-
函数名和变量名通常以
_0x
或者0x
开头,后接 1~6 位数字或字母组合; -
自执行函数,进行移位操作,有明显的 push、shift 关键字;
一段正常的代码如下:
function hi() {
console.log("Hello World!");
}
hi();
经过 OB 混淆后的结果:
function _0x3f26() {
var _0x2dad75 = ['5881925kTCKCP', 'Hello\x20World!', '600mDvfGa', '699564jYNxbu', '1083271cEvuvT', 'log', '18sKjcFY', '214857eMgFSU', '77856FUKcuE', '736425OzpdFI', '737172JqcGMg'];
_0x3f26 = function () {
return _0x2dad75;
};
return _0x3f26();
}
(function (_0x307c88, _0x4f8223) {
var _0x32807d = _0x1fe9, _0x330c58 = _0x307c88();
while (!![]) {
try {
var _0x5d6354 = parseInt(_0x32807d(0x6f)) / 0x1 + parseInt(_0x32807d(0x6e)) / 0x2 + parseInt(_0x32807d(0x70)) / 0x3 + -parseInt(_0x32807d(0x69)) / 0x4 + parseInt(_0x32807d(0x71)) / 0x5 + parseInt(_0x32807d(0x6c)) / 0x6 * (parseInt(_0x32807d(0x6a)) / 0x7) + -parseInt(_0x32807d(0x73)) / 0x8 * (parseInt(_0x32807d(0x6d)) / 0x9);
if (_0x5d6354 === _0x4f8223) break; else _0x330c58['push'](_0x330c58['shift']());
} catch (_0x3f18e4) {
_0x330c58['push'](_0x330c58['shift']());
}
}
}(_0x3f26, 0xaa023));
function _0x1fe9(_0xa907e7, _0x410a46) {
var _0x3f261f = _0x3f26();
return _0x1fe9 = function (_0x1fe950, _0x5a08da) {
_0x1fe950 = _0x1fe950 - 0x69;
var _0x82a06 = _0x3f261f[_0x1fe950];
return _0x82a06;
}, _0x1fe9(_0xa907e7, _0x410a46);
}
function hi() {
var _0x12a222 = _0x1fe9;
console[_0x12a222(0x6b)](_0x12a222(0x72));
}
hi();
Brainfuck (BF)
Brainfuck 实际上是一种极小化的计算机语言,又称为 BF 语言,该语言以其极简主义着称,仅包含八个简单的命令、一个数据指针和一个指令指针,这种语言在爬虫领域也可以是一种反爬手段,可以视为一种混淆方式,虽然不常见?,这里给一个在线体验的网址:https://copy.sh/brainfuck/text.html,感兴趣的同志可以深入研究一下,Brainfuck 具有以下特征:
-
仅由
<>+-.[]
组成; -
大量的
+-
符号。
正常的一段代码:
alert("Hello, Brainfuck")
经过 Brainfuck 混淆之后的代码类似于:
--[----->+<]>-----.+++++++++++.-------.+++++++++++++.++.+[--->+<]>+.------.++[->++<]>.-[->+++++<]>++.+++++++..+++.[->+++++<]>+.------------.+[->++<]>.---[----->+<]>-.+++[->+++<]>++.++++++++.+++++.--------.-[--->+<]>--.+[->+++<]>+.++++++++.+[++>---<]>.+++++++.
Ook!
Ook! 和 Brainfuck 的原理都是类似的,只不过符号有差异,同样的,这种语言在爬虫领域也可以是一种反爬手段,可以视为一种混淆方式,虽然不常见?,在线体验的网址:https://www.splitbrain.org/services/ook ,Ook! 具有以下特征:
-
完整 Ook!:仅由 3 种符号组成
Ook.
、Ook?
、Ook!
-
Short Ook!:仅由 3 种符号组成
.!?
正常的一段代码:
alert("Hello, Ook!")
经过 Ook! 混淆之后的代码类似于:
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook.
13种最为荒谬的编程语言
原文https://news.mydrivers.com/1/190/190926.htm
Ook!和brainFuck是其中两种。
Trivial brainfuck substitution
Trivial brainfuck substitution 不是一种单一的编程语言,而是一大类编程语言,成员超过 20 个,前面提到的 Brainfuck、Ook! 都是其中的一员,在爬虫领域中,说实话这种稀奇古怪的混淆其实并不常见,但是在一些 CTF 中有可能会出现,作为爬虫工程师也可以了解了解?,具体可以参考:https://esolangs.org/wiki/Trivial_brainfuck_substitution
其他小众密码/编码算法
凯撒密码、维吉尼亚密码、栅栏密码基础型、栅栏密码W型,这几类密码原理都是移位调换加密,破解难度低。
恺撒密码
只对字母进行加密,常用于CTF比赛中。恺撒密码(Caesar cipher)又称为恺撒加密、恺撒变换、变换加密,它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是 3 的时候,所有的字母 A 将被替换成 D,B 变成 E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。
根据偏移量的不同,还存在若干特定的恺撒密码名称:偏移量为10:Avocat(A→K);偏移量为13:ROT13;偏移量为-5:Cassis (K 6);偏移量为-6:Cassette (K 7)
示例(偏移量 3):
-
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
-
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
维吉尼亚密码
可以说是凯撒密码的加强版,引入了密钥,它将凯撒密码的全部25种位移排序为一张表,与原字母序列共同组成26行及26列的字母表。另外,维吉尼亚密码必须有一个密钥,这个密钥由字母组成,最少一个,最多可与明文字母数量相等。维吉尼亚密码表如下:
示例:
-
明文:I've got it.
-
密钥:ok
-
密文:W'fs qcd wd.
首先,密钥长度需要与明文长度相同,如果少于明文长度,则重复拼接直到相同。示例的明文长度为8个字母(非字母均被忽略),密钥会被程序补全为 okokokok
,然后根据维吉尼亚密码表进行加密:明文第一个字母是 I
,密钥第一个字母是 o
,在表格中找到 I
列与 o
行相交点,字母 W
就是密文第一个字母,同理,v
列与 k
行交点字母是 F
,e
列与 o
行交点字母是 S
,以此类推。注意:维吉尼亚密码只对字母进行加密,不区分大小写,若文本中出现非字母字符会原样保留,如果输入多行文本,每行是单独加密的。
仿射密码 Affine Cipher
凯撒密码是步长为1的字母替换,仿射密码的步长可以很跳跃,仿射密码算是凯撒密码的强化版。
-
将字符集中的每个字符转换为对应的数字或字母,例如,字符集为26个字母,将字母 A 映射为 0,字母 B 映射为 1,以此类推,H为7。
-
设密钥K=(a,b)= (7, 3),明文hot,三个字母对应的数值是7、14和19。对于明文的每个字符,应用以下公式去加密:C = (a * P + b) mod n,其中 C 是密文字符,a 和 b 是密钥中的参数,P 是明文字符对应的数值,n 是字符集或字母表的大小:
(7×7 + 3) mod 26 = 52 mod 26 =0
(7×14 + 3) mod 26 = 101 mod 26 =23
(7×19 + 3) mod 26 =136 mod 26 =6
三个密文数值为0、23和6
-
使用与加密相同的映射去转换密文0 23 6为AXG。所以密文AXG。
埃特巴什码(Atbash Cipher)
还是凯撒密码的变种。
最后一个字母代表第一个字母,倒数第二个字母代表第二个字母。
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBA
栅栏密码标准型/基础型/传统型
就是把要加密的明文的字母分成 N 个一组(不看空格),然后把每组的第 1 个字连起来,形成一段无规律的话。栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多,一般不超过 30 个。
示例:明文为 THE LONGEST DAY MUST HAVE AN END。加密时,把将要传递的信息中的字母交替排成上下两行:
T E O G S D Y U T A E N N
H L N E T A M S H V A E D
将下面一行字母排在上面一行的后边组合成密文:
TEOGSDYUTAENNHLNETAMSHVAED
栅栏密码W型
栅栏密码还有一种变种,称为栅栏密码 W 型,它会先把明文类似 W 形状进行排列,然后再按栏目顺序 1-N,取每一栏的所有字符值,组成加密后密文,比如字符串 123456789,采用栏目数为 3 时,明文将采用如下排列:
1 5 9
2 4 6 8
3 7
取每一栏所有字符串,组成加密后密文:159246837
比较搞笑的是,栅栏密码W型和基础型,在不同的网站上不仅具体含义(实现方式)不同,同样的输入还不一样的结果。实战遇到了,解密解不出来就两个网站都试试。
猪圈密码
猪圈密码也称为朱高密码、共济会暗号、共济会密码或共济会员密码,是一种以格子为基础的简单替代式密码。只能对字母加解密并且复制粘贴符号如后会直接显示明文a,即使使用符号,也不会影响密码分析,亦可用在其它替代式的方法。曾经是美国内战时盟军使用的密码,目前仅在密码教学、各种竞赛中使用。
摩斯密码
摩斯密码(Morse code),又称为摩尔斯电码、摩斯电码,是一种时通时断的信号代码,这种信号代码通过不同的排列顺序来表达不同的英文字母、数字和标点符号等。
26个字母的摩斯密码表
字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 |
---|---|---|---|---|---|---|---|
A | .━ | B | ━ ... | C | ━ .━ . | D | ━ .. |
E | . | F | ..━ . | G | ━ ━ . | H | .... |
I | .. | J | .━ ━ ━ | K | ━ .━ | L | .━ .. |
M | ━ ━ | N | ━ . | O | ━ ━ ━ | P | .━ ━ . |
Q | ━ ━ .━ | R | .━ . | S | ... | T | ━ |
U | ..━ | V | ...━ | W | .━ ━ | X | ━ ..━ |
Y | ━ .━ ━ | Z | ━ ━ .. |
10个数字的摩斯密码表
字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 |
---|---|---|---|---|---|---|---|
0 | ━ ━ ━ ━ ━ | 1 | .━ ━ ━ ━ | 2 | ..━ ━ ━ | 3 | ...━ ━ |
4 | ....━ | 5 | ..... | 6 | ━ .... | 7 | ━ ━ ... |
8 | ━ ━ ━ .. | 9 | ━ ━ ━ ━ . |
标点符号的摩斯密码表
字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 |
---|---|---|---|---|---|---|---|
. | .━ .━ .━ | : | ━ ━ ━ ... | , | ━ ━ ..━ ━ | ; | ━ .━ .━ . |
? | ..━ ━ .. | = | ━ ...━ | ' | .━ ━ ━ ━ . | / | ━ ..━ . |
! | ━ .━ .━ ━ | ━ | ━ ....━ | _ | ..━ ━ .━ | " | .━ ..━ . |
( | ━ .━ ━ . | ) | ━ .━ ━ .━ | $ | ...━ ..━ | & | . ... |
@ | .━ ━ .━ . |
培根密码
培根密码,又名倍康尼密码(Bacon's cipher)是由法兰西斯·培根发明的一种隐写术,它是一种本质上用二进制数设计的,没有用通常的0和1来表示,而是采用a和b,看到一串的a和b,并且五个一组,那么就是培根加密了。
第一种方式:
字符 | 培根密码 | 字符 | 培根密码 | 字符 | 培根密码 | 字符 | 培根密码 |
---|---|---|---|---|---|---|---|
A | aaaaa | H | aabbb | O | abbba | V | babab |
B | aaaab | I | abaaa | P | abbbb | W | babba |
C | aaaba | J | abaab | Q | baaaa | X | babbb |
D | aaabb | K | ababa | R | baaab | Y | bbaaa |
E | aabaa | L | ababb | S | baaba | Z | bbaab |
F | aabab | M | abbaa | T | baabb | ||
G | aabba | N | abbab | U | babaa |
字符 | 培根密码 | 字符 | 培根密码 | 字符 | 培根密码 | 字符 | 培根密码 |
---|---|---|---|---|---|---|---|
a | AAAAA | h | AABBB | p | ABBBA | x | BABAB |
b | AAAAB | i-j | ABAAA | q | ABBBB | y | BABBA |
c | AAABA | k | ABAAB | r | BAAAA | z | BABBB |
d | AAABB | l | ABABA | s | BAAAB | ||
e | AABAA | m | ABABB | t | BAABA | ||
f | AABAB | n | ABBAA | u-v | BAABB | ||
g | AABBA | o | ABBAB | w | BABAA |
-
明文:kuaidaili
-
密文:ABABABABAAAAAAAABAAAAAABBAAAAAABAAAABABBABAAA
与佛论禅
字符串转换后,是一些佛语,在线体验:https://ctf.bugku.com/tool/todousharp
示例:
-
明文:K哥爬虫
-
密文:佛曰:哆室梵阿俱顛哆礙孕奢大皤帝罰藝哆伽密謹爍舍呐栗皤夷密;
-
也可能是,密文:佛曰:知缽遮咒伊奢南俱訶摩諳波呐南呐殿跋奢得罰尼所涅梵漫老哆等諳爍怯無所利奢南皤蘇冥伊咒怯室梵室俱羯冥度呐波侄呼
有趣的是在工具网站上,相同输入,每次加密结果不一样,这是因为与佛论禅每次加密使用的密码表不一样。但是放心,都能解密出相同明文。
当铺密码
当铺密码在 CTF 比赛题目中出现过。该加密算法是根据当前汉字有多少笔画出头,对应的明文就是数字几。缺点很明显,看起来就不可逆,用途类似hash校验还是可以的。
示例:
-
明文:王夫 井工 夫口 由中人 井中 夫夫 由中大
-
密文:67 84 70 123 82 77 125
百家姓暗号
特征:不要多说当你看到一串百家姓的时候多半就是这个暗号了
当他解密的的时候前面会多一串固定字符
卡尔达诺栅格码
特征:把明文伪装成垃圾邮件,看着这么多内容,其实我只是加密了admin
常用解密网站:
https://www.spammimic.com/ (开美国vpn访问)
莫尔斯电码 / 摩斯电码
特征:密文由不规律的.
、-
组成
-
Morse alphabet是一种时通时断的信号代码,这种信号代码通过不同的排列顺序来表达不同的英文字母、数字和标点符号等。
-
摩尔密码加密的字符只有字符,数字,标点,不区分大小写,支持中文汉字
Quoted-Printable编码
这种编码常用与邮件处理,只能对汉字进行编码,特征是=加两个大写字母或数字组合
常用解密网站:
ROT13/5/18/47
特征:它与凯撒密码差不多都是字母替换,你看到一句特别奇怪的语句例如“gryy zr lbhe anzr.”可能就是它编码的
ROT13(回转13位,Template:lang,有时中间加了个减号称作ROT-13)是一种简易的置换暗码。它是一种在网络论坛用作隐藏八卦(spoiler)、妙句、谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥。ROT13也是过去在古罗马开发的凯撒加密的一种变体。
工具网站:https://wtool.com.cn/rot13.html
其实还有ROT5/18/47,工具网站:https://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php
文本加密为汉字
特征:将明文加密成各种繁体字后面带俩等号
它不仅可以加密成汉字,还可以加密成以下几种类型
比如这样:
这样:
常用解密网站:https://www.qqxiuzi.cn/bianma/wenbenjiami.php
查尔斯加密(playfair解密)
仅了解。效果不是很好,解密出的明文有的字符是错的。
ppencode
它能把Perl代码转换成只有英文字母的字符串。
rrencode(把ruby代码全部转换成符号)
太小众了,甚至无法找到一个在线工具网站
serpent加密/解密
serpent译为蛇。原理没看懂,贴博客:https://blog.csdn.net/douqingl/article/details/50256931
手机键盘加密
利用九键键盘进行加密,其特征为第一个字母不会是1,第二个字母不会超过4
例如A在数字2的第一个位置上,所以A=21。
QWE密码
指的是QWE格式键盘布局按 从左往右QWERTYUIOP ASDFGHJKL ZXCVBNM排列顺序一一对照英文字母表,如下:
QWE加密表:
QWE解密表:
曲路密码
是一种换位密码,需要事先双方约定密钥(行列数)。
明文:The quick brown fox jumps over the lazy dog 填入5行7列表(事先约定好的行列数)
加密的回路线(事先约定好的行列数)
密文:gesfc inpho dtmwu qoufy…
盲文
1.数字盲文
2.字母盲文:
Playfair cipher 或 Playfair square
有三个小众密码算法加解密网站
Playfair密码是一种使用一个关键词方格来加密字符对的加密法,1854年由查尔斯·惠斯通(Charles Wheatstone)的英国人发明。
其加密步骤如下:
1.选取一段英文字母,去除重复出现的字母,将剩下字母逐个加入5*5矩阵中,剩下空间由未加入英文字母依a~z顺序加入。(q去除,i和j视为同一字母)。得到密钥。
2.将要加密明文分为俩个一组,若组内字母相同,将X或Q加到该组第一个字母后,重新分组。若剩下一个字母,也加入X或Q
3.在每组中,找出俩个字母在矩阵的位置,其规则如下: (1)若俩个字母不同行也不同列,在矩阵中找出另外俩个字母,使这四个字母成为一个长方形的四个角 (2)若俩个字母同行,取这俩个字母的右方字母,若字母在最右方,取最左方字母 (3)若俩个字母同列,取这俩个字母的下方字母,若字母在最下方,取最上方字母
工具网站http://www.practicalcryptography.com/ciphers/classical-era/playfair/
棋盘密码 / Polybius Square Cipher
公元前两世纪是由一位希腊人提出的,人们称之为棋盘密码,原因为该密码将26个字母放在5×5的方格里,i,j放在一个格子里,具体情况如下表所示
这样,每个字母就对应了由两个数(坐标),例如字母c对应13,s对应43,以此类推。如果接收到密文为
43 15 13 45 42 15 32 15 43 43 11 22 15
则对应的明文即为secure message。
在https://cryptii.com/pipes/nihilist-cipher里发现,棋盘密码可以不按上图的排列法(映射法)映射。
Nihilist 加密法
基于Polybius Square Cipher的变体,其步骤如下:
第一步,选取一个关键词已构成Polybius方格,即在5*5矩阵中填写关键词(去重),然后继续在其中按顺序填写字母表的其余字母。
第二步,选取的明文,利用以上的Polynius方格将其转换为数字(先行后列)。
工具网站https://cryptii.com/pipes/nihilist-cipher
Hill密码(希尔密码)
(1)加密:密文=明文*密钥矩阵 (注:明文要被分割成与密钥维数相同的一维行列式) (2)解密:明文=密文*密钥矩阵的逆 (注:要求与加密过程相同)
加密:
解密:
Autokey Cipher(自动密钥密码)
自动密钥密码是密码学中的一种加密算法,与维吉尼亚密码类似,区别在于密钥不同。它的密钥开头是一个关键词,之后则是明文的重复。
示例
加密解密时使用的表格下面演示的是一种自动密钥密码的加密方法。先假设关键词为QUEENLY,而文本信息为ATTACK AT DAWN,则自动生成的密钥为"QUEENLYATTACKDAWN"。之后再通过维吉尼亚密码的表格法生成密文:
明文:ATTACK AT DAWN… 密钥:QUEENL YA TTACK AT DAWN… 密文:QNXEPV YT WTWP…
破译方法 假设明文为MEET AT THE FOUNTAIN,关键词为KILT:
明文:MEETATTHEFOUNTAIN(未知) 密钥:KILTMEETATTHEFOUN(未知) 密文:WMPMMXXAEYHBRYOCA(已知) 我们尝试一些常用单词、双字母组、三字母组等在密钥中的可能位置,如THE:
密文:WMP MMX XAE YHB RYO CA 密钥:THE THE THE THE THE … 明文:DFL TFT ETA FAX YRK …
密文:W MPM MXX AEY HBR YOC A 密钥:. THE THE THE THE THE . 明文:. TII TQT HXU OUN FHY .
密文:WM PMM XXA EYH BRY OCA 密钥:… THE THE THE THE THE 明文:… WFI EQW LRD IKU VVW 我们将这些明文片段按出现的可能性排列:
不可能 <-------------------------->最可能 EQW DFL TFT … … … … ETA OUN FAX 由于正确的明文片段同样也会出现在密钥中,因此可以将其偏移关键词的长度而得到密钥片段。同样地,我们猜测的密钥片段THE也会出现在明文中。因此,猜测关键词的长度(譬如说3到12之间),我们就能得到明文和密钥。
尝试OUN可能得到:
偏移4位: 密文:WMPMMXXAEYHBRYOCA 密钥:…ETA.THE.OUN 明文:…THE.OUN.AIN
偏移5位: 密文:WMPMMXXAEYHBRYOCA 密钥:…EQW…THE…OU 明文:…THE…OUN…OG
偏移6位: 密文:WMPMMXXAEYHBRYOCA 密钥:…TQT…THE…O 明文:…THE…OUN…M 看起来偏移量为4时的可能性最大(其他的都含有不太可能出现的Q),因此我们再将新得到的ETA偏移4位:
密文:WMPMMXXAEYHBRYOCA 密钥:…LTM.ETA.THE.OUN 明文:…ETA.THE.OUN.AIN 我们知道了关键词的长度很可能是4位(以LT结尾),且已有了文本的一部分:
M.ETA.THE.OUN.AIN 之后以此为依据再进行一些猜测,可以验证如下是真正的明文:
MEETATTHEFOUNTAIN
ADFGVX密码
ADFGVX密码是德军在第一次世界大战中使用的栏块密码。
假设我们需要发送明文讯息 “Attack at once”, 用一套秘密混杂的字母表填满 Polybius 方格,像是这样:
在这里插入图片描述
i 和 l 视为同个字,使字母数量符合 5 × 5 格。之所以选择这五个字母,是因为它们译成摩斯密码时不容易混淆,可以降低传输错误的机率。使用这个方格,找出明文字母在这个方格的位置,再以那个字母所在的栏名称和列名称代替这个字母。可将该讯息可以转换成处理过的分解形式。
在这里插入图片描述
下一步,利用一个移位钥匙加密。假设钥匙字是"CARGO",将之写在新格子的第一列。再将上一阶段的密码文一列一列写进新方格里。
C A R G O
A F A D A
D A F G F
D X A F A
D D F F X
G F X F X
最后,按照钥匙字字母顺序「ACGOR」依次抄下该字下整行讯息,形成新密文。如下:
FAXDF ADDDG DGFFF AFAXX AFAFX
在实际应用中,移位钥匙字通常有两打字符那么长,且分解钥匙和移位钥匙都是每天更换的。
ADFGVX
在 1918年 6月,再加入一个字 V 扩充。变成以 6 × 6 格共 36 个字符加密。这使得所有英文字母(不再将 I 和 J 视为同一个字)以及数字 0 到 9 都可混合使用。这次增改是因为以原来的加密法发送含有大量数字的简短信息有问题。
TEA(Tiny Encryption Algorithm)
TEA算法由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明。它是一种分组密码算法,其明文密文块为64比特,密钥长度为128比特。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密是不同,该加密算法的迭代次数可以改变,建议的迭代次数为32轮。
文本隐藏加密
特征:加密过的密文会比原文的字节数多,当你按删除键的时候会发现某一处要按好多下才能把前面的字删掉。原理:在密文中加入了不可见字符组成的编码,例如上述看似九个字符的一句话,通过字数查询可知它实际上有87个字符,多出的字符是由零宽空格实现的编码,因为零宽空格显示上不占据空间,所以看不出它的存在。
应用:
-
存储隐藏信息。比如隐藏加密存储比特币钱包,或者在你的代码里埋下一个彩蛋
-
秘密传达消息。
-
零宽字符在大部分应用都支持,你可以将密文加密到普通文本中,然后邮件发送,表面上看起来是普通文本,只有对方复制明文进行解密后才能看出隐藏信息。
-
为文章添加隐藏水印。你可以在你写的文章插入隐藏字符,将作者信息嵌入其中,当别人复制你的文章时,并不会发现这片文章已经被你悄悄打下水印。
零宽隐写
与上面文本隐藏加密的原理一样,但过程不一样。
在线工具网站:https://www.mzy0.com/ctftools/zerowidth1/。将零宽隐写所得密文用文本隐藏加密工具网解密,是解密失败的。
在某些平台如浏览器的网站输入框,无空格明文的零宽隐写和文本隐藏加密的密文会有明显的空格,可能是因为浏览器的特殊性,重视零宽空格:
但有些平台不会显示空格:
社工小扩展
卫星地图和电子地图有什么区别?
卫星地图是通过卫星遥感技术获取的地球表面的影像数据,提供真实的地球表面图像,可以显示地表的自然地貌、城市建筑、水体、植被等景观特征,常用于定位、导航、环境监测等;
而电子地图则是用数字化技术生成的,提供更多的地理信息和功能,显示道路、建筑、地名、边界等,常用于路线规划、搜索、标记、测量。
共有 0 条评论