|| Author: Cyberdude || Back to articles ||
[ Classic Cryptography Techniques ]
	0x0 Sostituition Techniques
		0x0x1 Cesare's Ciphrature
		0x0x2 PlayFair Ciphrature
		0x0x3 Hill Ciphrature
		0x0x4 Polialphabetic Ciphrature
	0x1 Transposition Techniques
	0x2 Rotation Machines 

-[0x0x1]----------------------------------------------------------------------- Cesare's Ciphrature

Cesare's  Ciphrature  is  based on alphabetical letters! This algorithms replace only single letter 
with a three letter after  considering  a  circula  alphabet !  so  the first letter after Z is A!! 

exemple: 
	text = meet me after the toga party
	ciph = PHHW PH DIWHU WKH WRJD SDUWB

To  implement  this ciphrature tecnique we cas assign a numeric value for every letter in this way: 

[ a ][ b ][ c ][ d ][ e ][ f ][ g ][ h ][ i ][ j ][ k ][ l ][ m ]
[ 0 ][ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ][ 8 ][ 9 ][ 0 ][11 ][12 ]

[ n ][ o ][ p ][ q ][ r ][ s ][ t ][ u ][ v ][ w ][ x ][ y ][ z ]
[13 ][14 ][15 ][16 ][17 ][18 ][19 ][20 ][21 ][22 ][23 ][24 ][25 ]

Now we can apply this mathematics implementation of circular cesare's ciphrature : 
Ciphred = Encript(word) = (char value + k) mod (26)
C = E(w) = (cv+3)mod(26)
C = E(m) = (12+3)mod(26) = 15 mod 26 = 15 = P 

If we want decipher we can use the opposite operation 
word = Decript(Ciphred) = (Ciphred char - k) mod 26 
w = D(C) = (C-3) mod (26) 
w = D(P) = (15-3) mod (26) = 12 mod 26 = 12 = m 

The problem of this alghoritm is that if I don't know the k value i can resolve this with 25
different k value :

		PHHW PH DIWHU WKH WRJD SDUWB
Key = 01	oggv og chvgt vjg vqic rctva
Key = 02	nffu nf bgufs uif uphb qbsuz
Key = 03	meet me after the toga party	<= I have found my key!! 
Key = 04	ldds ld zesdq sgd snfz ozqsx
Key = 05	kccr kc ydrcp rfc rmey nyprw
...
Key = 25	qiix qi ejxiv xli xske tevxc

-[0x0x2]----------------------------------------------------------------------- PlayFair Ciphrature

This ciphrature algorithm  is  based on 5x5 matrix made on a single keyword! Image that our keyword
is "monarchy"! The  matrix is made excluding the repetition letter and considering i and j char the 
same char! The firsts cells are the char of keyword, the others are the remaning alphabetic letters

	[ \ ] |	[ 0 ][ 1 ][ 2 ][ 3 ][ 4 ]
	------|--------------------------
	[ 0 ] |	[ m ][ o ][ n ][ a ][ r ]
	[ 1 ] |	[ c ][ h ][ y ][ b ][ d ]
	[ 2 ] |	[ e ][ f ][ g ][i/j][ k ]
	[ 3 ] |	[ l ][ p ][ q ][ s ][ t ]
	[ 4 ] |	[ u ][ v ][ w ][ x ][ z ]

After  that  we have create the matrix  we must encript the text 2 letters by 2 letters follow this 
rule: 

	[1] If  in  my  text  d uring the division for 2 letters, two same letter are behind I must 
	    insert a new letter!  for  exemple i divide the word "balloon" in this way : ba ll oo n
	    since ll are the same letter  in  the same block I must insert a new letter and balloon 
	    became : ba lx lo on now I have 4 block of 2 letters and I can continue! 

	[2] The letter of my text that are in the same matrix  row are sostituited with the  letter 
	    that is on the right it... for exemple in my matrix the string "ar" became "rm" 

	[3] The letter of my text that are in the same matrix colum are sostutited with  the letter
	    that is bottom it... for exemple in my matrix the string "mu" became "cm"

	[4] In  the others cases the letter two letter changes row and column with the opposite of 
	    the  other letter of block!... for exemple  the  string  "ev" of coordinate (2,0)(4,1) 
	    became "fu" of coordinate (2,1)(4,0) becouse :
			row  col     row  col  
			[2]  [0]     [4]  [1] 
	                 |    |       |    |      row-col
			 2____|_______|____1____  (2,1)
                              |       | 	  row-col 
			      0_______4_________  (4,0)

