初学古典密码

                                               古典密码

目录

                                               古典密码

Wiki篇

二,凯撒密码Caesar:

三,移位密码

四,Atbash Cipher(埃特巴什码):

五,简单替换密码

六,仿射密码(affine cipher)

多表代换加密

一,Playfair

二,Polybius

三,Vigenere维吉尼亚密码

四,Nihilist

五,Hill

六,AutokeyCipher

群里网站篇


Wiki篇

一,特点:明密文一 一对应。有一般两种方式破解: 1,密钥空间较小--暴力破解          2,密文足够长,词频分析,  quipqiup - cryptoquip and cryptogram solver

                     特别地,密钥空间足够大,密文足够短,破解较为困难

二,凯撒密码Caesar:

原理:每个字母按字母表循环移动作密文        名称有:偏移量为10:Avocat(A→K A向右偏移10个位置到K)                                 

偏移量为-5:Cassis(K 6)                                                                       

偏移量为-6:Cassette(K 7)

偏移量为13:ROT13

(还有ROT5,ROT13,ROT18,ROT47)(ROT5移数字,ROT13移字母,ROT18为前两者混合,ROT47数字,字母,字符都移)

        此外,Keyed Caesar  利用一个密钥,将密钥的每一位转换为数字(一般转换为字母表对应顺序的数字),分别以这一数字为密钥加密明文的每一位字母

eg:   XMan 一期夏令营分享赛宫保鸡丁队 Crypto 100  :  

  密文:s0a6u3u1s0bv1a            数字(非字母)不移 字母移

密钥:guangtou                              密钥字母所在位数为偏移量

偏移:6,20,0,13,6,19,14,20              

明文:y0u6u3h1y0uj1u             密文对着字母表按偏移量得明文

工具:  一般我们有如下的工具,其中 JPK 比较通用。

1,JPK,可解带密钥与不带密钥(国外工具)

        2,Online calculator: Caesar cipher (planetcalc.com)

        3,ROT5、ROT13、ROT18、ROT47位移编码 (qqxiuzi.cn)

三,移位密码

  与凯撒密码类似,区别在于移位密码不仅会处理字母,还会处理数字和特殊字符,常用ASCII码表进行移位。其破解方法也是遍历所有的可能性来得到可能的结果(凯撒密码ROT47与其差不多)

四,Atbash Cipher(埃特巴什码):

原理:正常字母表倒过来就是密文字母表

明文: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

密文:Z Y X W V U T S R Q P O N M L K J I H G F E D C B A

egATTACK AT DAWN(明文)

ZGGZXP ZG WZDM (密文)

在线工具:实用密码学 (practicalcryptography.com)

它很简单,即便不知道是Atbash,也可以通过假设它是 替换密码并使用爬山确定密钥。Atbash 密码也是 a=25 b = 25 仿射密码,因此将其作为仿射密码破解也是可行的。

五,简单替换密码

原理:加密时,每一个明文字母替换为与之唯一对应且不同的字母,是完全混乱的(这区别于凯撒密码,难度高于凯撒密码)

Eg:

明文字母 : abcdefghijklmnopqrstuvwxyz

密钥字母 : phqgiumeaylnofdxjkrcvstzwb          (对应规则)     

明文:the quick brown fox jumps over the lazy dog

密文:cei jvaql hkdtf udz yvoxr dsik cei npbw gdm

解密时一般要知道每一个字母的对应规则,才可以正常解密

破解:

其加密方式使其所有的密钥个数为26,所以一般采用词频分析(要知道对应法则)

工具:quipqiup - cryptoquip and cryptogram solver

六,仿射密码(affine cipher)

解密脚本:(7条消息) 仿射密码(原理+代码)_Eternal嘉的博客-CSDN博客_仿射密码

六,仿射密码(affine cipher)

解密脚本:(7条消息)仿射密码(原理+代码)_Eternal嘉的博客-CSDN博客_仿射密码

加密函数是 E(x)=(ax+b)(modm)E(x)=(ax+b)(modm)

解密函数是 D(x)=a−1(x−b)(modm)D(x)=a−1(x−b)(modm),其中 a−1 是 a 在 Zm 群的乘法逆元。 a的负一次方

