logo

Cifrario di trasposizione colonnare

Dato un messaggio di testo semplice e una chiave numerica cifra/decifra il testo dato utilizzando la cifratura a trasposizione a colonne La cifratura a trasposizione a colonne è una forma di cifratura a trasposizione proprio come Cifratore del recinto ferroviario . La trasposizione colonnare prevede la scrittura del testo in chiaro in righe e la successiva lettura del testo cifrato in colonne una per una.

Esempi:

    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 

Crittografia



In una cifratura a trasposizione l'ordine degli alfabeti viene riorganizzato per ottenere il testo cifrato.

  1. Il messaggio viene scritto in righe di lunghezza fissa e poi riletto colonna per colonna e le colonne vengono scelte in un ordine criptato.
  2. La larghezza delle righe e la permutazione delle colonne sono generalmente definite da una parola chiave.
  3. Ad esempio, la parola HACK è di lunghezza 4 (quindi le righe sono di lunghezza 4) e la permutazione è definita dall'ordine alfabetico delle lettere nella parola chiave. In questo caso l'ordine sarebbe '3 1 2 4'.
  4. Eventuali spazi liberi vengono riempiti con valori nulli o lasciati vuoti o inseriti da un carattere (Esempio: _).
  5. Infine il messaggio viene letto in colonne nell'ordine specificato dalla parola chiave.
cifrario a trasposizione colonnare' title=

Decrittazione

  1. Per decifrarlo il destinatario deve calcolare la lunghezza della colonna dividendo la lunghezza del messaggio per la lunghezza della chiave.
  2. Quindi scrivi nuovamente il messaggio in colonne, quindi riordina le colonne riformando la parola chiave.
C++
// 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 

Produzione
Encrypted Message : e kefGsGsrekoe_ Decrypted Message : Geeks for Geeks 


Crea quiz