python实现维吉尼亚加密解密以及利用拟重合指数法爆破

Python实战:5步破解维吉尼亚密码CTF题(附完整代码) 本文提供了一套使用Python破解维吉尼亚密码CTF题目的完整实战指南。通过Kasiski测试法和重合指数法推测密钥长度,结合字母频率分析破解密钥,并附有可直接运行的代码示例,帮助读者掌握自动化解密流程,高效应对CTF中的古典密码挑战。 阅读详情
# -*- coding: utf-8 -*-
"""
"""


# !/usr/bin/env python


import string
import pprint


a_z = string.ascii_lowercase
A_Z = string.ascii_uppercase


# 生成维吉尼亚表
def produce(location):
s = ""
s += A_Z[location:] + A_Z[0:location]
return s

def produce_table():
dic = {}
for i in range(0, 26):
dic[a_z[i]] = produce(i)
return dic


# 生成表
table = produce_table()
#pprint.pprint(table)


def filter_claer(clear):
result = ""
clear = clear.lower()
for i in clear:
if 97 <= ord(i) <= 122:
result += i
return result


# 加密
def encrypt(clear_content, key):
clear_content = get_trim_text(clear_content)
result = ""
length = len(key)
loca = 0
for i in clear_content:
result += table[i][a_z.index(key[loca])]  # table[i]代表明文字符所在列,a_z[index](key[loca])表示秘钥字符
loca += 1
loca = loca % length
return result.lower()

#解密
def decrypt(cipher, key):
result = ""
length = len(key)
loca = 0
for i in cipher.upper():
result += a_z[table[key[loca]].index(i)]
# table[key[loca]]表示秘钥字符串所在行,index(i)表示明文字符的索引,查找a_z
loca += 1
loca = loca % length
return result


def get_trim_text(text):
result = ""
clear = text.lower()
for i in clear:
if 97 <= ord(i) <= 122:
result += i
return result




# 求秘钥长度
def get_key_length(text):
length = len(text)
List_word_chance = {}
for m in range(1, 18):
List_avgCipher = []
for time in range(0, m):
temp = text[time::m]
List_avgCipher.append(temp)
# print(List_avgCipher)
lis = []
for i in List_avgCipher:
all_word = set(i)
chance = 0
for j in all_word:
chance += i.count(j) * (i.count(j) - 1)
lis.append(chance / ((len(i) * len(i) - 1)))
List_word_chance[m] = sum(lis) / m
result = []
for i, v in List_word_chance.items():
result.append([i, v, abs(v - 0.065)])
result = sorted(result, key=lambda s: s[2])
return result



# 获取密钥长度
def getKeyLen(cipherText):  
keylength = 1
maxCount = 0
for step in range(3, 18):  # 循环密钥长度
count = 0
for i in range(step, len(cipherText) - step):
if cipherText[i] == cipherText[i + step]:
count += 1
if count > maxCount:
maxCount = count
keylength = step
return keylength




# 统计字母频度
def countList(lis):
li = []
alphabet = [chr(i) for i in range(97, 123)]
for c in alphabet:
count = 0
for ch in lis:
if ch == c:
count += 1
li.append(float(count) / len(lis))
return li




# 根据密钥长度将密文分组
def textToList(text, length):
text = get_trim_text(text)
textMatrix = []
row = []
index = 0
for ch in text:
row.append(ch)
index += 1
if index % length == 0:
textMatrix.append(row)
row = []
textMatrix.append(row)
return textMatrix




# 获取密钥
def getKey(text, length):
text = get_trim_text(text)
key = []  # 定义空白列表用来存密钥
alphaRate = [0.08167, 0.01492, 0.02782, 0.04253, 0.12705, 0.02228, 0.02015, 0.06094, \
            0.06996, 0.00153, 0.00772, 0.04025, 0.02406, 0.06749, 0.07507, 0.01929, \
            0.0009, 0.05987, 0.06327, 0.09056, 0.02758, 0.00978, 0.02360, 0.0015, 0.01974, 0.00074]