exemple: 
	text = hello world 
	
	[1] Division = he ll ow or ld 
		the second  block  ll  is  not correct so I insert x to divide the same letters and 
		insert y to recreate a 2 letters block : he lx lo wo rl dy
	[2] Control if I have letters of the same row :	
		he -> no
		lx -> no
		lo -> no
		wo -> no
		rl -> no
		dy -> yes -> dy became cb -> my string now is: he lx lo wo rl "cb"
	[3] Control if I have letters of the same column:
		he -> no
		lx -> no
		lo -> no
		wo -> no
		rl -> no
	[4] Change row and column with the opposite of the other letter of block!
		he -> (1,1)(2,0) -> (1,0)(2,1) -> cf -> my string now is : CF lx lo wo rl CB 
		lx -> (3,0)(4,3) -> (3,3)(4,0) -> su -> my string now is : CF SU lo wo rl CB
		lo -> (3,0)(0,1) -> (3,1)(0,0) -> pm -> my string now is : CF SU PM wo rl CB
		wo -> (4,2)(0,1) -> (4,1)(0,2) -> vn -> my string now is : CF SU PM VN rl CB
		rl -> (0,4)(3,0) -> (0,0)(3,4) -> mt -> my string now is : CF SU PM VN MT CB

	Ciphred text = cfsupmvnmtcb 

To decript  this text is  necessary  that  you  know  the keyword so you can recreat the matrix and
repeat the same operation used  to  encrypt  the  text!!  But  if  you  don't know the key you must
try  26x26 = 676 different combinations so  this  is  more  secure  respect the Cesare's ciphrature

-[0x0x3]--------------------------------------------------------------------------- Hill Ciphrature

The therd ciphrature that I want show to you born in the 1929 by Lester Hill! This  algorithm  take 
"num" letters from the text and replace this with "num" ciphred letters! To do it we resolve  "num"
linear equations! In  the  first  time  we  assign  a numerical  value to a signle letter as in the 
Cesare's ciphrature 

[ a ][ b ][ c ][ d ][ e ][ f ][ g ][ h ][ i ][ j ][ k ][ l ][ m ]
[ 0 ][ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ][ 8 ][ 9 ][ 0 ][11 ][12 ]

[ n ][ o ][ p ][ q ][ r ][ s ][ t ][ u ][ v ][ w ][ x ][ y ][ z ]
[13 ][14 ][15 ][16 ][17 ][18 ][19 ][20 ][21 ][22 ][23 ][24 ][25 ]

After that we decide a value to assign tu "num" I use 3 so... I have three linear equations: 

	ciphred = [ key(x,y) word(1) + key(x,y) word(2) + key(x,y) word(3) ]

	[1] C1 = [k(1,1)w(1)+k(1,2)w(2)+k(1,3)w(3)]
	[2] C2 = [k(2,1)w(1)+k(2,2)w(2)+k(2,3)w(3)]
	[3] C3 = [k(3,1)w(1)+k(3,2)w(2)+k(3,3)w(3)]

I can rapresents this equations as a vector and matrix form :

	cyphred		   key matrix 		     word 
	column	  	     			     column
	[ c1 ]	 [	k11	k12	k13	]   [ w1 ]
	[ c2 ] = [ 	k21	k22	k33	] = [ w2 ] = mod 26
	[ c3 ] 	 [	k31	k32	k33	]   [ w3 ]

I invent my key matrix with arbitrary value
		
		    [   17	17	05   ]
		k = [	21	18	21   ]
		    [	02	02	19   ]

If  I  want  encript  t he text "paymoremoney" I must several block of 3 letters becouse I have set 
"num" = 3 ... so I divide the text in this way: 

	block 1 = pay
	block 2 = mor
	block 3 = emo	
	block 4 = ney 

Now I can replace the single letter with numerical value assigned it
	
	block 1 = pay = (15,0,24)
	block 2 = mor = (12,14,17)
	block 3 = emo = (4,12,14)
	block 4 = ney = (13,4,24)

Now that I have "trasformed" all information in number I can apply the algorith

	[?01]   [	17	17	05 	]    [P][15]
	[?02] = [	21	18	21 	] =  [A][0]  mod 26
	[?03]   [	02	02	19 	]    [Y][24] 

	[?04]   [	17	17	05 	]    [M][12]
	[?05] = [	21	18	21 	] =  [O][14] mod 26
	[?06]   [	02	02	19 	]    [R][17]

	[?07]   [	17	17	05 	]    [E][4]
	[?08] = [	21	18	21 	] =  [M][12] mod 26
	[?09]   [	02	02	19 	]    [O][14] 

	[?10]   [	17	17	05 	]    [N][13]
	[?11] = [	21	18	21 	] =  [E][4]  mod 26
	[?12]   [	02	02	19 	]    [Y][24] 
	
