【9-12】有一種技巧可以對資料進行加密,並使用乙個單詞作為它的金鑰。下面是它的工作原理:首先,選擇乙個單詞作為金鑰,如trailblazers。如果單詞中包含有重複的字母,只保留第乙個,其餘幾個丟棄。現在,修改過的那個單詞列於字母表的下面,如下所示:
最後,底下那行字母表中剩餘的字母填充完整(不能和前面的重複):
在對資訊進行加密時,資訊中的每個字母被固定於頂上那行,並用下面那行的對應字母一一取代原文的字母。因此,使用這個金鑰,attack at dawn(黎明時攻擊)就會被加密為tpptad tp itvh。這個題材共有三個程式(包括下面兩個練習)。
int prepare_key(char *key);
它接受乙個字串引數,它的內容就是需要使用的金鑰單詞,函式根據上面描述的方法把它轉換成乙個包含編好碼的字元陣列。假定key引數是個字元陣列,其長度至少可以容納27個字元。函式必須把金鑰中的所有字元要麼轉換成大寫,要麼轉換成小寫(隨你選擇),並從單詞中去除重複的字母,然後再用字母表中剩餘的字母按照你原先所選擇的大小寫形式填充到key陣列中去,如果處理成功,函式將返回乙個真值,如果key引數為空或包含任何非字母字元,函式將返回乙個假值。
void encrypt(char *data, char const *key);
它使用前題prepare_key函式所產生的金鑰對data中的字元進行加密。data中的非字母字元不作修改,但字母字元則用金鑰所提供的編過碼的字元一一取代源字元。字元的大小寫狀態應該保留。
void decrypt(char *data, char const *key);
它接受乙個加過密的字串為引數,它的任務是重現原來的資訊,除了它是用於解密之外,它的工作原理應該與encrypt相同。
這個題目的描述很多,其實邏輯還是比較清楚:
prepare_key函式:
1、去除key中的重複字母。
2、使用剩餘字母填充key。
encrypt函式:
加密,也就是使用字母表中對應的字母替換
decrypt函式:
解密:前面過程的逆向。
#include #include typedef short int int16_t;
typedef int int32_t;
#define true 1
#define false 0
#define nul '\0'
const char alphabet[27] = "abcdefghijklmnopqrstuvwxyz";
int init_key(char* key)
while( *key != nul)
*key = tolower(*key);
key++;
}return true;
}//從指定字串中移除制定字元,即將查詢的字元以後的字串拷貝到查詢到的位置
void remove_letter(char * string, char * ch)
*ch = *p;
}void remove_repeat_letters(char *key)
}printf("\n-----------\n");
}void fill_key(char *key)
printf("got alphabet after filter keys: %s\n", string);
//填充完整
strcat(key, string);
}int prepare_key(char *key)
//刪除重複字元
printf("before repeat letters: %s\n",key);
remove_repeat_letters(key);
printf("after repeat letters: %s\n",key);
//填充剩餘字元
fill_key(key);
return true;
}int main()
輸出結果:
before repeat letters: trailblazers
------remove_repeat_letters------
key: railblazers
check ch: t
key: ailblazers
check ch: r
remove: [r] from [ailblazers]
key: ilblazes
check ch: a
remove: [a] from [ilblazes]
key: lblzes
check ch: i
key: blzes
check ch: l
remove: [l] from [blzes]
key: zes
check ch: b
key: es
check ch: z
key: s
check ch: e
key:
check ch: s
-----------
after repeat letters: trailbzes
fill key: abcdefghijklmnopqrstuvwxyz , trailbzes
remove [a] from [abcdefghijklmnopqrstuvwxyz]
remove [b] from [bcdefghijklmnopqrstuvwxyz]
remove [e] from [cdefghijklmnopqrstuvwxyz]
remove [i] from [cdfghijklmnopqrstuvwxyz]
remove [l] from [cdfghjklmnopqrstuvwxyz]
remove [r] from [cdfghjkmnopqrstuvwxyz]
remove [s] from [cdfghjkmnopqstuvwxyz]
remove [t] from [cdfghjkmnopqtuvwxyz]
remove [z] from [cdfghjkmnopquvwxyz]
got alphabet after filter keys: cdfghjkmnopquvwxy
1trailbzescdfghjkmnopquvwxy
其中如何刪除某個字串在另乙個字串**現的字元,這個利用strpbrk函式很好的實現了,所以基本的庫函式使用需要掌握。
void encrypt(char *data, char *key) else
printf(" %c ", *p);
}p++;
}printf("\n");
}int main()
return 0;
}
這裡的核心就是找到要加密的每個字元在alphabet中對應的秘鑰字元,方法很簡單,二者是一一對應的,只需要算出要加密的字串的偏移就得到了在秘鑰字串中的位置。
需要注意的要大小寫需要保持原狀,只對字母加密,其他字元(如空格)不加密。
encrypt : t p p t a d t p i t v
encrypt_data: tpptad tp itv
第三個函式就是解密:
解密過程和加密過程是互逆的,加密是將找到加密的字串對應在alphabet中的字元位置,用這個位置在秘鑰中取出加密字元。
解密過程則直接是找到加密字串每個字元在秘鑰串中的位置,然後用這個位置在alphabet中取出對應的字元。
void decrypt(char *data, char const *key) else
}printf(" %c ", *p);
p++;
}printf("\n");
}int main()
return 0;
}
這個題目雖然描述很複雜,邏輯也很多,但整體思路還是比較清楚,沒有非常複雜的演算法邏輯,但是對基本功是很好的考察。難度三顆星。 對稱加密演算法 DES加密演算法
一 對稱加密演算法 對稱加密也稱為常規加密 私鑰或單鑰加密。乙個對稱加密由5部分組成 明文 plaintext 這是原始資訊或資料,作為演算法的輸入。加密演算法 encryption algorithm 加密演算法對明文進行各種替換和轉換。金鑰 secret key 金鑰也是演算法的輸入。演算法進行...
gentry同態加密演算法 同態加密演算法
本文對同態加密演算法進行學習。參考文章同態加密演算法。定義同態加密演算法保證對聯合密文的解密結果等價於聯合明文。若存在同態加密演算法f,針對明文a和b,加密後分別得到a f a b f b 將其和a b 解密後得到a b,則同態加密演算法f被成為加法同態加密演算法。加法同態演算法的加密和解密分別用e...
對稱加密演算法 非對稱加密演算法
對稱加密演算法 對稱加密演算法是應用較早的加密演算法,技術成熟。在對稱加密演算法中,資料發信方將明文 原始資料 和加密金鑰一起經過特殊加密演算法處理後,使其變成複雜的加密密文傳送出去。收信方收到密文後,若想解讀原文,則需要使用加密用過的金鑰及相同演算法的逆演算法對密文進行解密,才能使其恢復成可讀明文...