【0】前言
古典加密算法本质上就是“替换“。何为“替换”?所谓替换就是有依据的将原本的明文根据加密字典换成对应的密文。代表的就是莫斯密码、凯撒加密等。本文主要分享一些我写的古典密码的脚本、简单记录一下原理和加密解密的网站。某些加密方式有写脚本,有些则无。本文图片由ctfer前辈给我,但是部分图片有问题读者需自己判断。
【1】凯撒加密
(1)原理:凯撒加密是对原文的移位,比如bcd按照字母表顺序朝a方向移动一位则密文就是abc,这个由bcd=>abc的过程就是凯撒加密的过程。
(2)脚本:
from colorsys import rgb_to_yiq
import io
from math import gcd
from multiprocessing import cpu_count
import os
import struct
from tkinter import E
from click import formatting
from markupsafe import string
import base64
import binascii
from urllib import parse
import hashlib
import random
import re
import threading
import os
import gmpy2
# 以下是凯撒加密解密的脚本
def sisa(forming,move) :
i = 0
result = ''
while i<len(forming):
if (ord(forming[i])<=122 and ord(forming[i])>=97):
handsome = ord(forming[i])
handsome = handsome - move
if handsome<97:
handsome += 26
result += chr(handsome)
i += 1
elif (ord(forming[i])<=90 and ord(forming[i])>=65):
handsome = ord(forming[i])
handsome = handsome - move
if handsome<65:
handsome += 26
result += chr(handsome)
i += 1
else:
result += forming[i]
i += 1
print(result)
print(move)
if __name__=='__main__':
# (1)凯撒加密的参数一个是加密的字符串参数,一个是位移量参数,此函数有两个参数,一个是要加密的字符串一个是要位移的量,
# 若输入的move变量是正数则数列朝a的方向移动,注意这个加密的位移量不能大于26也就是最多移位不能超”一轮“,若超一轮自己改一下函数
sisa_string = ""
sisa_move = 7
sisa(sisa_string,sisa_move)
(3)延伸:
<1>ascii码版本,既然明文可以按照字母表的顺序移动也可以按照ascii表的顺序移动,下面是脚本。
from colorsys import rgb_to_yiq
import io
from math import gcd
from multiprocessing import cpu_count
import os
import struct
from tkinter import E
from click import formatting
from markupsafe import string
import base64
import binascii
from urllib import parse
import hashlib
import random
import re
import threading
import os
import gmpy2
# 凯撒加密ascii码,偏移量逐次增加版本版本
def sisa_asc(string,ini_move,every_move):
result = ''
for forming in string:
handsome = chr(ord(forming) + ini_move)
result += handsome
ini_move += every_move
print(result)
if __name__=='__main__':
# (2)凯撒加密ascii码偏移量依次递进版本,下文的sisa_every变量是依次的递进偏移量
sisa_every = 1
sisa_asc(sisa_string,sisa_move,sisa_every)
<2>有时候直接把凯撒加密的26种情况列举出来找规律更方便则此时有了如下战斗版本,仅需极短的时间就可以把所有情况列举出来。
from colorsys import rgb_to_yiq
import io
from math import gcd
from multiprocessing import cpu_count
import os
import struct
from tkinter import E
from click import formatting
from markupsafe import string
import base64
import binascii
from urllib import parse
import hashlib
import random
import re
import threading
import os
import gmpy2
# 以下是凯撒加密解密的脚本
def sisa(forming,move) :
i = 0
result = ''
while i<len(forming):
if (ord(forming[i])<=122 and ord(forming[i])>=97):
handsome = ord(forming[i])
handsome = handsome - move
if handsome<97:
handsome += 26
result += chr(handsome)
i += 1
elif (ord(forming[i])<=90 and ord(forming[i])>=65):
handsome = ord(forming[i])
handsome = handsome - move
if handsome<65:
handsome += 26
result += chr(handsome)
i += 1
else:
result += forming[i]
i += 1
print(result)
print(move)
# 凯撒加密多线程战斗版
def sisa_plus(string,move,superforming):
superforming.acquire()
sisa(string,move)
superforming.release()
if __name__=='__main__':
# (3)凯撒加密多线程粗暴版,只需设置sisa_string即可
superforming = threading.Semaphore(26)
forming = 1
while forming < 27:
handsome = threading.Thread(target=sisa_plus(sisa_string,forming,superforming))
handsome.start()
forming += 1
【2】moze加密
(1)原理:就是最简单的替换,a-z、A-Z、0-9等字符都对应了一个由" - "和" . "组成的字符串。
(2)脚本:
from colorsys import rgb_to_yiq
import io
from math import gcd
from multiprocessing import cpu_count
import os
import struct
from tkinter import E
from click import formatting
from markupsafe import string
import base64
import binascii
from urllib import parse
import hashlib
import random
import re
import threading
import os
import gmpy2
# 下面是摩斯密码解密函数
def moze_decode(string,partition):
moze_dict = {'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':'--..','0':'-----','1':'.----','2':'..---','3':'...--','4':'....-','5':'.....',
'6':'-....','7':'--...','8':'---..','9':'----.','.':'.-.-.-',':':'---...',',':'--..--',';':'-.-.-.','?':'..--..',
'=':'-...-','\'':'.----.','/':'-..-.','!':'-.-.--','-':'-....-','_':'..--.-','"':'.-..-.','(':'-.--.',')':'-.--.-',
'$':'...-..-','&':'....','@':'.--.-.','à':'.--.-','å':'.--.-','ä':'.-.-','æ':'.-.-','ch':'----','ç':'-.-..','ĉ':'-.-..',
'ð':'..--.','é':'..-..','è':'.-..-','ĝ':'--.-.','ĥ':'-.--.','ĵ':'.---.','ñ':'--.--','ö':'---.','ø':'---.','ŝ':'...-.',
'þ':'.--..','ü':'..--','ŭ':'..--','AR':'.-.-.','AS':'.-...','K':'-.-','SK':'...-.-','BT':'-...-'
}
judge = 0
result_string = ''
ini_string_list_last = re.findall('/([\.\-]*)',string)
ini_string_list_first = re.findall('([\.\-]*)/',string)
for forming in moze_dict:
if(ini_string_list_first[0] == moze_dict[forming]):
result_string += forming
break
judge += 1
if judge == 76:
print(ini_string_list_first[0] + ' is error')
judge = 0
for handsome in ini_string_list_last:
for forming in moze_dict:
if (handsome == moze_dict[forming]):
result_string += forming
judge += 1
break
if judge == 76 :
print(handsome + ' is error')
judge = 0
print(result_string.lower())
# 下面是摩斯密码加密函数
def moze_encode(string,partition):
moze_dict = {'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':'--..','0':'-----','1':'.----','2':'..---','3':'...--','4':'....-','5':'.....',
'6':'-....','7':'--...','8':'---..','9':'----.','.':'.-.-.-',':':'---...',',':'--..--',';':'-.-.-.','?':'..--..',
'=':'-...-','\'':'.----.','/':'-..-.','!':'-.-.--','-':'-....-','_':'..--.-','"':'.-..-.','(':'-.--.',')':'-.--.-',
'$':'...-..-','&':'....','@':'.--.-.','à':'.--.-','å':'.--.-','ä':'.-.-','æ':'.-.-','ch':'----','ç':'-.-..','ĉ':'-.-..',
'ð':'..--.','é':'..-..','è':'.-..-','ĝ':'--.-.','ĥ':'-.--.','ĵ':'.---.','ñ':'--.--','ö':'---.','ø':'---.','ŝ':'...-.',
'þ':'.--..','ü':'..--','ŭ':'..--','AR':'.-.-.','AS':'.-...','K':'-.-','SK':'...-.-','BT':'-...-'
}
result = ''
forming = 0
while forming < len(string):
for handsome in moze_dict:
if string[forming] == handsome:
result += moze_dict[handsome]
result += ' '
forming += 1
print(result)
if __name__ == '__main__':
# 下面的参数是用于摩斯解密加密的,若分隔符不是空格,就去上面找一下这个函数改一下正则,也就是说default是空格,
# 两个参数一个当然就是要加密或者解密的字符串,而moze_partition是用来指定返回的结果用什么分隔
moze_string = '-..../.----/-..../-..../-..../...--/--.../....-/-..../-..../--.../-.../...--/.----/--.../...--/..---/--.../--.../....-/...../..-./--.../...--/...--/-----/...../..-./...--/...--/...--/....-/...--/...../--.../----./--.../-..'
moze_partition = ' '
moze_decode(moze_string,moze_partition)
moze_encode(moze_string,moze_partition)
【3】栅栏加密
(1)原理:根据分组将对应位置的数组合最后将每个组合再组合的加密方式。
(2)脚本:(下面的脚本是懒人脚本只需输入原始字符就会返回所有可能的加密结果)
from colorsys import rgb_to_yiq
import io
from math import gcd
from multiprocessing import cpu_count
import os
import struct
from tkinter import E
from click import formatting
from markupsafe import string
import base64
import binascii
from urllib import parse
import hashlib
import random
import re
import threading
import os
import gmpy2
# 下面的函数是栅栏执行函数,会直接探测str栅栏加密的所有可能值,并调用zhalan_crypt函数加密
def zhalan_exc(str):
forming = len(str)
if judge_sushu :
print('number of char that function be gived str is prime number')
return
very = {}
handsome = 2
realy = 0
right = forming//2
while handsome<=right:
if (forming % handsome) == 0:
very[realy] = handsome
realy += 1
handsome += 1
realy -= 1
while realy >= 0:
zhalan_crypt(str,very[realy],forming)
realy -= 1
# zhanlan_crypt函数会根据move与count的值进行加密,count表示str的字符个数,move表示分组数,两个循环,分别取str不同组的不同元素组成结果
def zhalan_crypt(str,move,count):
forming = count//move
result = ''
for very in range(forming):
result += str[very]
for handsome in range(move-1):
very += forming
result += str[very]
print('crypt starting for {0}'.format(move) + ' : ' + result)
if __name__ == '__main__':
# 下面的两个函数,zhalan_crypt实现栅栏加密zhalan_exc用来探测str所有可能的加密情况,并执行zhalan_crypt
# zhalan_exc只需传一个str变量就可,而zhalan_ctypt则需要指定三个参数,move是要分组的组数,count是str的字符数
zhalan_string = ''
zhalan_move = 2
zhalan_count = len(zhalan_string)
zhalan_exc(zhalan_string)
zhalan_crypt(zhalan_string,move,count)
【4】维吉尼亚加密
(1)原理:有点类似AES加密中的字符代换,明文和密钥分别作为表中的x轴y轴以横竖对应取一个确定的值,言翻译的时候就找到对应的值和密钥确定明文。
(2)说明图片:
(3)举例:
明文:formingishandsome。
密钥:aaaaaaaaaaaaaaaaa。
密文:FORMINGISHANDSOME。
【5】电脑键盘加密解密
(1)原理:还是和维吉尼亚密码一样,横纵坐标找对应的字母,但是这里不再以维吉尼亚 字母表为参照,而是以键盘为例
(2)说明图片:
【6】菲斯的象形文字
(1)原理:简单替换,标准古典密码的思维,没啥好说的。
(2)说明图片:
【7】培根密码
(1)原理:本质上是用五位二进制表示26个字母,2的5次方正好是32,但是这里没有本本分分的用0与1而是用两种不同的状态去表示0与1,可以是a与b,也可以是正写或斜写。
(2)说明图片:
【8】手机键盘加密
(1)原理:横纵坐标确定字符,和之前不同参考系。
(2)说明图片:
【9】猪圈密码
(1)原理:标准古典密码。
(2)说明图片:
【10】字母表顺序加密和反字母表顺序加密
(1)原理:还是替换没啥好说的。
(2)图片说明:
【11】其它常见编码方式的举例
(1)jjencode
(2)aaencode
(4)jsfuck
(5)电报查询
(6)UUencode