维吉尼亚密码详解及C语言实现

文章目录

  • 维吉尼亚密码详解及C语言实现
  • 0x01 维吉尼亚密码
  • 0x02 维吉尼亚密码原理
  • 0x03 维吉尼亚密码CTF题目
  • 0x04 C语言实现

图片地址:https://bkimg.cdn.bcebos.com/pic/3ac79f3df8dcd100d56d833d748b4710b9122f3c?x-bce-process=image/watermark,image_d2F0ZXIvYmFpa2U4MA==,g_7,xp_5,yp_5/format,f_auto

0x01 维吉尼亚密码

这么“炫酷”的表格就是维吉尼亚密码,先看一下百度百科的介绍:
“维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。”

吉奥万·巴蒂斯塔·贝拉索,意大利密码学家。他的主要著作是于1553年出版的《吉奥万·巴蒂斯塔·贝拉索先生的密码》(La cifra del. Sig. Giovan Battista Bellaso)。
贝拉索1505年出生于一个显赫的家庭。他的父亲是皮尔文森佐(Piervincenzo),是布雷西亚的一位贵族,从15世纪起就在镇上和卡普里亚诺(Capriano)郊区拥有一处房产,位于一个叫做Fenili Belasi(贝拉索的谷仓)的社区,包括圣三一教堂。牧师每年得到一笔固定的薪金和一些柴火。家族的纹章是“在蓝色的田野上三个红舌金狮子头在侧面”。
贝拉索精通研究,擅长数学,在当时这种艺术在所有的意大利宫廷,主要是在罗马教廷享有极大的赞赏。在密码学历史的黄金时期,他只是众多秘书中的一个,他们出于对知识的热爱或真正的需要,在日常活动中尝试新的系统。他的密码标志着一个时代,被认为是四个世纪以来破解不了的。

吉奥万·巴蒂斯塔·贝拉索是第一个提出多表密码概念的人,但是后来被误认为是布莱斯·德·维吉尼亚所发明,所以也就称之为维吉尼亚密码

0x02 维吉尼亚密码原理

这一一张维吉尼亚的表,可以清楚的看到,这张表由26行,每一行都由前一行字母的顺序向左偏移一位得到

明文为:
VIRGINIACIPHER

密钥为:
SECRETKEY

表格的行代表密钥,列代表明文
明文第1个:V
密文第1个:S 对应密文:N
明文第2个:I
密文第2个:E 对应密文:M
明文第3个:R
密文第3个:C 对应密文:T
明文第4个:G
密文第4个:R 对应密文:X

最后结果为:NMTXMGSEAATJVV
注意:维吉尼亚密码在线加密/解密工具只对字母进行加密,不区分大小写,若文本中出现非字母字符会原样保留!!所以在CTF比赛中可以通过这个很快速的判断出维吉尼亚密码

0x03 维吉尼亚密码CTF题目

题目名称:Ranma½

一开始并无思路只知道是一个日本动画片,其中的编码方式如下

用sublime打开,看到最后应该是flag

再重复一遍重点:维吉尼亚密码在线加密/解密工具只对字母进行加密,不区分大小写,若文本中出现非字母字符会原样保留

逆推思路其实也不难,在不知道维吉尼亚密码的时候应该怎么解?

前面有一串10646-1,根据搜索知道是ISO/IEC 10646-1,根据ISO/IEC 10646-1内容,推测后面为UTF-8,并通过两个关键词找到原文

网址:https://datatracker.ietf.org/doc/html/rfc3629

原文:
ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world’s writing systems. The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo. UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values.

仔细分析两端文字,发现相同的单词对应不同的密文,说明不是替换,并且根据大小写和一些线索也排除了换位密码

通过尝试得到两段的ascii分析,如下图:

根据相减得到的值,发现可能有循环

根据代码筛选出相减的值,得到循环规律

以此类推找到flag:TQLCTF{CODIN6_WOQ1D}

