目录
前言
为了实现多种CTF加解密工具,特写下此程序代码提供参考,欢迎批评指正。
一、项目概述
该项目主要以CTF加解密工具实现为主题,通过编程实现各种加解密工具的应用。主要用到python环境,以及tkinter库。
通过此项目,让我们对各种加解密算法的有更进一步的了解,以及如何去运用,去计算等等。
二、使用步骤
1.引入库
代码如下:
from cProfile import label
from cgitb import text
from pydoc import plain
from tkinter import *
from Crypto.Cipher import ARC4
import tkinter
import string
import base64
import math
import numpy as np
import sys
import re
这些库,大多都是用于后面实现加解密工具所需要。主要界面设计用的库为tkinter库,这个算是比较简单且易懂的一个库吧。
2.需求分析
能实现多种常见的ctf加解密方法,选择相应加密/解密算法后,输入明文/密文,可以给出加密/解密结果。包括但不限于凯撒、维吉尼亚、仿射、base64、摩斯密码……
3.方案设计
3.1、总体方案设计
1.首先设计程序界面:利用python中自带的tkinter库,去编写一个简单的界面,用于展示和归纳所有加解密算法的一个界面。
2.加入算法:加入各种CTF加解密工具的算法,让程序有可用的加解密算法。
3.美化界面:在加入算法完成后,去对界面进行一个优化,让用户使用起来更加方便和直观感觉良好,看上去比较实用。
3.2、功能设计
1、凯撒密码:
通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。通常偏移量为3。
例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。由此可见,位数就是凯撒密码加密和解密的密钥。
2、仿射密码:
仿射密码的加密算法就是一个线性变换,即对任意的明文字符x,对应的密文字符为 ,其中,a,b∈Z26,且要求gcd(a,26)=1,函数e(x)称为仿射加密函数。
加密案例:
设密钥K= (7, 3), 用仿射密码加密明文hot。
三个字母对应的数值是7、14和19。分别加密如下:
(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,对应的密文是AXG。
解密案例:
本例是按照上例来解密的,也就是用仿射密码解密密文AXG,密钥k=(7,3)。
三个字母对应的数值是0、23、6。解密如下:
由解密Dk©=k3(c- k2) mod n(其中(k3 ×k1)mod26 = 1);
可知k3×7=1(mod 26)(其实,就是1/mod26),也就是存在整数t,使7×k3+26t=1。(1)
利用辗转相除法求解k3:
26 = 7 * 3 + 5;(2)(对26作形如:a * b + c,其中 c 就是余数)
7 = 5 * 1 + 2;(3)(作形如: a = c * m + n ,其中 a ,c 是上一步的, m 是乘数 ,n 是余数)
5 = 2 * 2 + 1;(一直循环上一步,直到余数 n = 1)
进行回代:
1 = 5 - 2 * 2
= 5 - (7 - 5 * 1) * 2(第一个2用(3)式来代替,也就是2 = 7 - 5 * 1)
= 3 * 5 - 2 * 7
= 3 * (26 - 7 * 3) - 2 * 7(5用(2)式来代替,也就是5 = 26 - 7 * 3)
= -11 * 7 + 3 * 26(直到不用进行代替,也就是得到只有7和26的表达式)
对比(1)式可知:t = 3 ,k3 = -11;
所以:Dk©=k3(c- k2) mod n <=> Dk©=-11(c- 3) mod 26 .
对于第一位 A :
-11 ( 0 - 3 ) mod 26 = ( -11 * -3 )mod 26 = 7;
对于第二位 X :
-11 ( 23 - 3 ) mod 26 = ( -11 * 20 ) mod 26 = ( -220 ) mod 26 = ( 26 * -9 ) + 14 = 14;
( 用计算器求 (-220) mod 26 ,不同的计算器会有不同的结果,百度的计算器求得就是 14 ,直接百度搜索:(-220) mod 26 就可以了,不能直接在计算器上输入 -220mod26 ,那样会得出负数。其实,可以这样算,算出(-11)mod 26 =15,再计算 (15 * 20)mod26 = 14)
对于第三位 G :
-11 ( 6 - 3 ) mod 26 = ( -11 * 3 )mod 26 = ( -33 )mod 26 = 19;(计算方法如上)
三个明文值为 7,14,19,对应的明文是HOT,也就是hot。
3、Base64:
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,base64就是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应4个base64单元,即3个字节可表示4个可打印字符。它可用来作为电子邮件的传输编码。
特征:(1)在base64中的可打印字符包括字母A-Z、a-z、数字0-9,+ / =。
(2)永远是4的倍数,不足四的用=补齐。
4、Base32:
Base32跟Base64原理差不多,只是换了个进制而已。
5、摩斯密码:
摩斯密码(摩尔斯电码)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号;它的代码包括五种: 点、划、点和划之间的停顿、每个字符之间短的停顿、每个词之间中等的停顿以及句子之间长的停顿。
所以他的算法,只要把对照表加入到里面,然后利用转换的方式让其输出即可。
6、RC4密码:
RC4产生一个伪随机比特流(a keystream),加密的时候,把它跟明文进行比特级别的异或处理,解密时进行一样的步骤(因为异或操作是对称的)。(这个类似于Vernam cipher ,只不过后者不使用伪随机比特流而直接使用随机比特流)。为了产生 keystream,本密码算法使用时需要两个数据的私有空间来保存内部状态:
1.总共256个字节的序列(下面用“S"代替)
2.两个8比特的索引指针(下面用“i”和“j”代替)
比特流序列的初始化是根据key的长度(key的长度通常在40到256比特之间),使用key-scheduling算法来进行的(KSA),一旦完成了初始化,比特流就可以根据伪随机生成算法(PRGA)来产生。
7、栅栏密码:
所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)
例如:
明文为:IAMMANBUTLIKEWOMEN
加密密钥为3
加密阵列见表:

则:密文为IMBLEM AAUIWE MNTKON
解读:将一段字符串(明文)按照(加密密钥)3个一组进行排列,然后将每组的第一列提取,第二列,第三列。分别循环提取。
密文为IMBLEMAAUIWEMNTKON
加密密钥为3
求明文,解密密钥为18/3=6
按照解密规则,得出如下过程。

明文:IAM MAN BUT LIK EWO MEN
解读:将一段字符串(密文)按照6(解密密钥)个一组进行排列,然后将每组的第一列提取,第二列,第三列,第四列,第五列,第六列。分别循环提取。
8、维吉尼亚密码:
在凯撒密码基础上扩展出来的多表密码,引入了密钥,根据密钥来决定用哪一行的密表来进行替换.
假设明文对应行,秘钥对应列.我们举个简单的例子:
明文: d
秘钥: c
在表中找到第d行,第c列,则
密文:F
以此类推.

9、希尔密码:
加密:
1、定义一个矩阵a(须存在逆矩阵)作为加密密钥:
[1,2,1]
[0,2,1]
[1,0,2]
2、将需要加密的明文字母转换为其对应的字母表数字(1-a,2-b……);
3、将转换后的明文数字序列按照密钥矩阵的阶数进行分组(如本次为3个字符一组);
4、每组数字序列和密钥矩阵进行矩阵的乘法运算(1x3 矩阵乘以 3x3矩阵),结果即为密文数字序列;
5、可将密文数字序列转换为其对应字母,即为密文字符串。
解密:
解密流程与加密相同,唯一不同之处在于:需先求出加密密钥的逆矩阵
在做矩阵相成时,用密文分组乘以逆矩阵,结果即为明文
4.项目演示

该博客介绍了一个基于Python的CTF加解密工具的实现,包括凯撒、仿射、Base64等多种算法,并提供了使用步骤、界面设计和部分代码。作者通过这个项目加深了对加解密算法的理解,并分享了遇到的问题与解决方案。

8000

被折叠的 条评论
为什么被折叠?