matrix = textToList(text, length)
for i in range(length):
w = [row[i] for row in matrix if len(row) > i]  # 获取每组密文
if length == 6 and i == 0:
print('**********************************')
print(w)
li = countList(w)
powLi = []  # 算乘积
for j in range(26):
Sum = 0.0
for k in range(26):
Sum += alphaRate[k] * li[k]
powLi.append(Sum)
li = li[1:] + li[:1]  # 循环移位
if length == 6 and i == 0:
print('**********************************')
print(powLi)
Abs = 100
ch = ''
for j in range(len(powLi)):
if abs(powLi[j] - 0.065546) < Abs:  # 找出最接近英文字母重合指数的项
Abs = abs(powLi[j] - 0.065546)  # 保存最接近的距离,作为下次比较的基准
ch = chr(j + 97)
key.append(ch)
return key

if __name__ == '__main__':
prompt = """选择
(e)加密
(d)解密
(c)爆破
(q)退出
请输入你的选择: 
"""
while (True):
choice = input(prompt)
if choice == 'e':
p = input("请输入明文 ")
k = input("输入加密秘钥 ")
print("密文为: %s" % (encrypt(p, k)))
elif choice == 'd':
c = input("请输入密文: ")
k = input("请输入解密秘钥: ")
print("明文为: %s" % (decrypt(c, k)))
elif choice == 'q':
break
elif choice == 'c':
key_lengths = []
c = input("please enter ciphertext: ")
key_lengths = getKeyLen(c)
print("使用Kasiski得到的秘钥长度为:" + str(key_lengths))
print("使用重合指数得到的分组概率从大到小为\n"
     "[分组数,平均重合指数,绝对值(平均-0.065]\n")
key_lengths_chonghe = get_key_length(c)
for i in key_lengths_chonghe:
print(i)
if key_lengths_chonghe[0][0]==key_lengths:
print("秘钥长度为%d"%key_lengths)
key = ""
for i in getKey(c, key_lengths_chonghe[0][0]):
key += i
print("明文是 %s,\n 密钥是 %s\n" \
     % (decrypt(c, key), key))
else:
print("尝试前面3组秘钥长度:")
for j in range(0,3):
key = ""
for i in getKey(c, key_lengths_chonghe[j][0]):
key += i
print("明文是 %s,\n 密钥是 %s\n" \
     % (decrypt(c, key), key))
else:
print("不合理的输入,请重新输入")
CTF古典密码多层加密破解实战:从ROT13到维吉尼亚的完整路径 古典密码学是信息安全与密码学的基石,其核心原理在于通过替换、置换等数学变换对信息进行混淆。从凯撒密码的固定移位到维吉尼亚密码的多表替换,这些技术不仅具有历史价值,更在CTF竞赛、安全教学与算法理解中广泛应用。掌握古典密码的识别与破解,能有效锻炼逆向思维与系统分析能力,是理解现代加密技术的重要阶梯。本文聚焦于CTF中常见的多层加密场景,通过分析密文字符集、模式识别与工具链协同,详解如何层层剥离ROT13、Leet Speak及维吉尼亚等加密外壳。文中将结合CyberChef等自动化工具与手动分析技巧,展示如何 阅读详情

相关推荐

CTF密码学实战:从编码识别到RSA攻击的完整攻防指南

密码学是信息安全的核心基础,它通过数学原理实现信息的保密性、完整性与认证。现代密码学主要分为对称加密(如AES)与非对称加密(如RSA),其安全性依赖于算法强度与密钥管理。在工程实践中,即使算法本身安全,错误的使用模式(如ECB模式、IV复用、不当填充)也会引入致命漏洞,这在渗透测试与CTF竞赛中成为高频考点。例如,CBC模式的Padding Oracle攻击和RSA的参数选择不当(如低加密指数、共模攻击)是典型的实战突破口。掌握编码识别、古典密码分析、以及针对AES和RSA的常见攻击链,能够帮助安全研究人