不过比赛的时候能省时间还是工具解决吧!

0x04 C语言实现

# -*- coding = utf-8 -*-
# @Time : 2022/2/24 9:03 上午
# @Author : lmn
# @File : Virginia.c
# @Software : CLion#include <stdio.h>
#include <assert.h>
#define TEXT 100
#define TEXT 100
#define KEY 50int CHOOSE()
{printf("*******************************\n");printf("*** 1. 加密  2. 解密  0. 退出****\n");printf("*******************************\n");int a = 0;scanf("%d",&a);return a;
}
//计算密文或明文字符长度长度
int TestLen(char* text){int sz = 0;for(sz=0;text[sz]!='\0';sz++);return sz;
}
//初始化
void InitVirginia(char* plaintext, char* ciphertext, char* key){int j = 0;for (j = 0; j < TEXT; j++) {plaintext[j] = ' ';ciphertext[j] = ' ';}for (j = 0; j < KEY; j++) {key[j] = ' ';}
}
//加密
int ENCODE(char* plaintext, char* key, char* result){assert(plaintext && key && result);//计算 plaintext 元素个数int sz = TestLen(plaintext);//计算key元素个数int sz2 = TestLen(key);int i = 0;for(i = 0 ; i < sz ; i++){result[i] = (plaintext[i] + key[i % sz2] - 'a'-'a')%26 + 'a';}printf("\n加密后为:%s\n\n",result);return 0;
}
//解密
int DECODE(char* ciphertext, char* key, char* result){assert(ciphertext && key && result);//计算 ciphertext 元素个数int sz = TestLen(ciphertext);//计算key元素个数int sz2 = TestLen(key);int i = 0;for(i = 0 ; i < sz ; i++){result[i] = (ciphertext[i] + 26 - key[i % sz2])%26 + 'a';}printf("\n解密后为:%s\n\n",result);return 0;
}
int main()
{char plaintext[TEXT] = {0};char ciphertext[TEXT] = {0};char key[KEY] = {0};// 1.选择进行的操作int a = 1;while(a){a = CHOOSE();if (a == 0)break;InitVirginia(plaintext, ciphertext, key);switch (a) {case 1://加密printf("请输入明文:>");scanf("%s",plaintext);printf("\n请输入密钥:>");scanf("%s",key);ENCODE(plaintext,key,ciphertext);break;case 2://解密printf("请输入密文:>");scanf("%s",ciphertext);printf("\n请输入密钥:>");scanf("%s",key);DECODE(ciphertext, key,plaintext);break;default:printf("输入有误请重新输入!\n\n");}}return 0;
}

功能介绍:

  1. 加了初始化函数InitVirginia,可以循环对维吉尼亚密码进行加解密
  2. 防止功能过度繁杂,每次运算时需要计算长度,所以加入了计算长度的函数TestLen
  3. 防止数组为空,加入了断言
  4. C语言初学者可能有地方写的不标准,欢迎提出

维吉尼亚密码在线工具
https://www.dcode.fr/vigenere-cipher
http://www.atoolbox.net/Tool.php?Id=856

