这是小良的第一道CTF的练习题。下载附件以后,就看到一串码:
拿到这串码,我也很懵逼。可是仔细分析一看,发现这串码有它的特色:
全是数字、大写字母、小写字母组成,而后放到VS去跑一下,发现这个码的长度是44
根据我学的密码学知识,这个序列确定是让我解码,由于这个序列看起来很杂乱,应该是密文。然而能让我密文解密成为明文,我又没获得私钥,那确定是对称加密算法。若是是凯撒密码,应该给我置换规则,因此应该也不是古典密码那一块。这个密码是4的倍数、又只有大小写字母和数字,那应该是base64加密。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里是有的,须要去新增路径配置一下。算法
base64就是一种基于64个可打印字符来表示二进制数据的编码方法。为何不直接用ASCII码呢?由于咱们输入的字符可能有ASCII码中不可见的字符,为了彻底可见,就用了base64编码。这种加密算法常常在对图片、PDF文件加解密用到。markdown
对称加密算法的密钥其实就是一个加密算法准则,根据统一准则(密钥),便可对明文加密、对密文解密。base64加密算法总的是这么几个步骤:
第一步:获取明文信息的对应ASCii码
第二步:获取对应ASCii码的字节码(一个字节是八个比特)暨换算成八位二进制
第三步:换编码格式,把组成的八位二进制编码换成六位一组(思考为何?)
第四步:再把六位一组的二进制编码换算成十进制,再去base64密码表上查表
第五步:查表后组成密文,注意,最后补位的明文变成字符:’=’(怎么补位?)ide
第一:为何把八位二进制换算成六位二进制数?
由于一个字节是八位二进制,明文信息都是字符组成,一个字符是一个字节也就是八位。而后base64的密码表实际上就是一组键值对集合,其中key = {0, 1, 2, …, 63},因而乎,表示63的二进制编码须要6位,因此最大只须要6位,超过6位的表示也没用,会溢出,也就是没法表示!学习
第二:这个补位是什么意思?怎么补位?
假设明文的长度是L,那么换算的八位二进制编码的长度就是:8 * L,这个数必定可以被6所整除吗?显然是不必定的,因此须要对后面补0,并且这个补位,是一组一组的补,一组是8位 !直到总长度可以被6整除为止。网站
第一步:从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