jackleechina2011212的博客 421

Python实现维吉尼亚密码:从古典密码原理到CTF实战应用

古典密码学是理解现代加密技术的基础,其中多表替换加密算法通过使用多个替换表来增强安全性,其核心原理在于打破明文与密文之间的一一对应关系,从而抵御简单的频率分析攻击。维吉尼亚密码作为古典多表替换加密的典型代表,通过引入密钥词实现动态的字母移位,在工程实践中常用于教学演示和CTF竞赛。掌握其Python实现不仅有助于深入理解加密算法的底层逻辑,还能为网络安全实践和脚本编写提供直接可用的工具。本文围绕Python实现和CTF应用两个热词,详细解析了维吉尼亚密码的加解密过程、代码实现细节及常见问题调试技巧。

weixin_31648507的博客 234

Python实现维吉尼亚密码算法

具体实现时,我们先将明文和密钥转换为大写字母,然后从左至右依次遍历明文中的每个字符,如果是字母则按照密钥表进行移位,得到对应的密文字符;维吉尼亚密码是一种基于多表替换密码的加密算法,也是经典密码学中最著名的加密算法之一。该算法的主要思想是将明文按照一定规则转换成密文,比如通过按照一个密钥字母表进行多次移位来实现加密。密钥字母表由密钥中的字符决定,因此相同的明文在不同的密钥下会得到截然不同的密文。总的来说,维吉尼亚密码算法虽然已经被一些更安全的加密算法所取代,但它仍然是一个很好的学习密码学基础知识的例子。

BUG?不存在的! 1309

Virginia维吉尼亚密码实现与分析(Python实现)

本次实验完成了维吉尼亚密码的实现与分析。不难发现,在使用维吉尼亚密码加密时,密钥长度越长,破译难度越大,并且破译难度和密钥是否有实际意义 无关。维吉尼亚密码的密钥空间大小为26^m,所以即使 m 的值很小,使用穷尽密钥搜索方法也需要很长的时间,但使用计算机能大幅降低计算时间。维吉尼亚密码作为多表代换密码固然比单表代换密码更为安全,但安全程度有限,其最大的弱点就是可以通过 Kasiski 测试法化为多个单表代换密码,从而将破译难度降为近似于单表代换密码。

zinc_96的博客 7188

DDR5内存命令真值表详解:如何正确解析JESD79-5标准中的关键指令

本文深度解析JESD79-5标准中的DDR5内存命令真值表,将其视为动态通信协议进行拆解。详细阐述了1-Cycle与2-Cycle命令的区别、Bank Group寻址机制以及模式寄存器(MR)操作流程,为硬件与固件工程师提供了从信号解析到系统调试的完整实战指南,是理解和优化高性能计算平台内存子系统的核心。

numpy6sculptor的博客 548

告别水印!Vue3项目集成Stimulsoft.Reports.js完整配置与激活指南

本文详细介绍了如何在Vue3项目中集成Stimulsoft.Reports.js,提供从授权策略到性能优化的完整解决方案。通过模块化架构设计和现代化引入方式,帮助开发者高效实现专业级报表功能,同时避免版权风险和水印问题,特别适合中小型项目需求。

weixin_33701294的博客 431

Python学习39:维吉尼亚密码——加密

1”的密钥“R”在表格中的偏移量为“17”(A在字母表里的偏移量为0),偏移量对10取模结果为“7”,加密时,查表格中“1”对应的列“1 2 3 4 5 6 7 8 9 0”中序号为“7”的数字,得到加密结果应为8,“9”的密钥“E”的偏移量是“4”,在“9”对应的行中序号为“4”的数字是“3”。聪明的你猜出来邮件内容是用维吉尼亚加密方法加密过的,密钥是星期三(收到消息的日期)的英文单词,写个程序解密小明的邮件并输出明文吧!编写一个程序,根据输入的密钥对输入的明文进行加密输出,对输入的密文进行解密输出。

