Donat un missatge de text senzill i un xifratge/desxifrat de clau numèrica, el text donat utilitzant el xifratge de transposició columnar El xifratge de transposició columnar és una forma de xifrat de transposició igual que Xifrat de tanca de ferrocarril . La transposició en columna consisteix a escriure el text sense format en files i després llegir el text xifrat en columnes una per una.
Exemples:
Encryption Input : Geeks for Geeks Key = HACK Output : e kefGsGsrekoe_ Decryption Input : e kefGsGsrekoe_ Key = HACK Output : Geeks for Geeks Encryption Input : Geeks on work Key = HACK Output : e w_eoo_Gs kknr_ Decryption Input : e w_eoo_Gs kknr_ Key = HACK Output : Geeks on work
Xifratge
En un xifrat de transposició, l'ordre dels alfabets es reordena per obtenir el text xifrat.
- El missatge s'escriu en files de longitud fixa i després es llegeix novament columna per columna i les columnes s'escullen en algun ordre codificat.
- L'amplada de les files i la permutació de les columnes solen definir-se mitjançant una paraula clau.
- Per exemple, la paraula HACK és de longitud 4 (per tant, les files són de longitud 4) i la permutació es defineix per l'ordre alfabètic de les lletres de la paraula clau. En aquest cas, l'ordre seria '3 1 2 4'.
- Tots els espais de recanvi s'omplen amb nulls o es deixen en blanc o es col·loquen per un caràcter (Exemple: _).
- Finalment, el missatge es llegeix en columnes en l'ordre especificat per la paraula clau.

