Knap-Sack Encryption

 

 

            This is an old encryption method. Nowadays even desktop computers can break the key. A simple implementation of this encryption method can be found here. This program takes a string and encrypts it with knap-sack.

 

 

 

The Algorithm

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


C Source Code

 

File Name: Knapsack.cpp

 

/*
  This program encrypts a text array using Knap-Sack algorithm
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<conio.h>
#include<time.h>
#include< Knapsack.h>
 
unsigned long calc_fim(unsigned int m)
{
  unsigned long fim, t, i, j, s;
  unsigned int carpan[100]={0};
 
  t = Asal[0];
  i = 1;
  j = 0;
  while ((m > t) && (i< Asal_Adet))
    if ((m % t) == 0)
     {
       carpan[j] = t;
       j++;
       m = m / t;
     }
    else // bir sonraki asal sayy test edilecek
     {
       t = Asal[i];
       i++;
     }
  carpan[j] = t;
  j++;
  i = 1;
  t = carpan[0];
  fim = t - 1;
  s = 1;
  m = t;
  while (i < j)
   {
     if (carpan[i] == t)
      {
            s++;
            m = m * t;
      }
     else
      {
            m = m / t;
            fim = fim * m;
            t = carpan[i];
            fim = fim * (t-1);
            s = 1;
            m = t;
      }
     i++;
   }
  if (s > 1)
   {
     m = m / t;
     fim = fim * m;
   }
  fim--;
  return fim;
}
 
unsigned long findmod(unsigned long a, unsigned long b, unsigned long c)
{
  unsigned long i, s, x, t;
  x = a % c;
  s = 1;
  while (b != 0)
   {
     i = b & 1// 0 for even, 1 for odd
     b = b >> 1;
     t = (x * i) % c;
     if ( t != 0)
       s = (s * t) % c;
     x = (x * x) % c;
   }
  return s;
}
 
unsigned long TPower(int a, int b)
{
  unsigned long i, r=1;
  if (b > 0// Mesela 2^0 = 1  'dir
     for(i=0;i<b;i++)
       r = r * a;
  return r;
}
 
int encode( unsigned int A[],
                 char Text[],
                 char AN,
                 unsigned int t,
                 unsigned int m,
                 unsigned long sifre[],
                 unsigned int *L )
{
  long i, j, n;
  unsigned int B[10], s;
  char T1, T2;
  for(i=0;i<10;i++)
   {
     B[i] = (t * A[i]) % m;
   }
  *L = 0;
  i = 0;
  while(i<AN)
   {
     n = 0;
     T2 = Text[i];
     T1 = Text[i+1];
     s = 9// last element is 9
     for(j=0;j<5;j++)
      {
       if( (T2 & 1) > 0 ) // odd number
             n = n + B[s];
       s--;
       T2 >>=1// division by 2
      }
     for(j=0;j<5;j++)
      {
       if( (T1 & 1)> 0 ) // odd number
             n = n + B[s];
       s--;
       T1 >>=1// division by 2
      }
     sifre[*L] = n;
     *L = *L + 1;
     i +=2;
   }
  return 0;
}
 
int decode( unsigned int A[],
                   char Text_Geri[],
                   unsigned int t,
                   unsigned int m,
                   unsigned int L,
                   unsigned long sifre[] )
{
  unsigned long i, j, p, x, u, m_1;
  unsigned int k, s;
  int z;
  m_1 = calc_fim(m);
  u = findmod(t, m_1, m);
 
  j = 0;
  for(i=0;i<L;i++)
   {
     p = sifre[i];
 
     s = (p * u) % m;
     x = 0;
     k = 0;
     for(z=9;z>=5;z--)
      {
            if(s >= A[z])
             {
               x = x + TPower(2, k);
               s = s - A[z];
             }
            k++;
      }
     Text_Geri[j] = x;
     k = 0;
     x = 0;
     for(z=4;z>=0;z--)
      {
            if(s >= A[z])
             {
               x = x + TPower(2, k);
               s = s - A[z];
             }
            k++;
      }
     Text_Geri[j+1] = x;
     j += 2;
   }
 
  return 0;
}
 
void main(void)
{
  char Text[50]={0}, Text_Geri[50]={0}, AN;
  unsigned long sifre[50]={0};
  unsigned int i, L, t, m, A[10]={1,3,5,11,21,44,87,175,349,701};
  clrscr();
  printf("Input Text: ");scanf("%s", Text);
  printf("t :");scanf("%d", &t);
  printf("m :");scanf("%d", &m);
  AN = strlen(Text);
  for(i=0;i<AN;i++) Text[i] = toupper(Text[i]);
  for(i=0;i<AN;i++) Text[i] = Text[i] - 64;
  encode(A, Text, AN, t, m, sifre, &L);
  decode(A, Text_Geri, t, m, L, sifre);
// visualization 
  for(i=0;i<AN;i++) Text_Geri[i] = Text_Geri[i] + 64;
  printf("Encoded output : ");
  for(i=0;i<L;i++)
    printf("%ld ",sifre[i]);
  Text_Geri[AN+1] = NULL;
  printf("\nDecoded text : %s", Text_Geri);
 
  getch();
}

 

File Name: KNAPSACK.H

 

#define Asal_Adet 168
 
Asal[168] = {  23,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,
                   67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,
                   139,149,151,157,163,167,173,179,181,191,193,197,199,
                   211,223,227,229,233,239,241,251,257,263,269,271,277,
                   281,283,293,307,311,313,317,331,337,347,349,353,359,
                   367,373,379,383,389,397,401,409,419,421,431,433,439,
                   443,449,457,461,463,467,479,487,491,499,503,509,521,
                   523,541,547,557,563,569,571,577,587,593,599,601,607,
                   613,617,619,631,641,643,647,653,659,661,673,677,683,
                   691,701,709,719,727,733,739,743,751,757,761,769,773,
                   787,797,809,811,821,823,827,829,839,853,857,859,863,
                   877,881,883,887,907,911,919,929,937,941,947,953,967,
                   971,977,983,991,997};

 

Sample Executions

 

 

Input Text : BIZ_DE_BURADAN_GECTIK

t :43

m :1590

Encoded output: 1729 3323 2283 4721 3506 1738 2340 5839 4064 2499 2781

Decoded text : BIZ_DE_BURADAN_GECTIK

 

 

 

 

 

Input Text : BUNDAN_DAHA_IYISI_OLAMAZ

t :43

m :1590

Encoded output : 1858 2638 2340 4463 1652 3286 3159 3503 3847 4290 2770 2168

Decoded text : BUNDAN_DAHA_IYISI_OLAMAZ

 

 
Copyright by Chasan Chouse