And resolve using this equation: 
	[1] C1 = [k(1,1)w(1)+k(1,2)w(2)+k(1,3)w(3)]
	[2] C2 = [k(2,1)w(1)+k(2,2)w(2)+k(2,3)w(3)]
	[3] C3 = [k(3,1)w(1)+k(3,2)w(2)+k(3,3)w(3)]

	[?01] = 17*15 + 17*0 + 5*24   = 255 + 0   + 120 = 375 mod 26 = 11 = L 
	[?02] = 21*15 + 18*0 + 21*24  = 315 + 0   + 504 = 819 mod 26 = 13 = N 
	[?03] = 02*15 + 02*0 + 19*24  = 30  + 0   + 456 = 486 mod 26 = 18 = S 

	[?04] = 17*12 + 17*14 + 5*17  = 204 + 238 + 85  = 527 mod 26 = 7  = H 
	[?05] = 21*12 + 18*14 + 21*17 = 252 + 252 + 357 = 861 mod 26 = 3  = D 
	[?06] = 02*12 + 02*14 + 19*17 = 24  + 28  + 323 = 375 mod 26 = 11 = L

If you continue using this tecnique you obtain this ciphred string : LNSHDLEWMTRW 

To decrypt this ciphrate text are necessary that you know the keymatrix becouse you must  calculate
the inverse matrix of it and apply the inverse matrix to the ciphred text to obtain a original text

To obtain  the  inverse  matrix you must calculate the determinant of matrix first!To calcolate the 
determinant I can rapresent my matrix in this way

	 -------------- ---------
	| 17 | 17 | 05 | 17 | 17 |  ||
	|   \    \    \|         |  ||
	|    \    \    |         |  ||
	|     \    \   |\        |  || 
        | 21 | 18 | 21 | 21 | 18 |  ||   17*18*19 + 17*21*2 + 5*21*2 = 5814 + 714 + 210 = 6738
	|        \    \|   \     |  ||
	|         \    |    \    |  ||
	|          \   |\    \   |  || 
	| 02 | 02 | 19 | 02 | 02 |  \/
	 -------------- ---------

	 -------------- ---------
	| 17 | 17 | 05 | 17 | 17 |  /\
	|          /   |/    /   |  ||
	|         /    |    /    |  ||
	|        /    /|   /     |  ||
        | 21 | 18 | 21 | 21 | 18 |  ||   2*18*5 + 2*21*17 + 19*21*17 = 180 + 714 + 6783 = 7677 
	|     /    /   |/        |  ||
	|    /    /    |         |  ||
	|   /    /    /|         |  ||  
	| 02 | 02 | 19 | 02 | 02 |  ||
	 -------------- ---------

	DetK = 6738 - 7677 = -939 mod 26 = -3 
	
After that I have found the det of the 3x3 matrix I can calculate the inverse matrix in this way: 

	 -----------------
	| k11 | k12 | k13 |
	|    \|     |     |
	|----[=]----|-----|
	|     |\    |     |
	| k21 | k22 | k23 |
	|     |    \|/    |
	|-----|----[x]----|
	|     |    /|\    | 
	| k31 | k32 | k33 |
	 -----------------

	k11 = k22*k33 - k32*k23 => (18*19)-(2*21) = 4 -  16 = -12/DetK = 4 
	...

To the and we obtain this inverse matrix
	 --------------
	| 04 | 09 | 15 |
	| 15 | 17 | 06 |
	| 24 | 00 | 17 |
	 --------------	

If we  want  control  that  this  matrix it the inverse of our original matrix we must multiple the
original matrix with the inverse matrix and we must obtain a new matrix that is the identity matrix
The identify matrix is a matrix in witch all values are 0 and only the value in a diagonal are one!

	 --------------		-------------- 
	| 17 | 17 | 05 |       | 04 | 09 | 15 |
	| 21 | 18 | 21 |   *   | 15 | 17 | 06 |
	| 02 | 02 | 19 |       | 24 | 00 | 17 | 
	 --------------		-------------- 

	To obtain the new matrix we must multiply the row vector to column vector! for  exemple  to
	obtain  the  value  of  k11  we must multiply the row vector of index 1 to column vector of 
	index 1  

               -------------- 	  ----
	k11 = | 17 | 17 | 05 | * | 04 |
               --------------	 | 15 |
				 | 24 |
				  ----

	k11 = (17*04) + (17*15) + (05*24) = 443
	k12 = (17*09) + (17*17) + (05*00) = 442 
	...
	k33 = (02*15) + (02*06) + (19*17) = 365

         -----------------            -----------
       	| 443 | 442 | 442 |          | 1 | 0 | 0 |
	| 858 | 495 | 780 |mod26 =   | 0 | 1 | 0 | 
	| 494 | 052 | 365 |          | 0 | 0 | 1 |
	 -----------------	      -----------

When we have obtenuted the inverse matrix we can decipher the ciphred message : LNSHDLEWMTRW