weixin_60530224的博客 5154

手把手教你解决COLMAP编译中的Ceres CUDA支持问题(附详细配置步骤)

本文详细解析了COLMAP编译中Ceres CUDA支持问题的完整解决方案,包括环境准备、Ceres Solver的CUDA编译配置、COLMAP的CUDA集成配置等关键步骤。通过优化CMake参数和解决常见错误,帮助技术人员充分利用GPU加速优势,提升三维重建效率。

vodka的博客 858

用python实现维吉尼亚密码的加密与唯密文解密

用python实现维吉尼亚密码的加密与唯密文解密。

Huiye_Daxiaojie的博客 7963

单片机:实现FFT快速傅里叶变换算法(附完整源码)

单片机:实现FFT快速傅里叶变换算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1099

ROCm rocr-libhsakmt分析系列1-2:多GPU跨卡VRAM访问机制分析

本文基于ROCr-Runtime的libhsakmt库源码,深入分析了多GPU系统中跨设备内存访问的实现机制。主要内容包括: 实现流程概述:通过P2P拓扑发现、统一虚拟地址空间、页表映射和硬件转发四个步骤,实现零拷贝的跨GPU内存访问。

图形/计算GPU的驱动与虚拟化技术分享园地 2504

python 维吉尼亚密码加密和解密

python 维吉尼亚密码加密和解密

ldl345的博客 3400

【100%通过率】华为OD机试真题 Python 实现【投篮大赛】【2022.11 Q4 新题】

你现在是一场采用特殊赛制投篮大赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中ops[i]是你需要记录的第i项操作,ops遵循下述规则: 整数x-表示本回合新获得分数x “+” – 表示本回合新获得的得分是前两次得分的总和。 “D” – 表示本回合新获得的得分是前一次得分的两倍。 “C” – 表示本回合没有分数,并且前一次得分无效,将其从记录中移除。 请你返回记录中所有得分的总和。

MISAYAONE的博客 1万+

古典密码学核心:置换与代换原理详解及Python实战实现

密码学是信息安全的基础,其核心目标是通过加密算法保护信息的机密性。加密算法主要分为置换和代换两大类基本思想。置换密码通过改变明文字符的顺序来实现加密,例如栅栏密码和列置换密码,其安全性依赖于排列规则的保密性。代换密码则通过替换明文字符本身来加密,如凯撒密码和维吉尼亚密码,其安全性取决于替换规则的复杂性。这两种古典密码技术虽然简单,但深刻体现了现代密码学中“混淆”与“扩散”两大核心原则的思想雏形。理解这些基础原理,不仅有助于学习现代加密算法(如AES中的S盒和置换层),也为CTF竞赛中的古典密码题破解提供了基

weixin_30572613的博客 390

30分钟用 Restful ABAP Programming(RAP)模型开发一个支持增删改查的 Fiori 应用

2016年时,Jerry曾经写过一系列关于SAP Fiori Smart Template(现在更名为Fiori Elements了)的博客,介绍了所谓的MDD开发方法论 - Metadata Driven Development,即通过开发维护了对应annotation(注解)的CDS view,结合SAP WebIDE,能够花费最少的编程代价,就能够在短时间内获得一个支持增删改查的Fiori应......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5951

C#对接EtherNet/IP协议 完整版|罗克韦尔AB PLC通信+CIP核心概念全解析

你做罗克韦尔(AB) PLC工业上位机开发,是唯一的首选协议,没有之一!EtherNet/IP(Ethernet Industrial Protocol)是基于标准以太网的工业级通信协议,由罗克韦尔自动化主导开发,是ODVA(开放设备网络供应商协会)主推的工业以太网标准,也是目前全球应用最广泛的工业以太网协议之一。原生适配罗克韦尔AB PLC:Micro800、CompactLogix、ControlLogix、Micro850等全系AB PLC原生标配EtherNet/IP,无需额外配置,开箱即用;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 891