维吉尼亚密码详解及C语言实现相关推荐

  1. 维吉尼亚密码和一次性密码本_密码学中的一次性密码

    维吉尼亚密码和一次性密码本 The One-time Pad cipher is almost similar to the Vernam cipher, as, like the vernam ci ...

  2. RSA算法与维吉尼亚密码

    RSA算法 RSA算法描述 第1步:用两个很大的互异的质数p和q(p和q必须保密),计算它们的乘积n=pq:n是模数. 第2步:选择一个比n小的数e,它与(p-1)(q-1)互为质数,即除了1以外,e ...

  3. 密码学——维吉尼亚密码

    文章目录 前言 一.维吉尼亚密码简介 二.维吉尼亚算法 1.加密算法 2.解密算法 3.主函数 总结 前言 本内容为博主学习维吉尼亚密码的笔记,如有错误,烦请指正. 一.维吉尼亚密码简介 维吉尼亚密码 ...

  4. 维吉尼亚密码(Vigenère Cipher)

    由于频率分析法可以有效的破解单表替换密码,法国密码学家维吉尼亚于1586年提出一种多表替换密码,即维吉尼亚密码,也称维热纳尔密码.维吉尼亚密码引入了"密钥"的概念,即根据密钥来决定 ...

  5. CTF杂项之“维吉尼亚密码”

    Didi 在这次省赛上做到了一到维吉尼亚密码的题,以前没做过很懵,问了同学才知道 先上图: baby 是秘钥 glbe{pnf_njedc_js_ufjs_kmvrocz!} 是密文 在线解密 htt ...

  6. C++vigenere cipher维吉尼亚密码算法(附完整源码)

    vigenere cipher维吉尼亚密码的算法 vigenere cipher维吉尼亚密码的完整源码(定义,实现,main函数测试) vigenere cipher维吉尼亚密码的完整源码(定义,实现 ...

  7. python编写加密程序_python编写的维吉尼亚密码加解密程序

    维吉尼亚密码表 ============================================= #维吉尼亚密码 加密 key='helloworld' plaintext='whereis ...

  8. 实验吧-密码学-杯酒人生(特殊凯撒--维吉尼亚密码)(凯撒加解密脚本、维吉尼亚密码加解密脚本)...

    题目: 使用古典密码 一喵星人要想喵星发送一段不知道干什么用的密码"BLOCKCIPHERDESIGNPRINCIPLE", 但是它忘记了密钥是什么, 手头(爪头)只有它自己加密过 ...

  9. 双向循环链表:维吉尼亚密码

    维吉尼亚密码简介 维吉尼亚密码引入了"密钥"的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计.假如下面图第一行代表明文字母,左面第一列代表密钥字母,对如下明文加 ...

最新文章

  1. 在vue中使用Element-UI
  2. Device is not certified by Google
  3. SpringBoot+MyBatisPlus+DataTables实现退货管理的添加和编辑时控制checkbox的回显选中
  4. matlab产生正态分布样本
  5. 服务器里怎么更改网站图片大小,php实现在服务器端调整图片大小的方法
  6. 【Python】Matplotlib绘制七彩锥面
  7. libmysql.dll是否真的要拷贝到c:\windows目录下呢?
  8. java工作流引擎Jflow流程事件和流程节点事件设置
  9. 网络爬虫基本原理(二)
  10. 判断两个IP大小关系及是否在同一个网段中
  11. C/C++ debug(四)
  12. 图谱论(Spectral Graph Theory)基础
  13. Ubuntu 查看磁盘挂载和磁盘剩余容量
  14. Mac上的Dock 栏如何设置更好用?
  15. 想在抖音上卖衣服不知道怎么入手,抖音小店改销量技术
  16. C++A类继承B C类_长期投资指数基金到底选择A类收费还是C类收费
  17. 仙剑5手游服务器维护,仙剑奇侠传手游维护及内容更新公告
  18. thinkPHP6报错:Failed to listen on 0.0.0.0:8000 (reason: һַȨ޲“
  19. Discuz论坛密码与密保加密规则
  20. JVM源码系列:JVM内部运行之Class的Method

热门文章

  1. java 复制 inputstream_关于对inputstream流的复制
  2. text-align:center居中
  3. 纯电阻电路的分析方法——回路电流法
  4. js清理cookie失败的问题
  5. 无组织排放智慧管控平台
  6. Excel:数据透视表
  7. Pooled and Cluster Tables
  8. 容联云与20多家银行齐聚,共探客服中心与远程银行建设新业态
  9. virtio split ctrl virtqueue
  10. mysql executebatch_mysql PreparedStatement executeBatch SQL语句的问题 | 学步园