CTF.cryptopals加密集合1

2024-03-21 11:20
文章标签 加密 ctf 集合 cryptopals

本文主要是介绍CTF.cryptopals加密集合1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.base64,base32 ,base16编码

​编辑

1.1.base64编码

 1.2 base32:

1.3 base16:

​编辑

小结:

1.4、补充常见的密码

1.4.1古典密码学


1.base64,base32 ,base16编码

1.1.base64编码

base64索引表

Base64是用于传输8Bit字节码的编码方式之一,每6个比特 作为一个单元,对应某个可打印字符,包括字母A-Z、a-z、数字0 - 9,这样共有62个字符,剩余二个在不同系统上而不同。每三个字节有24个比特,对应4个base64单元,即3个字节表示4个可打印字符。

例如:编码'Man'

 如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个“=”号,代表补足的字节数。也就是说,当最后剩余一个八位字节(一个byte)时,最后6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个八位字节(2byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号

例如

 1.2 base32:

base32索引表

1.3 base16:

base16索引表

练习题一:

https://cryptopals.com/sets/1/challenges/1

import base64
s='49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d'
flag = base64.b16decode(s)
print(flag)

小结:

1、base16编码其实就把字符转成ascii码的16进制。
2、b64encode和b16encode只能对bytes类型的数据进行编码,但解码时可以对bytes类型和string类型的数据都可以解码。

1.4、补充常见的密码

1.4.1古典密码学

古典密码的加密是将明文的每一个字母代换为字母表中的另一个字母。

1.4.1.1凯撒密码

凯撒密码加密时将明文中的每个字母按字母表顺序向前或向后移动固定数目作为密文

题目

加密一次,再来一次,然后回到起点。1Ebbg8Vf7Abg3Nyybjrg

思路:2次,为Rot13

1.4.1.2 移位密码

移位密码可以任意移动,后期不仅处理26个字母,还会处理数字和特殊字符。参照ASCII表进行位移。

1.4.1.3 仿射密码

原理
仿射密码的加密函数是E(x)=(ax+b)(mod m),其中

  • x表示明文按照某种编码得到的数字
  • a和m互质
  • m是编码系统中字母的数目

解密函数是D(x)=a-1(x-b)(modm),其中a-1是a在Zm群的乘法逆元。
乘法逆元:
a* a -1(mod m)=1 

例如:

加密

 解密

 

具体python代码可参考:

仿射密码的加密与解密_带问号的小朋友的博客-CSDN博客_仿射密码加密

题目

使用仿射函数y=3x+9加密得到的密文为JYYHWVPIDCOZ,请尝试对其解密。flag为flag{大写明文}。

思路:

y=3x+9——>3x + 9 = y(mod 26)——>x = 3^-1(y-9)mod 26(3的乘法逆元是9)->x=9(y-9)mod 26

注意是三等号

1.4.1.4多表代换密码

  • 该算法基于5*5的字母矩阵,该矩阵使用一个关键词构造(即密钥)
  • 从左到右、从上到下顺序,填入关键词的字母(去除重复字母)后,将字母表其作余字母填入。(I=J)
  • 将明文两个分为一组,若出现相同字母,则用X替代最后字母。在每组中,查找矩阵替换:
  1. 若两个字母同行,则用右方字母替换
  2. 若两个字母同列,则用下方字母替换
  3. 若即不同行也不同列,则用矩阵对角字母替换

1.4.1.5 棋盘密码

 

1.4.1.6 Vigenere维吉尼亚密码

使用26个字母购成字母阵横行为明文列,纵向为密钥列

 加密: C = P + K(mod26)

 解密: P = (C-K)%26

题目:

今天来和Caesar学习一-点新知识吧: Google下?听说与FLAG这个字符串有关: kwam{atgksprklzojozb}
思路:当时走了弯路,后来尝试了Vigenere

1.4.1.7 培根密码(bacon)

本质上是二进制,没有用01,而是AB

题目 

先按照五个一组重新排序

bAcon iSaME aTpro dUcTp rePar edfrO mapig andUs uALLy cUReD

在对照表可以得到flag

ilikebacon

1.4.1.8 栅栏密码(Railfence)

2栏栅栏密码:
比如明文:THEREISACIPHER
去掉空格后变为:THEREISACIPHER
两个一组,得到:THEREISACIPHER
先取出每行第一个字母:TEESCPE
再取出每行第二个字母:HRIAIHR
连在一起就是:TEESCPEHRIAIHR
而解密的时候,先把密文从中间分开,变为两行:
T E E S C P E
H R I A I H R
再按上下上下的顺序组合起来:
THEREISACIPHER
分出空格,就可以得到原文了:
THEREIS A CIPHER
主要像是矩阵,以列为顺序依次取数。

多栏栅栏密码:
明文:THEREISACIPHER
七个一组:THEREISACIPHER

抽取字母:TAHCEIRP EHIE SR

组合得到密码:TAHCEIRPEHIESR
可以通过分析密码的字母数来解出密码
比如:TAHCEIRPEHIESR
一共有14个字母,可能是2栏或者7栏
尝试2栏--》失败
尝试7栏--》成功

当字母数m为偶数时,分栏数可能是其因子
当字母数m为奇数时,可能是前m-1个均分,最后一个独自成行,当然也可能m+1均分,任意分都有可能

题目
Caesar 被困住了2333333,13 根栅栏,怎么办?h{igr},aarclietflhf-_peecirroc,eo_fhlels caifnge

1.4.1.9 摩斯密码(Morse)

用.和_表示,以前用于发电报

 可以在网上在线工具直接计算

http://www.zhongguosou.com/zonghe/moErSiCodeCon verter.aspx
或者:
http://rumkin.com/tools/cipher/morse.php

这篇关于CTF.cryptopals加密集合1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/832521

相关文章

SpringBoot3使用Jasypt实现加密配置文件

《SpringBoot3使用Jasypt实现加密配置文件》这篇文章主要为大家详细介绍了SpringBoot3如何使用Jasypt实现加密配置文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... 目录一. 使用步骤1. 添加依赖2.配置加密密码3. 加密敏感信息4. 将加密信息存储到配置文件中5

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

Java实现MD5加密的四种方式

《Java实现MD5加密的四种方式》MD5是一种广泛使用的哈希算法,其输出结果是一个128位的二进制数,通常以32位十六进制数的形式表示,MD5的底层实现涉及多个复杂的步骤和算法,本文给大家介绍了Ja... 目录MD5介绍Java 中实现 MD5 加密方式方法一:使用 MessageDigest方法二:使用

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间