Playfair cipher: Difference between revisions

Content added Content deleted
No edit summary
Line 8: Line 8:


=={{header|C++}}==
=={{header|C++}}==
<lang cpp>
<lang cpp>#include <iostream>
#include <iostream>
#include <string>
#include <string>


//--------------------------------------------------------------------------------------------------
using namespace std;
using namespace std;


//--------------------------------------------------------------------------------------------------
class playfair
class playfair
{
{
Line 30: Line 27:
{
{
int a, b, c, d; string ntxt;
int a, b, c, d; string ntxt;
for( string::iterator ti = _txt.begin(); ti != _txt.end(); ti++ )
for( string::const_iterator ti = _txt.begin(); ti != _txt.end(); ti++ )
{
{
if( getCharPos( ( *ti++ ), a, b ) )
if( getCharPos( *ti++, a, b ) )
if( getCharPos( ( *ti ), c, d ) )
if( getCharPos( *ti, c, d ) )
{
{
if( a == c ) { ntxt.append( getChar( a, b + dir ), 1 ); ntxt.append( getChar( c, d + dir ), 1 ); }
if( a == c ) { ntxt += getChar( a, b + dir ); ntxt += getChar( c, d + dir ); }
else if( b == d ){ ntxt.append( getChar( a + dir, b ), 1 ); ntxt.append( getChar( c + dir, d ), 1 ); }
else if( b == d ){ ntxt += getChar( a + dir, b ); ntxt += getChar( c + dir, d ); }
else { ntxt.append( getChar( c, b ), 1 ); ntxt.append( getChar( a, d ), 1 ); }
else { ntxt += getChar( c, b ); ntxt += getChar( a, d ); }
}
}
}
}
Line 49: Line 46:
while( si != _txt.end() )
while( si != _txt.end() )
{
{
cout << ( *si ); si++; cout << ( *si ) << " "; si++;
cout << *si; si++; cout << *si << " "; si++;
if( ++cnt >= 26 ) cout << endl, cnt = 0;
if( ++cnt >= 26 ) cout << endl, cnt = 0;
}
}
Line 55: Line 52:
}
}


char* getChar( int a, int b )
char getChar( int a, int b )
{
{
return _m[b % 5][a % 5];
if( a > 4 ) a = 0; if( b > 4 ) b = 0;
if( a < 0 ) a = 4; if( b < 0 ) b = 4;
return &_m[a + 5 * b];
}
}


Line 65: Line 60:
{
{
for( int y = 0; y < 5; y++ )
for( int y = 0; y < 5; y++ )
{
int yy = 5 * y;
for( int x = 0; x < 5; x++ )
for( int x = 0; x < 5; x++ )
if( _m[x + yy] == l )
if( _m[y][x] == l )
{ a = x; b = y; return true; }
{ a = x; b = y; return true; }


}
return false;
return false;
}
}
Line 79: Line 71:
for( string::iterator si = t.begin(); si != t.end(); si++ )
for( string::iterator si = t.begin(); si != t.end(); si++ )
{
{
( *si ) = toupper( ( *si ) ); if( ( *si ) < 65 || ( *si ) > 90 ) continue;
*si = toupper( *si ); if( *si < 65 || *si > 90 ) continue;
if( ( *si ) == 'J' && ij ) ( *si ) = 'I';
if( *si == 'J' && ij ) *si = 'I';
else if( ( *si ) == 'Q' && !ij ) continue;
else if( *si == 'Q' && !ij ) continue;
_txt.append( &( *si ), 1 );
_txt += *si;
}
}
if( e )
if( e )
Line 89: Line 81:
for( size_t x = 0; x < len; x += 2 )
for( size_t x = 0; x < len; x += 2 )
{
{
ntxt.append( &_txt[x], 1 );
ntxt += _txt[x];
if( x + 1 < len )
if( x + 1 < len )
{
{
if( _txt[x] == _txt[x + 1] ) ntxt.append( "X" );
if( _txt[x] == _txt[x + 1] ) ntxt += 'X';
ntxt.append( &_txt[x + 1], 1 );
ntxt += _txt[x + 1];
}
}
}
}
_txt = ntxt;
_txt = ntxt;
}
}
if( _txt.length() & 1 ) _txt.append( "X", 1 );
if( _txt.length() & 1 ) _txt += 'X';
}
}


Line 104: Line 96:
{
{
if( k.length() < 1 ) k = "KEYWORD";
if( k.length() < 1 ) k = "KEYWORD";
k.append( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ); string nk = "";
k += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; string nk = "";
for( string::iterator si = k.begin(); si != k.end(); si++ )
for( string::iterator si = k.begin(); si != k.end(); si++ )
{
{
( *si ) = toupper( ( *si ) ); if( ( *si ) < 65 || ( *si ) > 90 ) continue;
*si = toupper( *si ); if( *si < 65 || *si > 90 ) continue;
if( ( ( *si ) == 'J' && ij ) || ( ( *si ) == 'Q' && !ij ) )continue;
if( ( *si == 'J' && ij ) || ( *si == 'Q' && !ij ) )continue;
if( nk.find( ( *si ) ) == -1 ) nk.append( &( *si ), 1 );
if( nk.find( *si ) == -1 ) nk += *si;
}
}
copy( nk.begin(), nk.end(), _m );
copy( nk.begin(), nk.end(), &_m[0][0] );
}
}


string _txt; char _m[25];
string _txt; char _m[5][5];
};
};

//--------------------------------------------------------------------------------------------------
int main( int argc, char* argv[] )
int main( int argc, char* argv[] )
{
{
Line 125: Line 117:
cout << "Enter the text: "; getline( cin, txt );
cout << "Enter the text: "; getline( cin, txt );
playfair pf; pf.doIt( key, txt, ij, e ); return system( "pause" );
playfair pf; pf.doIt( key, txt, ij, e ); return system( "pause" );
}</lang>
}
//--------------------------------------------------------------------------------------------------
</lang>
{{out}}<pre>
{{out}}<pre>
(E)ncode or (D)ecode? e
(E)ncode or (D)ecode? e