---
# System prepended metadata

title: 以C語言實作換位密碼
tags: [加密與解密, C語言]

---

# 原理淺說
換位加密的方法就是將需要加密的訊息字母重新排列，使其變成不可讀的亂碼\
而這裡介紹的直欄換位密碼的排列方法，是需要利用給定的Key(密鑰)，給定相對應的格數並將訊息依順序填入，再由第一列由上而下讀取便可以獲得加密訊息。\
例如:\
Key(密鑰)為5，訊息為"Hello World!"\
加密過程：
1. 給定格數為5的格子
2. 將訊息"Hello World!"依照順序填入格子中
3. 由第一列由上而下讀取得到加密訊息

如下圖所示:\
![直欄換位密碼](https://hackmd.io/_uploads/SJOP0qkch.png)
得到加密訊息為: "H deW!lolrol"\
\
更多的詳細解說: [維基百科_換位密碼(英文)](https://en.wikipedia.org/wiki/Transposition_cipher)

___

# 加密實作
由於訊息是字串的方式讀入，每個字元都會有相對應的索引值(index)，因此利用此索引值可以針對每個字元進行編排，如下圖所示:
![示例](https://hackmd.io/_uploads/ryxclQNc2.png)
第一列第一個字元的索引是0，而依照上述加密規則排列以後，會發現第二列的索引會是第一列的索引加上Key(密鑰)\
例如上圖所示：\
-訊息中的'H'(索引為0)再加上Key(密鑰)，可以得到' '(space，索引為5)\
-訊息中的'e'(索引為1)再加上Key(密鑰)，可以得到'W'(索引為6)\
而第二列的字母便是加一次，第三列則是加兩次以此類推...\
\
藉由上述規律便可以撰寫程式，其餘輸入方式、介面格式就不另行贅述，僅範例程式作為參考\
更多原始碼參考：[Github](https://github.com/aaronhuang1005/cracking-code)

:::warning
:warning:
在進行加密的時候需要注意原字串的長度，例如上述圖所示第三排第二列字母'o'(索引7)雖然加上Key(密鑰)後，理論上會得到第三排第三列的字母(索引12)，但原字串的長度卻只有12(索引最大值為11)，因此需要避免此Index Out Of Range的問題
:::

\
`encrypted.c`
```c=
#include<stdio.h>
#include<string.h>

int main(){
	char code[100];
	int key=0,index=0,j=0,len=0,i=0;
	char translated[100];
	printf("Input the code: ");
	while(gets(code)){
		i=0;
		printf("Input the key:");
		scanf("%d",&key);
		len=strlen(code);
		for(index=0;index<key;index++){
			for(j=0;(j<(len/key)+1)&&((index+key*j)<len);j++){
				translated[i]=code[index+key*j];    //index means which column are we
				i++;
			}
		}
		printf("%s\n\nInput the code: ",translated);
	}
	return 0;
}
```
\
`執行結果:`

![執行結果](https://hackmd.io/_uploads/rylt7BCq3.png)
