# 原理淺說 換位加密的方法就是將需要加密的訊息字母重新排列,使其變成不可讀的亂碼\ 而這裡介紹的直欄換位密碼的排列方法,是需要利用給定的Key(密鑰),給定相對應的格數並將訊息依順序填入,再由第一列由上而下讀取便可以獲得加密訊息。\ 例如:\ Key(密鑰)為5,訊息為"Hello World!"\ 加密過程: 1. 給定格數為5的格子 2. 將訊息"Hello World!"依照順序填入格子中 3. 由第一列由上而下讀取得到加密訊息 如下圖所示:\  得到加密訊息為: "H deW!lolrol"\ \ 更多的詳細解說: [維基百科_換位密碼(英文)](https://en.wikipedia.org/wiki/Transposition_cipher) ___ # 加密實作 由於訊息是字串的方式讀入,每個字元都會有相對應的索引值(index),因此利用此索引值可以針對每個字元進行編排,如下圖所示:  第一列第一個字元的索引是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; } ``` \ `執行結果:` 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up