這是小良的第一道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