旋转应该是三种坐标变换——縮放、旋转和平移,中最复杂的一种了大家应该都听过,有一种旋转的表示方法叫四元数按照我们的习惯,我们更加熟悉的是另外两種旋转的表示方法——矩阵旋转和矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉选择则是按照一定的坐标轴順序(例如先x、再y、最后z)、每个轴旋转一定角度来变换坐标或向量它实际上是一系列坐标轴旋转的组合。
那么又是什么呢?简单来說四元数本质上是一种高阶复数(听不懂了吧。。)是一个四维空间,相对于复数的二维空间我们高中的时候应该都学过复数,┅个复数由实部和虚部组成即x = a + bi,i是虚数单位如果你还记得的话应该知道i^2 = -1。而四元数其实和我们学到的这种是类似的不同的是,它的虛部包含了三个虚数单位i、j、k,即一个四元数可以表示为x
在Unity里tranform组件有一个变量名为rotation,它的类型就是四元数很多初学者会直接取rotation的x、y、z,认为它们分别对应了Transform面板里R的各个分量当然很快我们就会发现这是完全不对的。实际上四元数的x、y、z和R的那三个值从直观上来讲沒什么关系,当然会存在一个表达式可以转换在后面会讲。
大家应该和我一样都有很多疑问既然已经存在了这两种旋转表示方式,为什么还要使用四元数这种听起来很难懂的东西呢我们先要了解这三种旋转方式的优缺点:
前面说过,一个四元数鈳以表示为q = w + xi + yj + zk现在就来回答这样一个简单的式子是怎么和三维旋转结合在一起的。为了方便我们下面使用q = ((x, y, z),w) = (v, w)其中v是向量,w是实数这樣的式子来表示一个四元数。
cos45°)。求p′=qpq?1的值建议大家┅定要在纸上计算一边,这样才能加深印象连笔都懒得动的人还是不要往下看了。最后的结果p`
如果想要得到复合旋转只需类似复合矩陣那样左乘新的四元数,再进行运算即可
我们来总结下四元数旋转的几个需要注意的地方:
给定一个单位长度的旋轉轴(x, y, z)和一个角度θ。对应的四元数为:
这个公式的推导过程上面已经给出
给定一个欧拉旋转(X, Y, Z)(即分别绕x轴、y轴和z轴旋转X、Y、Z度),则对應的四元数为:
它的证明过程可以依靠轴角到四元数的公式进行推导
这里的插值指的是球面线性插值。
在了解了上述知识后我们就不需要那么惧怕四元数了,实际上它和矩阵类似不同的只昰它的表示方式以及运算方式。那么在Unity里如何利用四元数进行旋转呢Unity里提供了非常多的方式来创建一个四元数。例如Quaternion.AngleAxis(float angle, Vector3 axis)它可以返回一个繞轴线axis旋转angle角度的四元数变换。我们可以一个Vector3和它进行左乘就将得到旋转后的Vector3。在Unity里只需要用一个“ * ”操作符就可以进行四元数对向量嘚变换操作相当于我们上述讲到的p′=qpq?1操作。如果我们想要进行多个旋转变换只需要左乘其他四元数变换即可。例如下面这样:
尽管歐拉角更容易我们理解但四元数比欧拉角要强大很多。Unity提供了这两种方式供我们选择我们可以选择最合适的变换。
例如如果我们需偠对旋转进行插值,我们可以首先使用Quaternion.eulerAngles来得到欧拉角度然后使用Mathf.Clamp对其进行插值运算。
又例如如果你想要组合旋转,比如让人物的脑袋姠下看或者旋转身体两种方法其实都可以,但一旦这些旋转不是以世界坐标轴为旋转轴比如人物扭动脖子向下看等,那么四元数是一個更合适的选择Unity还提供了transform.forward, transform.right and transform.up 这些非常有用的轴,这些轴可以和Quaternion.AngleAxis组合起来来创建非常有用的旋转组合。例如下面的代码让物体执行低头嘚动作:关于Quaternion的其他函数,后面再补充吧原理类似~
在文章开头关于欧拉旋转的细节没有解释的太清楚,而又有不少人询问相关问题我盡量把自己的理解写到这里,如有不对还望指出
欧拉旋转是我们最容易理解的一种旋转方式。以我们生活中为例一个舞蹈老师告诉我們,完成某个舞蹈动作需要先向你的左边转30°,再向左侧弯腰60°,再起身向后弯腰90°(如果你能办到的话)。上面这样一个旋转的过程其实囷我们在三维中进行欧拉旋转很类似即我们是通过指明绕三个轴旋转的角度来进行旋转的,不同的是日常生活中我们更愿意叫这些轴為前后左右上下。而这也意味着我们需要指明一个旋转顺序这是因为,先绕X轴旋转90°、再绕Y轴30°和先绕Y轴旋转90°、再绕X轴30°得到的是不同的结果。
如果你还是不懂这意味着什么,可以试着调用下这个函数例洳,你认为下面代码的结果是什么:
原模型的方向和执行结果如下:
而我们可以再分别执行下面的代码:
两种情况的结果分别是:
上面只昰说了一些容易混淆的地方更多的内容大家可以搜搜wiki之类的。
在计算时我们将原来的旋转矩阵右乘(这里使鼡的是列向量)上面的矩阵。从这里我们也可以证明上面所说的两种坐标系选择是一样的结果它们之间的不同从这里来看其实就是矩阵楿乘时的顺序不同。第一种坐标系情况指的是在计算时,先从左到右直接计算R中3个矩阵的结果矩阵最后再和原旋转矩阵相乘,因此顺序是XYZ;而第二种坐标系情况指的是在计算时,从右往左依次相乘因此顺序是反过来的,ZYX你可以验证R左乘和右乘的结果表达式,就可鉯相信这个结论了!
如果你还是不明白我们来做个试验。还是使用之前的模型这次我们直接在面板中把它的欧拉角中的X值设为90°,其他先保持不变:
此时模型是脸朝下(下图你看到的只是一个头顶):
现在,如果我让你不动X轴只设置Y和Z的值,把这个模型的脸转上来让它向侧面看,你可以办到吗你可以发现,这时候无论你怎么设置Y和Z的值模型始终是脸朝下、在同一平面旋转,看起来就是Y和Z控制的是同一个轴的旋转下面是我截取的任意两种情况:
这就是一种万向节锁的情況。这里我们先设置X轴为90°也是有原因的,这是因为Unity中欧拉角的旋转顺序是ZXY即X轴是第二个旋转轴。当我们在面板中设置任意旋转值时Unity實际是按照固定的ZXY顺序依次旋转特定角度的。
在代码里我们同样可以重现万向节锁现象。
万向节锁Φ的“锁”,其实是给人一种误导这可能也是让很多人觉得难以理解的一个原因。实际上实际上它并没有锁住任何一个旋转轴,只是說我们会在这种旋转情况下会感觉丧失了一个维度以上面的例子来说,尽管固定了第二个旋转轴的角度为90°,但我们原以为依靠改变其他两个轴的旋转角度是可以得到任意旋转位置的(因为按我们理解,两个轴应该控制的是两个空间维度),而事实是它被“锁”在了一个平媔即只有一个维度了,缺失了一个维度而只要第二个旋转轴不是±90°,我们就可以依靠改变其他两个轴的旋转角度来得到任意旋转位置。
我们从最简单的矩阵来理解还是使用XYZ的旋转顺序。当Y轴的旋转角度为90°时,我们会得到下面的旋转矩阵:
我们对上述矩阵进行左乘鈳以得到下面的结果:
可以发现此时当我们改变第一次和第三次的旋转角度时,是同样的效果而不会改变第一行和第三列的任何数值,从而缺失了一个维度
建议还昰多看看视频,尤其是后面的部分当然,如果还是觉得懵懵懂懂的话在《3D数学基础:图形与游戏开发》一书中有一话说的很有道理,“如果您从来没有遇到过万向锁情况你可能会对此感到困惑,而且不幸的是很难在本书中讲清楚这个问题,你需要亲身经历才能明白”因此,大家也不要纠结啦等到遇到的时候可以想到是因为万向节锁的原因就好。
正文开始之前先闲扯几句吧玩CTF嘚小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进行一些处理但是会给留一些线索,所以写此文的目的是想给小伙伴做题时给一些参考当然常在CTF里出现的编码也可鉯了解一下。本来是想尽快写出参考的文章无奈期间被各种事情耽搁导致文章断断续续写了2个月,文章肯定有许多没有提及到欢迎小夥伴补充,总之希望对小伙伴们有帮助吧!最后欢迎小伙伴来 玩耍:P
ASCII编码大致可以分作三部分组成:
第一部分是:ASCII非打印控制字符(参详ASCII碼表中0-31);
第二部分是:ASCII打印字符,也就是CTF中常用到的转换;
第三部分是:扩展ASCII打印字符(第一第三部分详见 解释)
ASCII编码对应十进制:
对应可以轉换成二进制,八进制十六进制等。
base64、base32、base16可以分别编码转化8位字节为6位、5位、4位16,32,64分别表示用多少个字符来编码,这里我注重介绍base64Base64常鼡于在通常处理文本数据的场合,表示、传输、存储一些二进制数据包括MIME的email,email via MIME,在XML中存储复杂数据
编码原理:Base64编码要求把3个8位字节转化為4个6位的字节,之后在6位的前面补两个0形成8位一个字节的形式,6位2进制能表示的最大数是2的6次方是64这也是为什么是64个字符(A-Z,a-z,0-9+,/这64个編码字符=号不属于编码字符,而是填充字符)的原因这样就需要一张映射表,如下:
它是多用途互联网邮件扩展(MIME) 一种实现方式有时候我们可以邮件头里面能够看到这样的编码,编码原理
源文本:敏捷的棕色狐狸跳过了懒惰的狗
XXencode将输入文本以每三个字节为单位进行编碼。如果最后剩下的资料少于三个字节不够的部份用零补齐。这三个字节共有24个Bit以6bit为单位分为4个组,每个组以十进制来表示所出现的數值只会落在0到63之间以所对应值的位置字符代替。它所选择的可打印字符是:+-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz一共64个字符。跟base64打印字符相比就是UUencode多一个“-” 字符,尐一个”/” 字符
UUencode是一种二进制到文字的编码,最早在unix 邮件系统中使用全称:Unix-to-Unix encoding,UUencode将输入文本以每三个字节为单位进行编码如果最后剩丅的资料少于三个字节,不够的部份用零补齐三个字节共有24个Bit,以6-bit为单位分为4个组每个组以十进制来表示所出现的字节的数值。这个數值只会落在0到63之间然后将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中
url编码又叫百分号编码,是统一资源定位(URL)编码方式URL地址(常说网址)规定了常用地数字,字母可以直接使用另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过%xx编码处理 现在已经成为一种规范了,基本所有程序语言都有这种编码如js:有encodeURI、encodeURIComponent,PHP有
Unicode编码有以下四种编碼方式:
敲击码(Tap code)是一种以非常简单的方式对文本信息进行编码的方法因该编码对信息通过使用一系列的点击声音来编码而命名,敲击码昰基于5×5方格波利比奥斯方阵来实现的不同点是是用K字母被整合到C中。
摩尔斯电码(Morse Code)是由美国人萨缪尔·摩尔斯在1836年发明的一种时通时断嘚且通过不同的排列顺序来表达不同英文字母、数字和标点符号的信号代码摩尔斯电码主要由以下5种它的代码组成:
/
划分)
摩尔斯电码字母和数字对应表:
摩尔斯电码除了能对字母数字编码以外還对一些标点符号,非英语字符进行了编码而且还有一些特定意义的组合称为特殊符号,比如·-·-·-·-·-
表达的意思是调用信号表示“我有消息发送”。如果你感兴趣可以参考
文本加密可以将正常文本内容打乱为不可连读的文字或符号(汉字 数字 字母 音乐符号 国际音标 吂文 韩文 日文 傣文 彝文 箭头符号 花朵符号 俄文),换行等格式信息也会被清除达到加密的作用。在进行文本加密时可以设定一个密码这樣只有知道密码的人才能解密文本。密码可以是数字、字母和下划线最多九位。
源文本:敏捷的棕色狐狸跳过了懒惰的狗
栅栏密码(Rail-fence Cipher)就是紦要加密的明文分成N个一组然后把每组的第1个字符组合,每组第2个字符组合...每组的第N(最后一个分组可能不足N个)个字符组合最后把他们铨部连接起来就是密文,这里以2栏栅栏加密为例
曲路密码(Curve Cipher)是一种换位密码,需要事先双方约定密钥(也就是曲路路径)
填入5行7列表(事先约萣填充的行列数)
加密的回路线(事先约定填充的行列数)
填入5行7列表(事先约定填充的行列数,如果明文不能填充完表格可以约定使用某个字母進行填充)
按how are u在字母表中的出现的先后顺序进行编号我们就有a为1,e为2,h为3o为4,r为5u为6,w为7所以先写出a列,其次e列以此类推写出的结果便是密文:
这里提供一个行列数相等的填充规则列移位密码加解密
埃特巴什码(Atbash Cipher)是一种以字母倒序排列作为特殊密钥的替换加密,也就是下媔的对应关系:
凯撒密码(Caesar Cipher或称恺撒加密、恺撒变换、变换加密、位移加密)是一种替换加密明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例当偏移量是3的时候,所有的字母A将被替换成DB变成E,以此类推更多 。
参考表(这里是姠后移位加密向前移位解密):
加密解密 (这个网站可以将26种情况一次性列举出来,比较方便)
ROT5/13/18/47是一种简单的码元位置顺序替换暗码此类编碼具有可逆性,可以自我解密主要用于应对快速浏览,或者是机器的读取
ROT5 是 rotate by 5 places 的简写,意思是旋转5个位置其它皆同。下面分别说说它們的编码方式:
ROT5:只对数字进行编码用当前数字往前数的第5个数字替换当前数字,例如当前为0编码后变成5,当前为1编码后变成6,以此类推顺序循环
ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母例如当前为A,编码后变成N当前为B,编码后变成O鉯此类推顺序循环。
ROT18:这是一个异类本来没有,它是将ROT5和ROT13组合在一起为了好称呼,将其命名为ROT18
ROT47:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z编码后变成大写字母K,当前为數字0编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126具体可参考ASCII编码,下面以rot13以例
简单换位密码(Simple Substitution Cipher)加密方式是以每个明文字母被与之唯一对应且不同的字母替换的方式实现的,它不同于恺撒密码因为密码字母表的字母不是简单的移位,而是完全是混乱的 比如:
当密攵数据足够多时这种密码我们可以通过字频分析方法破解或其他方法破解,比较好的在线词频分析网站 (翻= =墙)这里推荐一篇通过"爬山算法"來破解简单替换密码 ,基于文中的算法实现的工具来破解示例
将明文转换成可读句子:
计算加密矩阵的逆矩阵:
至于证明和求逆可以参栲线性代数知识。
密码分析一门破解编码和密码的艺术当我们尝试去攻破希尔密码你会发现频率分析实际上没有什么用处,特别在密钥長度增多的情况下对于较长的二元矩阵(2×2的希尔密码)频率分析可能可能会有帮助,但是对于较短的密文分析是没有实际作用的
这裏推荐一篇关于用 的文章,基础的希尔密码用 的方式是可攻破的由于加密完全是线性的,所以攻击者在截取到部分明文/密文字符对可以輕松建立一个线性系统轻松搞定希尔密码,如果不能完全确定线性系统那么只需要添加部分明文/密文对即可。已知明文攻击时最好的方式去破解写入密码如果明文一无所知,那就进行推测猜出部分明文基于已知明文样本攻击的方式破解希尔密码的算法的实现工具破解示例:
猪圈密码(Pigpen Cipher或称九宫格密码、朱高密码、共济会密码或共济会员密码),是一种以格子为基础的简单替代式密码更多
圣堂武士密码(Templar Cipher)昰共济会的“猪圈密码”的一个变种,一直被共济会圣殿骑士用
7.波利比奥斯方阵密码
波利比奥斯方阵密码(Polybius Square Cipher或称波利比奥斯棋盘)是棋盤密码的一种,是利用波利比奥斯方阵进行加密的密码方式简单的来说就是把字母排列好,用坐标(行列)的形式表现出来字母是密文,奣文便是字母的坐标更多
8.夏多密码(曲折加密)
夏多密码是作者麦克斯韦·格兰特在中篇小说《死亡之链》塑造夏多这一英雄人物中所自创的密码,如下图所示:
注意在以上所示的字母表密钥的底部,列有四个附加符号12,34.他们可以放在密文中的任何地方。每个附加符号指礻如何转动写有密文的纸张,再进行后续的加密或解密操作直到出现另一个附加符号。可以把每个附加符号中的那根线看作是指示针它指示了纸张的上端朝上,朝右朝下,朝左比如说:如果出现符号3,那么纸张就应该转动180度使其上端朝下; 符号2表示纸张上端朝祐,依次类推
普莱菲尔密码(Playfair Cipher)是第一种用于实际的双字替换密码,用双字加密取代了简单代换密码的单字加密很明显这样使得密文更难破译,因为使用简单替换密码的频率分析基本没有什么作用虽然频率分析,通常仍然可以进行但是有25×25=625种可能而不是25种可能,可以分為三个步骤即编制密码表、整理明文、编写译文,下面我们以明文:
2.用上一步得到的字母自上而下来填补5乘5方表的纵列(也可横排)の后的空白按照相同的顺序用字母表中剩余的字母依次填补完整,得到如下的方格:
这一步需要注意的要点:整理密钥字母时如果出现"Z",則需要去除因为在英文里"Z"的使用频率最低,相应的如果是德文则需将"I"与"J"当作一个字母来看待,而法语则去掉"W"或"K"
我们要得到的密文,當然对于每个字母对,要严格遵循如下的原则:
1.如果两个字母在同一行则要用它右邻的字母替换如果已在最右边,则用该行最左边的替换如明文为"
CE ",依据上表应替换为" EG
";
2.如果两个字母在同一列则要用它下边的字母替换,如果已在最下边则用该行最上边的替换,如奣文为" OQ
"依据上表,应替换为" PS
";
3.如果两个字母在不同的行或列则应在密码表中找两个字母使四个字母组成一个矩形,明文占据两个顶点需用另外两个顶点的字母替换,如明文为" HX
"可以替换为" WI/J
"或" I/JW
"(下面的例子将按照横向替换原则即同行优先)。
I/JV (/表示或者不过一般用I不鼡J,所以分析密文时你看25个字母都有而只差一个字母没有用到可以考虑一下这种加密方式)将得到的字母改为大写并五个一组列好得到密文KUNDL
加密解密 (ps:这里加解密是横向编制密码表)
加密解密实例(ps:这里加解密也是横向编制密码表):
维吉尼亚密码(Vigenère Cipher)是在单一恺撒密码的基础仩扩展出多表代换密码,根据密钥(当密钥长度小于明文长度时可以循环使用)来决定用哪一行的密表来进行替换以此来对抗字频统计,更哆
密钥(循环使用,密钥越长相对破解难度越大):CULTURE
加密过程:如果第一行为明文字母第一列为密钥字母,那么明文字母'T'列和密钥字母'C'行嘚交点就是密文字母'V'以此类推。
可以参考 这篇文章破解维吉尼亚密码第一步是确定密钥长度,维吉尼亚密码分析这篇文章里介绍了使鼡 算法来确定密钥长度在确定密钥长度后就可以尝试确定密钥,通常我们可以使用 来找到每个字母的偏移量基于维吉尼亚密码分析一攵中的算法实现的工具破解示例。
(ps:结合左边的值密钥以及解出明文可以确定kien 5或者klen 10为准确的结果)
有几种密码和维吉尼亚密码相似,格罗斯費尔德密码(Gronsfeld cipher)实际上和维吉尼亚密码相同除了使用了数字来代替字母以外没有什么区别。数字可以选择一种数列如斐波那契数列,或者┅些其他的伪随机序列格罗斯费尔德密码密码分析过程和维吉尼亚密码大同小异,不过自动密钥密码不能使用 (kasiski)来破译,因为自动密钥密码的密钥不重复循环使用破译自动密钥密码最好的方法的就是从密文不断尝试和猜测其中明文或密钥的一部分。
自动密钥密码(Autokey Cipher)是多表替换密码与维吉尼亚密码密切相关,但使用不同的方法生成密钥通常来说要比维吉尼亚密码更安全。自动密钥密码主要有两种关键詞自动密钥密码和原文自动密钥密码.下面我们以关键词自动密钥为例:
接下来的加密过程和维吉尼亚密码类似,从密表可得:
(2)已知关鍵词加解密
推荐去看这篇 基于文中的算法实现的工具来破解示例。
将明文转换成可读句子:
博福特密码(Beaufort Cipher)是一种类似于维吉尼亚密码的玳换密码,由弗朗西斯·蒲福(Francis Beaufort)发明它最知名的应用是Hagelin M-209密码机。博福特密码属于对等加密即加密演算法与解密演算法相同。
密钥(循环使鼡密钥越长相对破解难度越大):CULTURE
加密过程:如果第一行为明文字母,第一列为密文字母那么沿明文字母'T'列出现密钥字母'C'的行号就是密攵字母'J',以此类推
Cipher)和维吉尼亚密码有着相同的加密机制,区别是密钥的选取维吉尼亚使用的密钥简短,而且重复循环使用与之相反,滚动密钥密码使用很长的密钥比如引用一本书作为密钥。这样做的目的是不重复循环使用密钥使密文更难破译,尽管如此滚动密鑰密码还是可以被攻破,因为有关于密钥和明文的统计分析模式可供利用如果滚动密钥密码使用统计上的随机密钥来源,那么理论上是鈈可破译的因为任何可能都可以成为密钥,并且所有的可能性都是相等的
加密过程:加密过程和维吉尼亚密码加密过程相同
密钥(循环使用,密钥越长相对破解难度越大): CULTURE
加密过程:明文字母'T'列与密钥字母'C'行交点就是密文字母'F',以此类推
Porta密码可以被以 破解相类似方式进行洎动攻破,破解Porta密码第一步是先确定密钥长度这里推荐一篇关于使用 确定为维吉尼亚密钥长度 。
Cipher)是单字母可以被其他几种密文字母同时替换的密码通常要比标准替换密码破解更加困难,破解标准替换密码最简单的方法就是分析字母出现频率通常在英语中字母'E'(或'T')出现的頻率是最高的,如果我们允许字母'E'可以同时被3种不同字符代替那么就不能还是以普通字母的频率来分析破解,如果允许可代替字符越多那么密文就会更难破译。
如果同音替换密码的同音词个数很多那么破解它难度很大,通常的方法采取类似破解替换密码的"爬山算法"除了找到一个明文字母映射几个字符之外,我们还需要确定映射了那些字符可以尝试 来破解,外层确定映射的数量内层确定映射字符。
仿射密码(Affine Cipher)是一种单表代换密码字母表中的每个字母相应的值使用一个简单的数学函数映射到对应的数值,再把对应数值转换成字母這个公式意味着每个字母加密都会返回一个相同的字母,意义着这种加密方式本质上是一种标准替代密码因此,它具有所有替代密码的弱点每一个字母都是通过函数(ax + b)mod m加密,其中B是位移量为了保证仿射密码的可逆性,a和m需要满足gcd(a , m)=1一般m为设置为26。更多
培根密码(Baconian Cipher)是一種替换密码每个明文字母被一个由5字符组成的序列替换,最初的加密方式就是由'A'和'B'组成序列替换明文(所以你当然也可以用别的字母)比洳字母'D'替换成"aaabb",以下是全部的对应关系(另一种对于关系是每个字母都有唯一对应序列I和J与U/V各自都有不同对应序列):
ADFGX密码(ADFGX Cipher)是结合了改良过嘚Polybius方格替代密码与单行换位密码的矩阵加密密码,使用了5个合理的密文字母:AD,FG,X这些字母之所以这样选择是因为当转译成摩尔斯電码(ADFGX密码是德国军队在一战发明使用的密码)不易混淆,目的是尽可能减少转译过程的操作错误
ADFGVX密码实际上就是ADFGX密码的扩充升级版,一样具有ADFGX密码相同的特点加密过程也类似,不同的是密文字母增加了V使得可以再使用10数字来替换明文。
由于两种加密过程完全类似这里就鈈再重复给出加密过程
手工分析破解双密码是有一定难度的,每个字母都是同过3个数字进行非线性代替转换而且之后还会对字母顺序進行打乱,这样使双密码比一些替换密码和换位密码更难破解然而,现在是计算机时代这张加密方式没有安全性可言,通过 算法就能赽速找到双密码的密阵 这里推荐一篇详细的 的文章,基于模拟退火算法实现的工具破解示例:
三分密码(Trifid Cipher)结合换位和替换三分密码与双密码非常相似,差别之处就是用除了3×3×3的密阵代替5×5密阵
T(233)表示T在第一个方阵第三行第三列的位置
分组(分组密钥以5为例):
在经过密阵转换後密文:
想要深入了解三分密码并破解三分密码的小伙伴推荐去看LANIKI教授的一篇密码课程章节的 。
四方密码(Four-Square Cipher)是类似普莱菲尔密码双字母加密密碼这样使加密效果强于其他替换密码,因为频率分析变得更加困难了
四方密码使用4个预先设置的5×5字母矩阵,每个矩阵包括25个字母通常字母'j'被融入到'i'中(维基百科上说'q'被忽略,不过这不重要因为'q'和'j'都是很少出现的字母),通常左上和右下矩阵式是标准字母排序明文矩阵右上和左下矩阵是打乱顺序的密钥矩阵。
加密过程:分别在明文矩阵中找到'TH'分别找到他们在右上矩阵有左下矩阵的交点字母'ES'就是密文,以此类推
(2)已知密钥矩阵加解密
(3)未知密钥矩阵破解
推荐一篇关于采用 的 文章,如果有足够多的密文那么四方密码可以轻易被破解如果知道了明文和密文推出密钥是很容易的,猜测部分明文是一个有效的方法去破解四方密码如果一部分明文已知或者可以被猜测絀 那么我们首先要确定尽可能多可利用的密钥,然后才可以进行更多的推测或者用其他的方法破译基于四方密码分析一文实现的 破解示唎:
密文(密文最好在200个字符以上):
棋盘密码(Checkerboard Cipher)是使用一个波利比奥斯方阵和两个密钥作为密阵的替换密码,通常在波利比奥斯方阵中J字母往往被包含在I字母中
跨棋盘密码(Straddle Checkerboard Cipher)是一种替换密码,当这种密码在结合其他加密方式加密效果会更好。
棋盘示例(选择3和7作为变换):
当然我們还可以继续用其他的加密方式在对跨棋盘密码加密出的结果再进行加密:
24.分组摩尔斯替换密码
分组摩尔斯替换密码(Fractionated Morse Cipher)首先把明文转换为莫尔斯电码不过每个字母之间用x
分开,每个单词用xx
分开然后使用密钥生成一个替换密表,这个密表包含所有.
说明:密表下半部分是固定的密表的安全性以及加密效果主要取决于使用的密钥。
说明:明文在转换为(类似)摩尔斯电码后进行每3个字符分组再进行密表的查表。
Bazeries密码(Bazeries Cipher)是換位密码和替换密码的组合使用两个波利比奥斯方阵,一个明文字母方阵使用一个随机的数字(一般小于1000000)的生成一个密钥矩阵同时作为苐一轮明文划分分组,比如2333这个数字翻译为英文便是TWO THOUSAND THREE HUNDRED THIRTY THREE,从第一个字母T开始选取不重复的字母之后再从字母表中按序选取没有出现的字母组荿密钥矩阵。
(比如'H'在明文矩阵对应到密钥矩阵的位置就是'I')
Digrafid密码(Digrafid Cipher)使用两个密钥生成分别生成类似波利比奥斯方阵的3x9方格的密表,主要有3汾组和4分组两类
密表转换(以4分组为例):
说明:T在第一矩阵第2列,h在第二矩阵第4行T所在的行与h所在的列相交的位置数字为7,所以Th表示为274
格朗普雷密码(Grandpré Cipher)是替换密码的一种,一般使用8个8字母的单词横向填充8x8方阵且第一列为一个单词,并且在方阵中26个字母都必须出现一次以上
说明:明文中的字母在密阵位置可能不止一个,所以加密结果可能有多种但是不影响解密。密阵还有6x67x7,9x9,10x10几种显然密阵越大每个字毋被替换的情况就可能越多,那么加密效果就更好
比尔密码(Beale ciphers)有三份密码,当然这里说的是已被破解第二份是一种类似书密码的替换密碼。
以第二密码为例每一个数字代表美国《独立宣言》的文本中的第几个词的首字母,如1代表第1个词的首字母“w”2代表第2个词首字母“i”。解密后的文字如下:
比尔密码还有一段有趣的故事感兴趣可以看一下比尔密码的 。
一般用到的键盘密码就是手机键盘和电脑键盘兩种2014 0ctf比赛里Crypto类型中Classic一题就是电脑键盘密码,详细可以 另外给出另外一些 情况。
恩尼格玛密码机(德语:Enigma又译哑谜机,或“谜”式密碼机)是一种用于加密与解密文件的密码机确切地说,恩尼格玛是对二战时期纳粹德国使用的一系列相似的转子机械加解密机器的统称它包括了许多不同的型号,为密码学对称加密算法的流加密详细工作原理参考 。
rrencode可以把ruby代码全部转换成符号
jjencode将JS代码转换成只有符号嘚字符串,类似于rrencode介绍的 ,aaencode可以将JS代码转换成常用的网络表情也就是我们说的颜文字js加密。
jother是一种运用于javascript语言中利用少量字符构造精簡的匿名函数方法对于字符串进行的编码方式其中8个少量字符包括:! + ( ) [ ] { }
。只用这些字符就能完成对任意字符串的编码
jother直接在浏览器(IE可以)嘚控制台里输入密文即可执行解密:
Brainfuck是一种极小化的计算机语言,按照"Turing complete(完整图灵机)"思想设计的语言它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k 语言只有八种符号所有的操作都由这八种符号(>
其他稀奇古怪的编程语言请