logo

Spaltetransponeringscifer

Givet en almindelig tekstbesked og en numerisk nøgle chiffer/dechifrerer den givne tekst ved hjælp af Columnar Transposition Cipher. Columnar Transposition Cipher er en form for transponeringscifre ligesom Rail Hegn Cipher . Kolumnartransponering indebærer at skrive klarteksten ud i rækker og derefter læse chifferteksten af ​​i kolonner én efter én.

Eksempler:

    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 

Kryptering



I en transponeringskryptering omarrangeres alfabeternes rækkefølge for at opnå chifferteksten.

  1. Beskeden skrives ud i rækker af fast længde og læses derefter op igen kolonne for kolonne, og kolonnerne vælges i en eller anden krypteret rækkefølge.
  2. Bredden af ​​rækkerne og permutationen af ​​kolonnerne er normalt defineret af et nøgleord.
  3. For eksempel er ordet HACK af længde 4 (så rækkerne er af længde 4), og permutationen er defineret af den alfabetiske rækkefølge af bogstaverne i nøgleordet. I dette tilfælde ville rækkefølgen være '3 1 2 4'.
  4. Eventuelle ledige mellemrum udfyldes med nuller eller efterlades tomme eller placeres af et tegn (eksempel: _).
  5. Til sidst læses meddelelsen op i kolonner i den rækkefølge, der er angivet af nøgleordet.
søjleformet-transposition-cifre' title=

Dekryptering

  1. For at dechifrere det skal modtageren beregne kolonnelængderne ved at dividere beskedlængden med nøglelængden.
  2. Skriv derefter beskeden ud i spalter igen og omorganiser kolonnerne ved at omforme nøgleordet.
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 

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


Opret quiz