from Crypto.Util.number import *
import  libnum
import gmpy2 


print(inverse(5,26))
print(libnum.invmod(5,26))
print(gmpy2.invert(5,26))

a,b不知,知道密文和部分明文,如下题:

仿射密码TWCTF 2016 的 super_express的解题脚本:

from Crypto.Util.number import *
encrypted = "805eed80cbbccb94c36413275780ec94a857dfec8da8ca94a8c313a8ccf9" #这个密文是需要给出的,wiki里好像没给
c = [int(encrypted[i:i+2],16) for i in range(0, len(encrypted), 2)]#转化成十进制
print(c)   #[128, 94, 237, 128, 203, 188, 203, 148, 195, 100, 19, 39, 87, 128, 236, 148, 168, 87, 223, 236, 141, 168, 202, 148, 168, 195, 19, 168, 204, 249]
print(ord("T"),ord("W"))      # 84 87
#128=(a*84+b)%251
#94=(a*87+b)%251
#两式相减34=(-3*a)%251   34=-3a+251k   3a=251k-34   k=1时不成立,k=2成立算出a=156
a=inverse(-3,251)*34%251   #简便方法就是求逆元    #*34还是没懂
print(a)
#128=(156*84+b)%251       #E(x)=(ax+b)mod m

#b=251k-156*84+128
#for i in range(100): # 爆破求b
#    b=251*i-156*84+128
#    if b>0 and b<251:
 #    print(b)     # 76

b=(128-156*84)%251  # 好像不用爆破,直接这么算
print(b)
# a=156
# b=76
# #根据公式  D(x)=a−1(x−b)(modm)
a_1=inverse(a,251)    #乘法逆元
flag=""
for i in c:
    flag+=chr(a_1*(i-b)%251)    ##chr
print(flag)

#运行结果:
#[128, 94, 237, 128, 203, 188, 203, 148, 195, 100, 19, 39, 87, 128, 236, 148, 168, 87, 223, 236, 141, 168, 202, 148, 168, 195, 19, 168, 204, 249]
#84 87
#156
#76
#TWCTF{Faster_Than_Shinkansen!}
#还不是很懂,或者说很多东西还没懂,需要经常复现,常来看看

多表代换加密

一,Playfair

原理:

  1. 1,选取一串英文字母,除去重复出现的字母,将剩下的字母逐个逐个加入5*5的矩阵内,剩下的空间由为加入的英文字母依a-z的顺序加入。注意,将q去掉,或将i和j视作同一字。
  2. 2,将要加密的明文分成两个一组。若组内的字母相同,将X(或Q)加到该组的第一个字母后,重新分组。若剩下一个字,也加入X。
  3. 3,在每组中,找出两个字母在矩阵中的地方。
    • 若两个字母不同行也不同列,在矩阵中找出另外两个字母(第一个字母对应行优先),使这四个字母成为一个长方形的四个角。
    • 若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)
    • 若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)
    • 新找到的两个字母就是原本的两个字母加密的结果。
  • 同行取右边:
    同列取下边:
    其他取交叉:

以 playfair example 为密匙,得

P L A Y F I R E X M B C D G H K N O Q S T U V W Z

要加密的讯息为 Hide the gold in the tree stump

HI DE TH EG OL DI NT HE TR EX ES TU MP 明文

就会得到

BM OD ZB XD NA BE KU DM UI XM MO UV IF 密文

如果给的密文,密钥,根据原理翻回去即可


二,Polybius

原理:Polybius密码又称棋盘密码,其一般是将给定的明文加密为两两组合的数字

两张图表:

初学古典密码_第1张图片

eg:明文HELLO,加密后为 23 15 31 31 34

初学古典密码_第2张图片

eg:明文HELLO,加密后为DD XF AG AG DF

(注意:ADFGX的字母表是打乱的)

还有各种各样的棋盘表,具体情况具体分析,总体是5*5的形式,i和j可视为同一字,加密时读取先左再上

三,Vigenere维吉尼亚密码

初学古典密码_第3张图片

最上一行是明文,最左一列是密钥,里面的是密文

eg:明文:come greatwall