Desxifrat
- Per desxifrar-lo, el destinatari ha de calcular la longitud de les columnes dividint la longitud del missatge per la longitud de la clau.
- A continuació, torneu a escriure el missatge en columnes i torneu a ordenar les columnes reformant la paraula clau.
// CPP program for illustrating // Columnar Transposition Cipher #include using namespace std; // Encription function string Encryption(int no_rows int len_key int len_msg string msg int col_val[]) { int x = 0; char enc_mat[no_rows + 1][len_key]; // creating the matrix for (int i = 0; i < no_rows + 1; i++) { for (int j = 0; j < len_key; j++) { // initializes the positions with '_' after the // end of message if (x >= len_msg) { enc_mat[i][j] = '_'; } else { enc_mat[i][j] = msg[x]; } x++; } } int t = 1; string cipher = ''; // finding the cipher text according to the value of // col_val matrix while (t <= len_key) { for (int i = 0; i < len_key; i++) { int k = col_val[i]; if (k == t) { for (int j = 0; j < no_rows + 1; j++) { cipher += enc_mat[j][i]; } t++; } } } return cipher; } // decryption function string Decryption(int no_rows int len_key string cipher int col_val[]) { char dec_mat[no_rows + 1][len_key]; int x = 0 t = 1; // rearrange the matrix according to the col_val while (t <= len_key) { for (int i = 0; i < len_key; i++) { int k = col_val[i]; if (k == t) { for (int j = 0; j < no_rows + 1; j++) { dec_mat[j][i] = cipher[x]; x++; } t++; } } } string message = ''; for (int i = 0; i < no_rows + 1; i++) { for (int j = 0; j < len_key; j++) { // replacing the '_' with space if (dec_mat[i][j] == '_') { dec_mat[i][j] = ' '; } message += dec_mat[i][j]; } } return message; } int main() { // message string msg = 'Geeks for Geeks'; // key string key = 'HACK'; int len_key = key.length(); int len_msg = msg.length(); int val = 1 count = 0 ind; int col_val[len_key]; // intializing col_val matrix with 0 memset(col_val 0 sizeof(col_val)); // numbering the key alphabets according to its ACII // value while (count < len_key) { int min = 999; for (int i = 0; i < len_key; i++) { if ((min > int(key[i])) && (col_val[i] == 0)) { min = int(key[i]); ind = i; } } col_val[ind] = val; count++; val++; } int no_rows = len_msg / len_key; // encrypted text string cipher_text = ' '; cipher_text = Encryption(no_rows len_key len_msg msg col_val); cout << 'Encrypted Message : ' << cipher_text << endl; // decrypted text string original_msg = ' '; original_msg = Decryption(no_rows len_key cipher_text col_val); cout << 'Decrypted Message : ' << original_msg << endl; } // This code is contributed by Suchita Gond
Java import java.util.*; public class ColumnarTranspositionCipher { // Key for Columnar Transposition static final String key = 'HACK'; static Map<Character Integer> keyMap = new HashMap<>(); static void setPermutationOrder() { // Add the permutation order into the map for (int i = 0; i < key.length(); i++) { keyMap.put(key.charAt(i) i); } } // Encryption static String encryptMessage(String msg) { int row col; StringBuilder cipher = new StringBuilder(); /* Calculate the number of columns in the matrix */ col = key.length(); /* Calculate the maximum number of rows in the matrix */ row = (int) Math.ceil((double) msg.length() / col); char[][] matrix = new char[row][col]; for (int i = 0 k = 0; i < row; i++) { for (int j = 0; j < col; ) { if (k < msg.length()) { char ch = msg.charAt(k); if (Character.isLetter(ch) || ch == ' ') { matrix[i][j] = ch; j++; } k++; } else { /* Add padding character '_' */ matrix[i][j] = '_'; j++; } } } for (Map.Entry<Character Integer> entry : keyMap.entrySet()) { int columnIndex = entry.getValue(); // Get the cipher text from the matrix column-wise using the permuted key for (int i = 0; i < row; i++) { if (Character.isLetter(matrix[i][columnIndex]) || matrix[i][columnIndex] == ' ' || matrix[i][columnIndex] == '_') { cipher.append(matrix[i][columnIndex]); } } } return cipher.toString(); } // Decryption static String decryptMessage(String cipher) { /* Calculate the number of columns for the cipher matrix */ int col = key.length(); int row = (int) Math.ceil((double) cipher.length() / col); char[][] cipherMat = new char[row][col]; /* Add characters into the matrix column-wise */ int k = 0; for (int j = 0; j < col; j++) { for (int i = 0; i < row; i++) { cipherMat[i][j] = cipher.charAt(k); k++; } } /* Update the order of the key for decryption */ int index = 0; for (Map.Entry<Character Integer> entry : keyMap.entrySet()) { entry.setValue(index++); } /* Arrange the matrix column-wise according to the permutation order */ char[][] decCipher = new char[row][col]; for (int l = 0; l < key.length(); l++) { int columnIndex = keyMap.get(key.charAt(l)); for (int i = 0; i < row; i++) { decCipher[i][l] = cipherMat[i][columnIndex]; } } /* Get the message using the matrix */ StringBuilder msg = new StringBuilder(); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (decCipher[i][j] != '_') { msg.append(decCipher[i][j]); } } } return msg.toString(); } public static void main(String[] args) { /* Message */ String msg = 'Geeks for Geeks'; setPermutationOrder(); // Calling encryption function String cipher = encryptMessage(msg); System.out.println('Encrypted Message: ' + cipher); // Calling Decryption function System.out.println('Decrypted Message: ' + decryptMessage(cipher)); } }
Python # Python3 implementation of # Columnar Transposition import math key = 'HACK' # Encryption def encryptMessage(msg): cipher = '' # track key indices k_indx = 0 msg_len = float(len(msg)) msg_lst = list(msg) key_lst = sorted(list(key)) # calculate column of the matrix col = len(key) # calculate maximum row of the matrix row = int(math.ceil(msg_len / col)) # add the padding character '_' in empty # the empty cell of the matix fill_null = int((row * col) - msg_len) msg_lst.extend('_' * fill_null) # create Matrix and insert message and # padding characters row-wise matrix = [msg_lst[i: i + col] for i in range(0 len(msg_lst) col)] # read matrix column-wise using key for _ in range(col): curr_idx = key.index(key_lst[k_indx]) cipher += ''.join([row[curr_idx] for row in matrix]) k_indx += 1 return cipher # Decryption def decryptMessage(cipher): msg = '' # track key indices k_indx = 0 # track msg indices msg_indx = 0 msg_len = float(len(cipher)) msg_lst = list(cipher) # calculate column of the matrix col = len(key) # calculate maximum row of the matrix row = int(math.ceil(msg_len / col)) # convert key into list and sort # alphabetically so we can access # each character by its alphabetical position. key_lst = sorted(list(key)) # create an empty matrix to # store deciphered message dec_cipher = [] for _ in range(row): dec_cipher += [[None] * col] # Arrange the matrix column wise according # to permutation order by adding into new matrix for _ in range(col): curr_idx = key.index(key_lst[k_indx]) for j in range(row): dec_cipher[j][curr_idx] = msg_lst[msg_indx] msg_indx += 1 k_indx += 1 # convert decrypted msg matrix into a string try: msg = ''.join(sum(dec_cipher [])) except TypeError: raise TypeError('This program cannot' 'handle repeating words.') null_count = msg.count('_') if null_count > 0: return msg[: -null_count] return msg # Driver Code msg = 'Geeks for Geeks' cipher = encryptMessage(msg) print('Encrypted Message: {}'. format(cipher)) print('Decryped Message: {}'. format(decryptMessage(cipher))) # This code is contributed by Aditya K
C# using System; using System.Collections.Generic; public class ColumnarTranspositionCipher { // Key for Columnar Transposition static readonly string key = 'HACK'; static Dictionary<char int> keyMap = new Dictionary<char int>(); static void SetPermutationOrder() { // Add the permutation order into the dictionary for (int i = 0; i < key.Length; i++) { keyMap[key[i]] = i; } } // Encryption static string EncryptMessage(string msg) { int row col; System.Text.StringBuilder cipher = new System.Text.StringBuilder(); /* Calculate the number of columns in the matrix */ col = key.Length; /* Calculate the maximum number of rows in the * matrix */ row = (int)Math.Ceiling((double)msg.Length / col); char[ ] matrix = new char[row col]; for (int i = 0 k = 0; i < row; i++) { for (int j = 0; j < col;) { if (k < msg.Length) { char ch = msg[k]; if (char.IsLetter(ch) || ch == ' ') { matrix[i j] = ch; j++; } k++; } else { /* Add padding character '_' */ matrix[i j] = '_'; j++; } } } foreach( var entry in new Dictionary<char int>(keyMap)) { int columnIndex = entry.Value; // Get the cipher text from the matrix // column-wise using the permuted key for (int i = 0; i < row; i++) { if (char.IsLetter(matrix[i columnIndex]) || matrix[i columnIndex] == ' ' || matrix[i columnIndex] == '_') { cipher.Append(matrix[i columnIndex]); } } } return cipher.ToString(); } // Decryption static string DecryptMessage(string cipher) { /* Calculate the number of columns for the cipher * matrix */ int col = key.Length; int row = (int)Math.Ceiling((double)cipher.Length / col); char[ ] cipherMat = new char[row col]; /* Add characters into the matrix column-wise */ int k = 0; for (int j = 0; j < col; j++) { for (int i = 0; i < row; i++) { cipherMat[i j] = cipher[k]; k++; } } /* Update the order of the key for decryption */ int index = 0; foreach( var entry in new Dictionary<char int>(keyMap)) { keyMap[entry.Key] = index++; } /* Arrange the matrix column-wise according to the * permutation order */ char[ ] decCipher = new char[row col]; foreach(var entry in keyMap) { int columnIndex = entry.Value; for (int i = 0; i < row; i++) { decCipher[i columnIndex] = cipherMat[i columnIndex]; } } /* Get the message using the matrix */ System.Text.StringBuilder msg = new System.Text.StringBuilder(); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (decCipher[i j] != '_') { msg.Append(decCipher[i j]); } } } return msg.ToString(); } public static void Main(string[] args) { /* Message */ string msg = 'Geeks for Geeks'; SetPermutationOrder(); // Calling encryption function string cipher = EncryptMessage(msg); Console.WriteLine('Encrypted Message: ' + cipher); // Calling Decryption function Console.WriteLine('Decrypted Message: ' + DecryptMessage(cipher)); } }
JavaScript // JavaScript implementation of // Columnar Transposition const key = 'HACK'; // Encryption function encryptMessage(msg) { let cipher = ''; // track key indices let k_indx = 0; const msg_len = msg.length; const msg_lst = Array.from(msg); const key_lst = Array.from(key).sort(); // calculate column of the matrix const col = key.length; // calculate maximum row of the matrix const row = Math.ceil(msg_len / col); // add the padding character '_' in empty // the empty cell of the matrix const fill_null = (row * col) - msg_len; for (let i = 0; i < fill_null; i++) { msg_lst.push('_'); } // create Matrix and insert message and // padding characters row-wise const matrix = []; for (let i = 0; i < msg_lst.length; i += col) { matrix.push(msg_lst.slice(i i + col)); } // read matrix column-wise using key for (let _ = 0; _ < col; _++) { const curr_idx = key.indexOf(key_lst[k_indx]); for (const row of matrix) { cipher += row[curr_idx]; } k_indx++; } return cipher; } // Decryption function decryptMessage(cipher) { let msg = ''; // track key indices let k_indx = 0; // track msg indices let msg_indx = 0; const msg_len = cipher.length; const msg_lst = Array.from(cipher); // calculate column of the matrix const col = key.length; // calculate maximum row of the matrix const row = Math.ceil(msg_len / col); // convert key into list and sort // alphabetically so we can access // each character by its alphabetical position. const key_lst = Array.from(key).sort(); // create an empty matrix to // store deciphered message const dec_cipher = []; for (let i = 0; i < row; i++) { dec_cipher.push(Array(col).fill(null)); } // Arrange the matrix column wise according // to permutation order by adding into a new matrix for (let _ = 0; _ < col; _++) { const curr_idx = key.indexOf(key_lst[k_indx]); for (let j = 0; j < row; j++) { dec_cipher[j][curr_idx] = msg_lst[msg_indx]; msg_indx++; } k_indx++; } // convert decrypted msg matrix into a string try { msg = dec_cipher.flat().join(''); } catch (err) { throw new Error('This program cannot handle repeating words.'); } const null_count = (msg.match(/_/g) || []).length; if (null_count > 0) { return msg.slice(0 -null_count); } return msg; } // Driver Code const msg = 'Geeks for Geeks'; const cipher = encryptMessage(msg); console.log('Encrypted Message: ' + cipher); console.log('Decrypted Message: ' + decryptMessage(cipher)); // This code is contributed by phasing17
Sortida
Encrypted Message : e kefGsGsrekoe_ Decrypted Message : Geeks for Geeks