[ a ][ b ][ c ][ d ][ e ][ f ][ g ][ h ][ i ][ j ][ k ][ l ][ m ]
[ 0 ][ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ][ 8 ][ 9 ][ 0 ][11 ][12 ]

[ n ][ o ][ p ][ q ][ r ][ s ][ t ][ u ][ v ][ w ][ x ][ y ][ z ]
[13 ][14 ][15 ][16 ][17 ][18 ][19 ][20 ][21 ][22 ][23 ][24 ][25 ]

	LNS = (11,13,18) 

	[11]   [ 04 | 09 | 15 ]    (11*04)+(13*09)+(18*15) = 431 mod26 = 15 = [p]
	[13] * [ 15 | 17 | 06 ] =  (11*15)+(13*17)+(18*06) = 494 mod26 = 00 = [a]
	[18]   [ 24 | 00 | 17 ]    (11*24)+(13*00)+(18*17) = 570 mod26 = 24 = [y] 

If we repeat the same operation for all ciphred string we obtain the original string 

-[0x0x4]----------------------------------------------------------------- Polialphabetic Ciphrature
This ciphrature tecnique is another monoalphabetic tecnique. The polialphabetic ciphrature is known
as Vigenere ciphrature becouse is based on a Vigenere table! The table is  the  combination  of  26
Cesare's ciphrature with scrolling from 0 to 25! the table is this: 

[a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z]
[b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a]
[c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b] 
[d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c]
[e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][d]
[f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][d][e] 
[g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][d][e][f]
[h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][d][e][f][g]
[i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][d][e][f][g][h]
[j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][d][e][f][g][h][i]
[k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][d][e][f][g][h][i][j]
[l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][d][e][f][g][h][i][j][k]
[m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][d][e][f][g][h][i][j][k][l]
[n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][d][e][f][g][h][i][j][k][l][m]
[o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][d][e][f][g][h][i][j][k][l][m][n]
[p][q][r][s][t][u][v][w][x][y][z][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o]
[q][r][s][t][u][v][w][x][y][z][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p]
[r][s][t][u][v][w][x][y][z][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q]
[s][t][u][v][w][x][y][z][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r]
[t][u][v][w][x][y][z][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s]
[u][v][w][x][y][z][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t]
[v][w][x][y][z][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u]
[w][x][y][z][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v]
[x][y][z][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w]
[y][z][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x]
[z][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y]

Now  imagine  that  we  want  encript  a  message  : " we are discovered save yourself"  using  the
key: "hello"! To apply this ciphrature the kay must be lenght as the text that we  want encript! So
we must repeat the key in this way :

	message : WeAreDiscoveredSaveYourself
	key	: hellohellohellohellohellohe

The message is readed in orizontal way, the key in vertical... so the first char of  message is "W" 
and the key assigned it is "h". To encript we must go in table and find W in orizontal line  and  h
in verthical line...

