 |
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] = { 2, 3,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
|
 |