做了一些CTF密码学的题目,阅读了很多大神的博客,现在做个总结,不全面的之后补充。
ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性,可以自我解密,主要用于应对快速浏览,或者是机器的读取,而不让其理解其意。 ROT5 是 rotate by 5 places 的简写,意思是旋转5个位置,其它皆同。下面分别说说它们的编码方式: ROT5:只对数字进行编码,用当前数字往前数的第5个数字替换当前数字,例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。 ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。 ROT18:这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18(对数字5对,字母rot13)。 ROT47:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126 这encode出来时字符串,不是js程序。 明文:栅栏密码加密规则示例 按照字数先把明文分成: 先取每组第一个字:栅密 再取每组第二个字:栏规 最后得到“栅密栏规密则码示加例”。 密文被分成2个字一组: 先取每组第一个字:栅栏密码加 再取每组第二个字:密规则示例 最后得到“栅栏密码加密规则示例” 仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母。 我们以 E(x)=(5x+8) mod 26函数为例子进行介绍,加密字符串为 AFFINECIPHER,这里我们直接采用字母表26个字母作为编码系统 1.先求解5关于模26的乘法逆元,为21 摩斯电码不区分大小写,注意转换 1.选择两个不相等的质数p和q。 爱丽丝选择了61和53。 (实际应用中,这两个质数越大,就越难破解,即大数) 2.计算p和q的乘积n。 (n的长度就是密钥长度。3233写成二进制是,一共有12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。 人类已经分解的最大整数(232个十进制位,768个二进制位) 3.计算n的欧拉函数φ(n)。 爱丽丝就在1到3120之间,随机选择了17。 (实际应用中,常常选择65537。) 5.计算e对于φ(n)的模反元素d。 所谓"模反元素"就是指有一个整数d,可以使得ed被φ(n)除的余数为1。 于是,找到模反元素d,实质上就是对下面这个二元一次方程求解。 这个方程可以用"扩展欧几里得算法"求解,此处省略具体过程。总之,爱丽丝算出一组整数解为 (x,y)=(2753,-15),即 d=2753。 6.将n和e封装成公钥,n和d封装成私钥。 爱丽丝将公钥发送给我,我对信息加密,发送给爱丽丝后,爱丽丝利用手中的私钥解密。 假设鲍勃要向爱丽丝发送加密信息m,他就要用爱丽丝的公钥 (n,e) 对m进行加密。这里需要注意,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。 所谓"加密",就是算出下式的c: 爱丽丝的公钥是 (3233, 17),鲍勃的m假设是65,那么可以算出下面的等式: 于是,c等于2790,鲍勃就把2790发给了爱丽丝。 爱丽丝拿到鲍勃发来的2790以后,就用自己的私钥() 进行解密。可以证明,下面的等式一定成立: 也就是说,c的d次方除以n的余数为m。现在,c等于2790,私钥是(),那么,爱丽丝算出 因此,爱丽丝知道了鲍勃加密前的原文就是65。 至此,"加密--解密"的整个过程全部完成。 1.RSA算法原理(一)(二) Ploybius 棋盘密码 波利比奥斯方阵是一种使用一个关键词方格来加密字符对的加密法 密钥方阵并不确定,最常见就这两种,也有playfair zxwv。。。这种反着的 最后编写密文。对明文加密规则如下: 1 若p1 p2在同一行,对应密文c1 c2分别是紧靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。如,按照前表,ct对应dc 2 若p1 p2在同一列,对应密文c1 c2分别是紧靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。 3 若p1 p2不在同一行,不在同一列,则c1 c2是由p1 p2确定的矩形的其他两角的字母(至于横向替换还是纵向替换要事先约好,或自行尝试)。如,按照前表,wh对应ku或uk。 将密文变成大写,然后几个字母一组排列。 Playfair解密算法首先将密钥填写在一个5*5的矩阵中(去Q留Z),矩阵中其它未用到的字母按顺序填在矩阵剩余位置中,根据替换矩阵由密文得到明文。 1 若c1 c2在同一行,对应明文p1 p2分别是紧靠c1 c2 左端的字母。其中最后一列被看做是第一列的左方。 2 若c1 c2在同一列,对应明文p1 p2分别是紧靠c1 c2 上方的字母。其中最后一行被看做是第一行的上方。 3 若c1 c2不在同一行,不在同一列,则p1 p2是由c1 c2确定的矩形的其他两角的字母。 其实就是反其道而行之。 选择某一关键词并重复而得到密钥,如关键词为LEMON时,密钥为: 对于明文的第一个字母A,对应密钥的第一个字母L,于是使用表格中L行字母表进行加密,得到密文第一个字母L。类似地,明文第二个字母为T,在表格中使用对应的E行进行加密,得到密文第二个字母X。以此类推,可以得到: 用来加密解密的维吉尼亚表格: IEEE形式的,每四位取1 3 位就可以得到原本的Data 得到data后对其二进制进行处理 例2、明文是LOVE,用“随意选取句子和文”加密,得到密文就是“SuLyi XuanQ uJuZi HEwEN”(这里用大写字母代表a,小写字母代表b) 这里,加密者使用两种不同字体,准备好一篇包含相同ab字数的假信息后,即两种字体分别代表a型和b型。然后假信息中的每个字母按字体来决定其代表“a”还是“b”。 Ps:密文中的单词都是根据加密规则随便拼凑出来的,为了使加密更隐蔽,一般拼凑出来的单词可连成通顺的一句话 jsfuck一种表示js的语言,直接在console中运行就好 找不到线索,只有一堆括号什么的 找wp,用google的console输入这串符号,火狐的还用不了,复制不进去 下面就可以对信息进行加密了 比如明文是: 当铺密码就是一种将中文和数字进行转化的密码,算法相当简单:当前汉字有多少笔画出头,就是转化成数字几。例如: 斯在《归来记》中侦探案件使用的一种加密方式。 諸壽隸僧壽降吽壽諸壽陀壽摩隸僧缽薩願心壽咤壽囉寂壽闍諸壽哆壽慧壽聞壽色吽愍壽所壽蜜如 Quoted-printable将任何8-bit字节值可编码为3个字符:一个等号"="后跟随两个十六进制数字(0–9或A–F)表示该字节的数值。 例如,ASCII码换页符(十进制值为12)可以表示为"=0C", 等号"="(十进制值为61)必须表示为"=3D",gb2312下“中”表示为=D6=D0。除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式。 rabbit加密有base64显示形式和hex显示形式,然后密文不唯一, 例如对一个Cute_Rabbit加密有很多种密文: 可使用 MTracer正则测试.exe 跳转到解密网站 需要网站碰撞 cmd5网站 有16位的也有32位的 md5需要爆破的例题: |
《C语言程序设计》复习题
1、 C 语言的源程序必须通过编译和链接后,才能被计算机执行。
2、 C 语言的源程序必须通过编译和连接后,才能被计算机执行。
3、C语言中的标示符可分为关键字、拥护标示符和预定义标识符3类。
4、C语言中的标示符可分为关键字、用户标识符和预定义标示符3类。
5、在C语言中,用关键字 float 定义单精度实型变量。
6、在C语言中,用关键字 double 定义双精度实型变量。
7、在C语言中,用关键字 char 定义字符型变量。
8、在C语言的赋值表达式中,赋值好左边必须是变量。
9、设C语言中的一个int型数据在内存中占2个字节,则int型数据的取值范围为
11、若a是int型变量,且a的初值为6,则执行表达式a+=a-=a*a后a的值为
13、在程序运行过程中,其值不能被改变的量称为常量。
14、C程序中定义的变量,代表内存中的一个存储单元。
15、C语言中,int类型数据字符占内存 2 个字节。
16、C语言中,char类型数据占内存 1 个字节。
17、C语言的字符常量是用单引号括起来的一个字符。
18、语句printf(“\n”);的作用是换行输出。
21、C语句的最后用;结束。
24、为表示关系|x|≥9;应使用的C语言表达式是x=9 。
26、C语言中用 1 表示逻辑值“真”。
27、C语言中用0 表示逻辑值“假”。
29、以下程序段的输出结果是83 。
30、以下程序段的输出结果是291 。
31、以下程序段的输出结果是d1 。