[a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][W][x][y][z]
[b][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[c][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[d][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[e][#][#][#]|I|[J][#][#][M][#][#][#][#][#][#][#][#][#][#][#][Y][#][#][#][#][#]
[f][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[g][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[H][#][#][K][#][#][#][#][#][#][#][#][#][#][V][#][#][#][Z][#][#][C][D][#][#][#]
[i][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[j][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[k][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[L][#][N][#][P][#][#][S][#][#][#][#][#][#][#][#][#][C][D][#][#][G][#][#][#][#]
[m][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[n][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[o][#][#][R][S][#][#][#][#][#][#][#][#][#][C][#][#][#][#][#][#][#][#][#][M][#]
[p][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[q][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[r][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[s][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[t][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[u][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[v][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[w][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[x][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[y][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]
[z][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#][#]


	=> wh = D	=> ee = I	=> al = L	=> rl = C
	=> eo = S	=> dh = K	=> ie = M	=> sl = D
	=> cl = N	=> oo = C	=> vh = C	=> ee = I
	=> rl = C	=> el = P	=> do = R	=> sh = Z
	=> ae =	E	=> vl = G	=> el = P	=> yo = M
	=> oh = V	=> ue =	Y	=> rl = C	=> sl = D
	=> eo = S	=> lh = S	=> fe = J

	Encripted Text = DILCSKMDNCCICPRZEGPMVYCDSSJ 

Since the key is a little word (hello) we have found  several  repetute  associations   during  the
encoding process : ee,rl,eo,sl,etc... if we use a big  key  we don't found   so  much  repetitions!
To decrypt this message we must know the key, if we have the key we can do in this way:

	Encripted Text	= DILCSKMDNCCICPRZEGPMVYCDSSJ 
	key		= hellohellohellohellohellohe

To decrypt  the  char  "D" with the keychar associated "h" I search in the table the row "h" and in 
this row I search the char D after I see the first element in the column of D!
 
[ a ][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][ W ][x][y][z]
...								     /\
...								     ||
[ H ][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][a][b][c][ D ][e][f][g]
...
[ z ][a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][ v ][w][x][y]

	=> Dh = w	=> Ie = e	=> Ll = a ... etc 

This is  mine C + GTK implementation of the alghoritm of Polialphabetic Ciphrature! compile and use 
it to  create ciphred text to send what you want without any problem that everyone can decripted it 
without the key  that  you  have inseret to entrypt the text. Since the alghoritm is based on 26x26 
matrix the original text that  you  want encrypt must be with nothing space and point signature but 
only the 26 alphabetic letters! For exemple if you want send the text:
 
	=> hello world this is me life shoul be fun for every one 

you must open a new file with 0777 permission and write in it 

	=> helloworldthisismelifeshoulbefunforeveryone 

after  that  you  open  the  software  insert the key that you want select the encrypt radio button 
insert the path of the file that contain the text and click the GO button! in this way the software
make a file named encrypt that you can  rename as you want this file contain the crypted version of 
your message! You can send this file to  you  want,  you  do  your  password  to  it and hi use the 
the software in the same way. Insert the key the path of file to decrypt  select  the decrypt radio 
button and click ok button! The result of it is a  file  named  decrypt  that  contain the original 
message! Heppy cyprature to all 
--[ C U T  H E R E ]-------------------------------------------------------------------------------
/*
       Compile it using gcc cipher.c `pkg-config --cflags --libs gtk+-2.0`  
*/

#include <gtk/gtk.h>
#include <glib.h>
#include <gdk/gdkkeysyms.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

GtkWidget *win;
GtkWidget *keyL;
GtkWidget *pathL;
GtkWidget *entryK;
GtkWidget *entryP;
GtkWidget *table;
GtkWidget *button;
GtkWidget *radio1;
GtkWidget *radio2;
GtkWidget *hbox;

void start()
{

       char matrix[26][26];
       char *alphabet = "abcdefghijklmnopqrstuvwxyz";
       int row,column,count;
       for(row = 0; row!=26; row++)
       {
              count = row;
              for(column = 0; column!=26; column++)
	      {
	             if(count==26) count = 0;
		     matrix[row][column] = alphabet[count++];
	      }
       }

       int exist,fd,fd2,fd3;
       char *c;
       int keycount = 0;
       const gchar *k,*p;
       k = gtk_entry_get_text(GTK_ENTRY(entryK));
       p = gtk_entry_get_text(GTK_ENTRY(entryP));

       int keylen = strlen(k);

       exist = access(p,X_OK);
       if(exist==-1) g_print("Error: %s File not found!!\n",p);
       else 
       {
              if((fd = open(p,O_RDWR))==-1) 
                     g_print("Error: %s Open in RDWR not permitted!!\n",p);
              else
              {
                     if (GTK_TOGGLE_BUTTON (radio1)->active)
		     {	
                            if((fd2 = open("encrypted",O_RDWR|O_CREAT|O_TRUNC,0777))==-1) 
                                   g_print("Error: 'encrypted' File not created!!\n");
                            else
                            {
                                   while(read(fd,&c,1))
                                   {
                                          if(isupper((unsigned char)c))
                                                 c = tolower((unsigned char)c);
                                          int col = 0;
                                          int ro = 0;

                                          while(matrix[0][col++]!= (char)c && col!=26);
                                          while(matrix[ro++][0]!= k[keycount]);
                                          char *toInsert = matrix[ro-1][col-1];
                                          write(fd2,&toInsert,1);
                                          if((keycount)==keylen-1)keycount=0;
                                          else keycount++;
                                   }
                            }
                     }
                     else if (GTK_TOGGLE_BUTTON (radio2)->active)
                     {
                            if((fd3 = open("decrypted",O_RDWR|O_CREAT|O_TRUNC,0777)) == -1)
                                   g_print("Error: 'decrypted' File not created!!\n");
                            else
                            {
                                   while(read(fd,&c,1))
                                   {
                                          int Col = 0;
                                          int Ro = 0;

                                          while(matrix[Ro++][0]!=k[keycount]);
                                          while(matrix[Ro][Col++]!=(char)c && Col!=26);
                                          char *Toinsert = matrix[0][Col];
                                          write(fd3,&Toinsert,1);
                                          if((keycount)==keylen-1)keycount=0;
                                          else keycount++;
                                   }
                            }
                     }
              }
       }
}

gint quit(GtkWidget *widget, gpointer gdata)
{
       g_print("Thank you for use CPCGI! Bye Bye...\n");
       gtk_main_quit();
       return(FALSE);
}

int main(int argc, char *argv[])
{
	gtk_init(&argc,&argv);

       button = gtk_button_new_with_label("Go!!");
       table = gtk_table_new(3,3,FALSE);
       entryK = gtk_entry_new();
       entryP = gtk_entry_new();
       win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
       keyL = gtk_label_new("Entry the Key");
       pathL = gtk_label_new("Entry the path of file");
       radio1 = gtk_radio_button_new_with_label(NULL,"Encrypt");
       radio2 = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(radio1)),"Decrypt");
       hbox = gtk_hbox_new(FALSE,0);

       gtk_entry_set_editable(GTK_ENTRY(entryK),TRUE);
       gtk_entry_set_editable(GTK_ENTRY(entryP),TRUE);
       gtk_entry_set_max_length(GTK_ENTRY(entryP), 200);
       gtk_entry_set_max_length(GTK_ENTRY(entryK), 50);

       gtk_box_pack_start(GTK_BOX(hbox),radio1,TRUE,TRUE,2);
       gtk_box_pack_start(GTK_BOX(hbox),radio2,TRUE,TRUE,2);

       g_signal_connect(G_OBJECT (button), "clicked", G_CALLBACK (start), NULL);
       gtk_signal_connect(GTK_OBJECT(win),"delete_event",GTK_SIGNAL_FUNC(quit),NULL);

       gtk_window_set_title(GTK_WINDOW(win),"[C]yberdude [P]olialphabetic [C]iphrature [G]tk [I]mplementation");
       gtk_window_set_default_size(GTK_WINDOW(win),600,100);

       gtk_table_attach(GTK_TABLE(table), keyL, 0, 1, 0, 1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
       gtk_table_attach(GTK_TABLE(table), pathL, 0, 1, 1, 2, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
       gtk_table_attach(GTK_TABLE(table), entryK, 1, 2, 0, 1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
       gtk_table_attach(GTK_TABLE(table), entryP, 1, 2, 1, 2, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
       gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 2, 3, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
       gtk_table_attach(GTK_TABLE(table), button, 1, 2, 2, 3, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);

       gtk_container_add(GTK_CONTAINER(win),table);

       gtk_widget_show(radio1);
       gtk_widget_show(radio2);
       gtk_widget_show(hbox);
       gtk_widget_show(table);
       gtk_widget_show(button);
       gtk_widget_show(pathL);
       gtk_widget_show(keyL);
       gtk_widget_show(entryP);
       gtk_widget_show(entryK);
       gtk_widget_show(win);
       gtk_main();
       return 0;
}
--[ C U T  H E R E ]-------------------------------------------------------------------------------

-[0x1]---------------------------------------------------------------------- Transposition tecnique
This tecnique is different from the sobstitution tecnique becouse there isn't only the sobstitution
of a letter with another but change the position of only letter too... 

Imagine that we want cipher the message : hello world this is cyberdude 
since my message is composit of 25 letters i can divide in a 5x5 matrix in this way:

	[h][e][l][l][o]
	[w][o][r][l][d]
	[t][h][i][s][i]
	[s][c][y][b][e]
	[r][d][u][d][e]

After that I have create my matrix I must creat a key to change the column order! Since  the matrix
have 5 columns, my key have 5 element too! the element of key are the index from 1 to 5  in  casual
way, for exemple : 41253 if I use this key to transposite my matrix I obtain this result

	key = 	[4][1][2][5][3]

		[h][e][l][l][o]
		[w][o][r][l][d]
	text =	[t][h][i][s][i]
		[s][c][y][b][e]
		[r][d][u][d][e]
 
Now using the index of key I can read the column to cipher my message so I  read  the  column  with
index 1 in this way : eohcd 

	col[1] = eohcd
	col[2] = lriyu 
	col[3] = odiee
	col[4] = hwtsr
	col[5] = llsbd

In this way I have obtenuted this text : eohcdlriyuodieehwtsrllsbd 
But this type of cipher is deciphrable by an attacher using the bruteforce, in  particoular  if  he 
know that my key is of 5 value he obtain 25 possible key to depcipher the message and  it  is  very 
simple to do! To resolve this little problem we can retranspose the ciphred text in  the  same  way
and using the same key used for the first transposition:

	key = 	[4][1][2][5][3]

		[e][o][h][c][d]
		[l][r][i][y][u]
	text =	[o][d][i][e][e]
		[h][w][t][s][r]
		[l][l][s][b][d]

	col[1] = ordwl
	col[2] = hiits
	col[3] = duerd
	col[4] = elohl
	col[5] = cyesb

The result of the ciprature of the ciphred text is this : ordwlhiitsduerdelohlcyesb 

If we cosider the initial text : hello world this is cyberdude 
and assign an index for only char : 

		h=00	w=05	t=10	s=15	r=20
		e=01	o=06	h=11	c=16	d=21
		l=02	r=07	i=12	y=17	u=22
		l=03	l=08	s=13	b=18	d=23	
		o=04	d=09	i=14	e=19	e=24

the initial matrix is 

	[00][01][02][03][04]
	[05][06][07][08][09]
	[10][11][12][13][14]
	[15][16][17][18][19]
	[20][21][22][23][24]

after the first ciphrature became this:

	[01][06][11][16][21]
	[02][07][12][17][22]
	[04][09][14][19][24]
	[00][05][10][15][20]
	[03][08][13][18][23]

after the second ciphrature became this:

	[06][07][09][05][08]
	[11][12][14][10][13]
	[21][22][24][20][23]
	[01][02][04][00][03]
	[16][17][19][15][18]

so the result of ciphrature is this :

==> 06 07 09 05 08 11 12 14 10 13 21 22 24 20 23 01 02 04 00 03 16 17 19 15 18 

This type of permutation is more difficult to decipher if you haven't a key! If you have a key 	and
want obtain the original message you must be the same operation in inverted way using the  rows  as
we have used the column to cipher the message: 
		
key = 41253
	row |	message
	----|------------------------
	[1] |	[06][07][09][05][08]
	[2] |	[11][12][14][10][13]
	[3] |	[21][22][24][20][23]
	[4] |	[01][02][04][00][03]
	[5] |	[16][17][19][15][18]

ciphred text: ordwl hiits duerd elohl cyesb 

	row| text matrix 	row| number matrix
	---|---------------	---|----------------------
	[1]|[o][r][d][w][l]	[1]| [06][07][09][05][08]
	[2]|[h][i][i][t][s]	[2]| [11][12][14][10][13]
	[3]|[d][u][e][r][d]	[3]| [21][22][24][20][23]
	[4]|[e][l][o][h][l]	[4]| [01][02][04][00][03]
	[5]|[c][y][e][s][b]	[5]| [16][17][19][15][18]

	CONVERSION TABLE
	------------------
	   | key | became 
	---|-----|-------- 
	row| [4] | col1
	row| [1] | col2 
	row| [2] | col3
	row| [5] | col4
	row| [3] | col5

We can reobtain the first ciphred matrix transposing the row with che column  as  indicate  in  the 
prev conversion talbe

	 [e][o][h][c][d]	[01][06][11][16][21]
	 [l][r][i][y][u]	[02][07][12][17][22]
	 [o][d][i][e][e]	[04][09][14][19][24]
	 [h][w][t][s][r]	[00][05][10][15][20]
	 [l][l][s][b][d]	[03][08][13][18][23]

If we reapply the conversion table we reobtain the original text 
		  
	row [4] =| h | e | l | l | o |		| 00 | 01 | 02 | 03 | 04 |
	row [1] =| w | o | r | l | d |		| 05 | 06 | 07 | 08 | 09 |
	row [2] =| t | h | i | s | i |		| 10 | 11 | 12 | 13 | 14 |
	row [5] =| s | c | y | b | e |		| 15 | 16 | 17 | 18 | 19 |
	row [3] =| r | d | u | d | e |		| 20 | 21 | 22 | 23 | 24 |

The correct implementation of this alghoritm is that in the first time assign an index in order  to 
all char of the text and after work only with this index to return only index in the ciphred  text! 
The algorithm must be remeber the char that corrispond to  all  values  to  reobtain  the  original 
message. 

-[0x2]--------------------------------------------------------------------------- Rotation Machines
To understand the way to work of a rotation machine we must imagine a cilinder with  26  input  and
26 ouptut! everyone input point is connected with a single output point. We can associate  a single 
alphabet letter to the position. In the next exsemple we don't rapresesnts all link  between  input 
and output point becouse is difficult to see the structure byt only for three links : 24,06,07! The
situation of the cilinder change every time we use it, in this moment for exemple at the  letter  A 
is associate the input point 24 but after that we use it the cilinder ruote in bottom direction and
A  link  to  the  23  input  point!  But  we don't want consider the case in witch we have only one 
cilinder becouse it is very simple to decipher since we must try only 25 different combinations! If
we use three cilinder where in the first cilinder we write the originale message and  the  cilinder 
number three return the ciphred text we have this type of ciphrature: When we insert a single input
(for exemple we click the a button that in this moment is linked with  24  input  point) the  first 
return in output the value of current input/output point linked with A that is  24 (in this moment)
Note that the input point are ordinated,the output point are stored in  unordered  way  to  do  the 
ciphrature! This is an exemple of a single cilinder but we want use three cilinder not only one! 

	     input  output
	     point  point
	      -----------
	=> A | 24--   10 | ==> A
	=> B | 25  |  18 | ==> B
	=> C | 26  |  13 | ==> C
	=> D | 01  |  16 | ==> D
	=> E | 02   --24 | ==> E
	=> F | 03     17 | ==> F
	=> G | 04   --06 | ==> G
	=> H | 05  |  25 | ==> H
	=> I | 06--   22 | ==> I
	=> J | 07--   11 | ==> J
	=> K | 08  |  15 | ==> K
	=> L | 09  |  01 | ==> L
	=> M | 10  |  08 | ==> M
	=> N | 11  |  12 | ==> N
	=> O | 12  |  02 | ==> O
	=> P | 13  |  14 | ==> P
	=> Q | 14   --07 | ==> Q
	=> R | 16     09 | ==> R
	=> S | 15     26 | ==> S
	=> T | 17     23 | ==> T
	=> U | 18     04 | ==> U
	=> V | 19     19 | ==> V 
	=> W | 20     21 | ==> W
	=> X | 21     03 | ==> X
	=> Y | 22     20 | ==> Y
	=> Z | 23     05 | ==> Z
	      -----------

Only one cilinder work in this way: I click A, A in this moment is linked to 24 that in this moment 
rapresent the output value E but when i have clicked A the cilinder is ruoted in  bottom  direction
so if I click A another time now A is linked to 23 and 23 returne U as output!!  But in  the  first
we seid that only one cilinder is simple to decipher for an attacher so we ca use three cilinder to 
force it to try 25x25x25 different combinations to obtain the correct result. If we work with three
cilinder they are sets in this way : when I click A in input cilinder it control the point that  in 
this moment is linked with A and return in output the value linked, this value is linked  with  the 
input of the second cilinder that do the same of the first and return the result in  input  to  the 
therd register that return in output linked output point that in this time corrisponds ad a letter!
Another ineresting characteristic is the way inwitch the cilinder rote. The first cilinder route of 
one position when the second have finished a full rotation and returns in the initial position. But 
the second cilinder roteate of a one position only when the therd cilinder  have  finished  a  full
rotation and returns in the initial position so we can said that the  therd  cilinder  cicle  every
click, the second change position every 26 click and the first every 26x26click. This is an exemple
that rapresent the rotation of the three cilinder: 

		cylinder       cylinder       cylinder
		  one           two            three
	      -----------    -----------    ----------- 
	=> A | 24--   10 |  | 26   ->04 |->| 22--   01 | A
	=> B | 25  |  18 |  | 01  |  11 |  | 23  |  11 | B
	=> C | 26  |  13 |  | 02  |  14 |  | 24  |  16 | C
	=> D | 01  |  16 |  | 03  |  26 |  | 25   ->22 | D
	=> E | 02   ->24 |->| 04--   07 |  | 26     07 | E
	=> F | 03     17 |  | 05     25 |  | 01     23 | F
	=> G | 04   ->06 |->| 06--   12 |  | 02     08 | G 
	=> H | 05  |  25 |  | 07  |  10 |  | 03     15 | H
	=> I | 06--   22 |  | 08  |  23 |  | 04     26 | I
	=> J | 07--   11 |  | 09  |  03 |  | 05   ->09 | J 
	=> K | 08  |  15 |  | 10  |  09 |  | 06  |  25 | K
	=> L | 09  |  01 |  | 11  |  21 |  | 07  |  18 | L
	=> M | 10  |  08 |  | 12  |  08 |  | 08  |  14 | M
	=> N | 11  |  12 |  | 13   ->06 |->| 09--   20 | N
	=> O | 12  |  02 |  | 14   ->16 |->| 10--   02 | O
	=> P | 13  |  14 |  | 15  |  02 |  | 11  |  19 | P
	=> Q | 14   ->07 |->| 16--   19 |  | 12  |  21 | Q
	=> R | 16     09 |  | 17     22 |  | 13  |  06 | R
	=> S | 15     26 |  | 18     20 |  | 14  |  24 | S
	=> T | 17     23 |  | 19     13 |  | 15  |  03 | T
	=> U | 18     04 |  | 20     01 |  | 16  |  17 | U
	=> V | 19     19 |  | 21     24 |  | 17  |  04 | V
	=> W | 20     21 |  | 22     18 |  | 18  |  13 | W
	=> X | 21     03 |  | 23     05 |  | 19   ->10 | X 
	=> Y | 22     20 |  | 24     17 |  | 20     12 | Y 
	=> Z | 23     05 |  | 25     15 |  | 21     05 | Z 
	      -----------    -----------    -----------

If in this moment I click A the cilinder n.1 return 24 as  output  that  in  input  to  the  second
equals to the input point 04 (in this moment) and the second cylinder return his output and take it 
in input to the therd cilinder, in this time the input point of the third cilinder  that  return in
output the current point linked : 22 that is in "position" D and we can interprete cyphred(A) = D!!
After that the therd cilinder ruote of a one position and the first and  second  don't  move.