密钥:crypto

密文:efkt zfgrrltzn

工具

  • 已知密钥
    • Python的pycipher库
    • 在线解密 Vigenère cipher
    • CAP4
  • 未知密钥
    • Vigenère Cipher Codebreaker
    • Vigenere Solver 不够完善

四,Nihilist

原理:又称关键字密码:明文+关键字=密文。以关键字 helloworld 为例

首先利用密钥构造棋盘矩阵(类似 Polybius 密码) - 新建一个 5 × 5 矩阵 - 将字符不重复地依次填入矩阵 - 剩下部分按字母顺序填入 - 字母 i 和 j 等价

初学古典密码_第4张图片

eg:a加密为23,s加密为44

其密文特点如下:

  • 纯数字
  • 只包含1到5
  • 密文长度为偶数

五,Hill

六,AutokeyCipher

原理:其又称自动密钥密码,与维吉尼亚密码类似,但它是使用不同的方法生成密钥。所以比维吉尼亚密码更安全,自动密钥密码主要有两种:关键词自动密钥密码和原文自动密钥密码。以下是关键词自动密钥密码:

明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG

关键词:CULTURE

自动生成密钥:CULTURE THE QUICK BROWN FOX JUMPS OVER THE

接下来的加密过程和维吉尼亚密码类似,从相应的表格可得(这表格我们应该是不知道的,因为关键词不定):

密文:VBP JOZGD IVEQV HYY AIICX CSNL FWW ZVDP WVK

工具:

已知关键词: 1,AutoKey Cipher - 许愿星

2,软件解:CaptfEncoder 一款可扩展跨平台网络安全工具套件CaptfEncoder_是叶十三的博客-CSDN博客

3,Python代码:

from pycipher import Autokey

print (Autokey('CULTURE').encipher('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG'))    #加密
print (Autokey('CULTURE').decipher('VBP JOZGD IVEQV HYY AIICX CSNL FWW ZVDP WVK'))    #解密
  • 4,Python的pycipher库(cmd,安装:pip install pycipher 然后python环境)

初学古典密码_第5张图片

未知关键词:

    • Practical Cryptography
    • tools文件夹下break autokey.py,待完成

群里网站篇

1,栅栏密码:字母少,有一定规则,用@连接         //密文:fg2ivyo}l{2s3_o@aw_rcl@

2,md5:一般为32位,由字母和数字组成

   顺便说一句,当ASCll用Base加密达不到所对应的位数的时候用=号补齐;

3,base64:其空格会被加密成=            //若base64中有+,经url加密变成空格,base64解密字符不能含空格,报错(包含大写字母(A-Z),小写字母(a-z),数字(0-9)以及+  /)

4,base16:一串数字和大写字母组成   (Base16就是16进制,他的范围是数字(0-9),字母(ABCDEF))

5,base58:主要用于产生Bitcoin的钱包地址,不使用数字“0”,小写字母“l”,大写字母“O” “I”,符号“+” “/”

6,base91:91个字符(94个可打印中,三个没有: -(破折号,0x2D)    \(反斜杠,0x5C)    '(撇号,0x27))

    eg:@iH<,{bdR2H;i6*Tm,Wx2izpx2!    可找在线解密工具

7,base32: Base32中只有大写字母(A-Z)和数字 234567

8,base58:原理:   在base64的基础上去掉了比较容易混淆的字符;(将冲突项都去掉)

                             Base58中不含Base64中的数字 0 ,大写字母 O ,小写字母 l ,大写字母 I ,以及 “+” 和 “/” 两个字符。

                  无法用整字节来转换表示Base58,所以开销会比64和16大得多,但是利于展示地址。

         (base64在输出钱包地址的时候大小写字母等无法识别,引用base58)

9,base62:与base64差不多,少两个字符(“/” "空格")   (在安全领域,base62的编码使用较多。)

10,base85:与Base64一样,Base85编码的目标是对二进制数据可打印的ASCII字符进行编码。但是它使用了更大的字符集,因此效率更高一些

11,base92

Base家族原理网址:

(7条消息) base家族学习__pain_的博客-CSDN博客_base92原理

你可能感兴趣的:(网络,安全)