CTF新手想入门拿分?吃透这几点

CTF全称 Capture The Flag,就是夺旗赛,说白了就是网安界的技术比武大赛—— 参赛队通过破解题目里的漏洞、解密数据、逆向程序,找到隐藏的 “Flag”(一串验证字符),谁先找到、找得多,谁就赢。广度: 面向企业安全建设的核心场景(渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营),本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点,是应对复杂攻防挑战的实用指南。CTF 靠的是实打实的实战,光看没用,得练!

weixin_51725318的博客 567

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

CTF 新手想入门上分?抓好这几个关键点就够了

很多新手问我,CTF不就是个比赛吗?没必要非得学?这话可就错了!CTF全称 Capture The Flag,就是夺旗赛,说白了就是网安界的技术比武大赛—— 参赛队通过破解题目里的漏洞、解密数据、逆向程序,找到隐藏的 “Flag”(一串验证字符),谁先找到、找得多,谁就赢。

2301_77472496的博客 901

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

新手入门 CTF 想稳拿分?吃透这几招,轻松起步

很多新手问我,CTF不就是个比赛吗?没必要非得学?这话可就错了!CTF全称 Capture The Flag,就是夺旗赛,说白了就是网安界的技术比武大赛—— 参赛队通过破解题目里的漏洞、解密数据、逆向程序,找到隐藏的 “Flag”(一串验证字符),谁先找到、找得多,谁就赢。

fly_enum的博客 783

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

CTF密码学实战:从RSA攻击到流密码破解的解题框架与工具链

密码学是信息安全的基石,其核心在于通过数学原理实现信息的加密与解密。现代密码学主要分为对称加密(如AES)和非对称加密(如RSA)两大体系,前者加密解密使用相同密钥,后者使用公钥和私钥对。理解这些算法的数学原理和实现模式,是发现其潜在弱点、进行安全分析的关键。在工程实践中,尤其是在CTF竞赛和渗透测试场景中,密码学攻击技术具有极高价值,例如针对RSA的共模攻击、低加密指数攻击,以及针对流密码的密钥重用攻击等。这些攻击往往源于算法的不当使用或参数的非安全构造。掌握Python中的`pycryptodome`、

weixin_30340617的博客 443

CTF入门到进阶:Web安全、密码学与逆向工程实战指南

网络安全竞赛(CTF)是检验和提升信息安全技能的重要平台,其核心原理在于模拟真实攻防环境,通过解决技术挑战来发现和利用漏洞。在技术价值层面,CTF不仅能够系统性地锻炼参与者的漏洞分析、工具使用和编程能力,还能紧跟最新的安全威胁趋势。常见的应用场景包括企业安全人才评估、高校教学实践以及个人技能提升。本文聚焦于CTF中的热门方向,如Web安全中的SQL注入与文件上传漏洞利用,以及密码学中的RSA算法分析与实战,为初学者构建从环境搭建、工具使用到独立解题的完整学习路径。

angou6476的博客 382

python实现维吉尼亚加解密(I/O)

python实现维吉尼亚加解密 i/o流

liron的博客 1294

python之维吉尼亚密码暴力破解

最近在学习密码学和python,想着用python把学过的所有密码加解密都写一篇,学到维吉尼亚密码的时候感觉有点费劲了,也是参考了众多大佬的文章才算有点搞懂,然后就用python重写了一遍,希望能帮到有需要的人

BLS1314的博客 1777

维吉尼亚解密python代码(不知道密钥任何信息)

print("长度为%d时,平均重合指数为%.5f" % (key_len, np.mean(IC)))print("密钥长度为%d,此时重合指数每组的平均值为%.5f" % (key_len, aver))alp2 = alp2[1::1] + alp2[:1:1]#循环左移。print("密钥为:",key)

qq_73704657的博客 2082
下一篇: 利用python实现仿射密码以及穷举爆破
RememberMePlease
博客等级 码龄9年 10粉丝 14原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值