logo

تشفير النقل العمودي

عند إعطاء رسالة نصية عادية وتشفير/فك تشفير مفتاح رقمي، فإن النص المحدد باستخدام تشفير النقل العمودي هو شكل من أشكال تشفير التحويل تمامًا مثل تشفير سياج السكك الحديدية . يتضمن النقل العمودي كتابة النص العادي في صفوف ثم قراءة النص المشفر في الأعمدة واحدًا تلو الآخر.

أمثلة:

    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 

التشفير



في تشفير التحويل، يتم إعادة ترتيب ترتيب الحروف الهجائية للحصول على النص المشفر.

  1. تتم كتابة الرسالة في صفوف ذات طول ثابت ثم تتم قراءتها مرة أخرى عمودًا تلو الآخر ويتم اختيار الأعمدة بترتيب مختلط.
  2. عادةً ما يتم تحديد عرض الصفوف وتبديل الأعمدة بواسطة كلمة رئيسية.
  3. على سبيل المثال، يبلغ طول كلمة HACK 4 (وبالتالي فإن طول الصفوف 4) ويتم تحديد التقليب حسب الترتيب الأبجدي للأحرف في الكلمة الأساسية. في هذه الحالة سيكون الترتيب "3 1 2 4".
  4. يتم ملء أي مسافات فارغة بالقيم الخالية أو تركها فارغة أو وضعها بواسطة حرف (مثال: _).
  5. وأخيرًا تتم قراءة الرسالة في أعمدة بالترتيب الذي تحدده الكلمة الأساسية.
تشفير النقل العمودي' title=

فك التشفير

  1. ولفك تشفيرها، يتعين على المستلم حساب أطوال الأعمدة عن طريق قسمة طول الرسالة على طول المفتاح.
  2. ثم قم بكتابة الرسالة في أعمدة مرة أخرى ثم أعد ترتيب الأعمدة عن طريق إعادة صياغة الكلمة الرئيسية.
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 

الإخراج
Encrypted Message : e kefGsGsrekoe_ Decrypted Message : Geeks for Geeks 


إنشاء اختبار