玩CTF学密码学1:base64加解码

CTF密码学1:base64加解码

1、先上题目:

在这里插入图片描述
这是小良的第一道CTF的练习题。下载附件以后,就看到一串码:
在这里插入图片描述
拿到这串码,我也很懵逼。可是仔细分析一看,发现这串码有它的特色:
全是数字、大写字母、小写字母组成,而后放到VS去跑一下,发现这个码的长度是44
根据我学的密码学知识,这个序列确定是让我解码,由于这个序列看起来很杂乱,应该是密文。然而能让我密文解密成为明文,我又没获得私钥,那确定是对称加密算法。若是是凯撒密码,应该给我置换规则,因此应该也不是古典密码那一块。这个密码是4的倍数、又只有大小写字母和数字,那应该是base64加密。java

2、个人解决方案:Java程序解码

import java.util.Base64;

public class base64 {
	static String src = "Y3liZXJwZWFjZXtXZWxjb21lX3RvX25ld19Xb3JsZCF9";
	
	public static void main(String[] args) {
		
		/* 加密 */
// String Encode = Base64.getEncoder().encodeToString(src.getBytes());
// System.out.println(Encode);
		
		
		/* 解密 */
		byte[] Decode = Base64.getDecoder().decode(src);
		System.out.println(new String(Decode));
		
	}
	
}

这个Base64的库在jdk里是有的,须要去新增路径配置一下。
在这里插入图片描述算法

3、学习base64加密算法

base64就是一种基于64个可打印字符来表示二进制数据的编码方法。为何不直接用ASCII码呢?由于咱们输入的字符可能有ASCII码中不可见的字符,为了彻底可见,就用了base64编码。这种加密算法常常在对图片、PDF文件加解密用到。markdown

3.一、base64加解密的算法步骤

对称加密算法的密钥其实就是一个加密算法准则,根据统一准则(密钥),便可对明文加密、对密文解密。base64加密算法总的是这么几个步骤:
第一步:获取明文信息的对应ASCii码
第二步:获取对应ASCii码的字节码(一个字节是八个比特)暨换算成八位二进制
第三步:换编码格式,把组成的八位二进制编码换成六位一组(思考为何?)
第四步:再把六位一组的二进制编码换算成十进制,再去base64密码表上查表
第五步:查表后组成密文,注意,最后补位的明文变成字符:’=’(怎么补位?)ide

3.二、base64加解密的算法探源:

第一:为何把八位二进制换算成六位二进制数?
由于一个字节是八位二进制,明文信息都是字符组成,一个字符是一个字节也就是八位。而后base64的密码表实际上就是一组键值对集合,其中key = {0, 1, 2, …, 63},因而乎,表示63的二进制编码须要6位,因此最大只须要6位,超过6位的表示也没用,会溢出,也就是没法表示!学习

第二:这个补位是什么意思?怎么补位?
假设明文的长度是L,那么换算的八位二进制编码的长度就是:8 * L,这个数必定可以被6所整除吗?显然是不必定的,因此须要对后面补0,并且这个补位,是一组一组的补,一组是8位 !直到总长度可以被6整除为止。网站

3.三、base64的密码表:

在这里插入图片描述

3.四、举个base64加密的例子:以"ABCD"为例

第一步:从ASCii获得对应值而且转成8位二进制编码
Src = “ABCD”
A = 65 = 0100 0001
B = 66 = 0100 0010
C = 67 = 0100 0011
D = 68 = 0100 0100编码

第二步:把8位二进制编码变成6位,不足的地方补k组0,直到被6整除atom

16               20              9               3               17             0                 '='             '='
 010000       010100      001001      000011     010001    00[0000    0000][00    000000]

第三步:根据base64的密码表转换:加密

密文M = “QUJDRA==”spa

4、base64的转换也有相应查询网站:

base64查询网址,不过不建议使用,建议思考

相关文章
相关标签/搜索