
| 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
沒有留言:
張貼留言
0.留言請選擇註冊帳號, Google 或 OpenID 均可
1.歡迎留言交流,但不歡迎垃圾留言及廣告留言
2.文章相關問題歡迎提出,請減少情緒性留言
3.非文章相關內容,請到 G+ 社群或 FB 社團提出
4.問作業之留言會被直接刪除
5.莫忘網路禮節
6.可使用部份HTML標記,如 <b> 、 <i> 、 <a>
7.站長保留刪除留言的權力