返回

密碼學之路

簡介

此篇將會介紹密碼學的相關知識,並會針對各個密碼進行加解密及破解實作。

基本名詞解釋

  1. 加密 Encrypt:指將明文經過某種程序轉換成密文,該程序稱為加密。
  2. 解密 Decrypt:指將密文經過某種程序轉換成名文,該程序稱為解密。
  3. 明文 Plaintext:加密前的訊息。
  4. 密文 CiperText:加密後的訊息。

經典密碼學

首先先來介紹密碼學中最最最基本的經典密碼學也可稱之為古典密碼學。

凱薩密碼

你或許沒聽過但你一定看過。 他是一種替換加密的技術,將明文中的所有字母都在字母表上向後或向前按照一個固定的數目進行偏移所形成的密文。 舉例來說:一個字母A偏移3時會變成D,你一定會問為什麼呢? A的ASCII=41,D的ASCII=44,那41+3=44,也就會偏移後變成我們所說的D,以此類推。 了解其原理後,你就會發現此加密方法非常容易被破解,但他還在現代的ROT13系統中被應用。 接著我們就要來實作凱薩密碼…

凱薩密碼加密實作

將字母轉換成ASCII後在加上偏移量後在轉換回字母即可達到凱薩加密的功能。

#include <iostream>
#include <cstring>
using namespace std;

int main(int argc, char* argv[]){
  char passWords[99];
  int offSet = 0;
  cout << "Enter a offset,please:";
  cin >> offSet;
  cout << "Enter a Number,please:";
  cin >> passWords; 
  for(int index = 0; index < strlen(passWords); index++)
    passWords[index] = char(int(passWords[index]) + offSet);
  cout << "Your Cipertext:" << passWords << endl;
  return 0;
}
Enter a offset,please:3
Enter a Number,please:A
Your Cipertext:D

凱薩密碼解密實作

加密反之,將字母轉換成ASCII後在減掉偏移量後在轉換回字母即可達到凱薩解密的功能。

#include <iostream>
#include <cstring>
using namespace std;

int main(int argc, char* argv[]){
  char passWords[99];
  int offSet = 0;
  cout << "Enter a offset,please:";
  cin >> offSet;
  cout << "Enter a Cipertext,please:";
  cin >> passWords; 
  for(int index = 0; index < strlen(passWords); index++)
    passWords[index] = char(int(passWords[index]) - offSet);
  cout << "Your Number:" << passWords << endl;
  return 0;
}
Enter a offset,please:3
Enter a Cipertext,please:D
Your Number:A

凱薩密碼破解實作

暴力解:透過偏移量測試,因為字母偏移量最大上限只有25。

以一個登入系統而言,當假設今天使用者登入的密碼都會經過凱薩加密。 使用者密碼輸入為:qwerty 偏移量3加密後:tzhuw| 接著我們要扮演一個要找出這個登入系統的加密偏移量的玩家。 那我們該怎麼做呢?

  1. 直接放棄
  2. 看著螢幕發呆

努力撰寫中…

維吉尼亞密碼

相較於凱薩加密法不一樣的地方在於維吉尼亞在每個明文字母都給予不同的偏移量,而這個偏移量來自事前輸入的基碼,因此通常需要搭配一個表格來快速對應加密後的字母位置。 努力撰寫中…

現代密碼學

努力撰寫中…

文獻參考

  1. 維基百科_密碼學
  2. 應用密碼學入門 Allen Chou
  3. 維基百科_凱薩密碼
  4. 維基百科_維吉尼亞密碼
comments powered by Disqus