001 | // 引入標準程式庫中的 cstdlib 及 ctime |
002 | #include <cstdlib> // srand(), rand() |
003 | #include <ctime> // time() |
004 | |
005 | // 引入 Encrypt 類別的標頭檔 |
006 | #include "encrypt.h" |
007 | |
008 | // Encrypt 的建構函數 |
009 | Encrypt::Encrypt() { |
010 | // 呼叫 setter 設定 code_array |
011 | set_code_array(); |
012 | } |
013 | |
014 | // 設定 code_array 的 setter 成員函數 |
015 | void Encrypt::set_code_array() { |
016 | // 設定擬隨機數的種子 |
017 | srand(time(0)); |
018 | |
019 | // 取得 a 、 b 值 |
020 | int a = 0; |
021 | int b = 0; |
022 | while (a % 2 == 0) { |
023 | a = rand() % 10; |
024 | b = rand() % 10; |
025 | } |
026 | |
027 | // 利用公式建立密碼表字串 |
028 | int x, y, m; |
029 | char r; |
030 | char c = 'a'; |
031 | string s; |
032 | int i; |
033 | for (i = 0; i < N; i++) { |
034 | x = c; |
035 | y = x * a + b; |
036 | m = y % N; |
037 | s += (char) m + DIFF; |
038 | c++; |
039 | } |
040 | |
041 | // 將建立好的密碼表直接設定給成員變數 |
042 | code_array = s; |
043 | } |
044 | |
045 | // 由參數字串設定密碼表 |
046 | void Encrypt::set_code_array(string s) { |
047 | code_array = s; |
048 | } |
049 | |
050 | // 回傳密碼表字串的 getter 成員函數 |
051 | string Encrypt::get_code_array() { |
052 | return code_array; |
053 | } |
054 | |
055 | // 進行編碼工作的成員函數 |
056 | string Encrypt::ToEncode(string s) { |
057 | // 由參數字串取得字元的暫存變數 |
058 | char c; |
059 | // 暫存編碼結果的字串 |
060 | string r; |
061 | int i, m; |
062 | // 利用迴圈走完參數字串的所有字元 |
063 | for (i = 0; i < s.size(); i++) { |
064 | // 判斷該字元是否為英文小寫字母 |
065 | // 若是英文小寫字母就進行編碼轉換 |
066 | if (s.at(i) >= DIFF && s.at(i) < DIFF + N) { |
067 | c = s.at(i); |
068 | m = c - 97; |
069 | r += get_code_array().at(m); |
070 | } |
071 | else { |
072 | r += s.at(i); |
073 | } |
074 | } |
075 | |
076 | // 結束回傳編碼過的字串 |
077 | return r; |
078 | } |
079 | |
080 | // 進行解碼工作的成員函數 |
081 | string Encrypt::ToDecode(string s) { |
082 | // 暫存解碼結果的字串 |
083 | string r; |
084 | int i, j; |
085 | // 第一層迴圈逐一取得每一個字元 |
086 | for (i = 0; i < s.size(); i++) { |
087 | // 判斷該字元是否為英文小寫字母 |
088 | // 若是英文小寫字母就進行解碼轉換 |
089 | if (s.at(i) >= DIFF && s.at(i) < DIFF + N) { |
090 | // 第二層迴圈尋找該字元在密碼表中的索引值 |
091 | // 該索引值加上 DIFF 就可轉換回原本的字元 |
092 | for (j = 0; j < N; j++) { |
093 | if (s.at(i) == get_code_array().at(j)) { |
094 | r += (char) j + DIFF; |
095 | break; |
096 | } |
097 | } |
098 | } |
099 | else { |
100 | r += s.at(i); |
101 | } |
102 | } |
103 | |
104 | // 結束回傳解碼過的字串 |
105 | return r; |
106 | } |
107 | |
108 | /* encrypt.cpp |
109 | Kaiching Chang |
110 | 2014-5 */ |
the end
沒有留言:
張貼留言