/*
* Created by ahmedengu.
*/
while ( 0 != ( scala.
io .
StdIn .
readLine ( "Choose the ceaser cipher implemintion:\n " +
"1) With spicial characters \n " +
"2) With key sets\n " +
"3) Break 1\n " +
"4) Break 2\n " +
"5) Show the discussion answers\n " +
"0) To exit\n " ) toInt
match { withSpicialChars
1
}
withKeySets
2
}
breakWithSpecialChars
3
}
breakWithKeySets
4
}
discussionAnswers
5
}
0
}
} ) ) println( "\n ___________" )
def withSpicialChars
: Unit
= { val key
= scala.
io .
StdIn .
readLine ( "Enter the key\n " ) toInt
while ( 3 != ( scala.
io .
StdIn .
readLine ( "Choose operation:\n " +
"1) Encript\n " +
"2) Decript\n " +
"3) To return\n " ) toInt
match { encryptWthSpecial( key)
}
decryptWthSpecial( key)
}
3
}
} ) ) println( "\n ___________" )
}
def decryptWthSpecial
( key
: Int
) : Unit
= { val cipher
= scala.
io .
StdIn readLine
( "Enter cipher\n " ) print
( if ( c.
toInt >= 32 && c.
toInt <= 126 ) { val i1
: Int
= ( c.
toInt -
32 - key
) % 95 ( if ( i1
>= 0 ) 32 + i1
else 127 + i1
) toChar
}
}
def encryptWthSpecial
( key
: Int
) : Unit
= { val pt
= scala.
io .
StdIn readLine
( "Enter PT\n " ) print
( if ( c.
toInt >= 32 && c.
toInt <= 126 ) { ( 32 + ( c.toInt - 32 + key) % 95 ) toChar
}
}
def withKeySets
: Unit
= { val keyArr
: Array
[ String
] = scala.
io .
StdIn .
readLine ( "Enter Key sets: (ex: [(0,2), (5, 3)] )\n " ) .
replaceAll ( "\\ (|\\ )|\\ [|\\ ]|\\ s" ,
"" ) split
( "," ) var keySet
: Map
[ Int, Int
] = Map
( ) for ( i
< -
0 to keyArr.
length -
2 by
2 ) { keySet += ( keyArr( i) .toInt -> keyArr( i + 1 ) .toInt )
}
while ( 3 != ( scala.
io .
StdIn .
readLine ( "Choose operation:\n " +
"1) Encript\n " +
"2) Decript\n " +
"3) To return\n " ) toInt
match { encryptWthKeySets( keySet)
}
decryptWthKeySets( keySet)
}
3
}
} ) ) println( "\n ___________" )
}
def encryptWthKeySets
( keySet
: Map
[ Int, Int
] ) = { val pt
= scala.
io .
StdIn readLine
( "Enter PT\n " ) for ( i
< -
0 to pt.
length -
1 ) { print
( if ( c.
toInt >= 65 && c.
toInt <= 122 ) { ( 65 + ( c.toInt - 65 + key) % 58 ) toChar
if ( keySet contains
( i
) ) key
= keySet
( i
) }
}
def decryptWthKeySets
( keySet
: Map
[ Int, Int
] ) = { val cipher
= scala.
io .
StdIn readLine
( "Enter cipher\n " ) for ( i
< -
0 to cipher.
length -
1 ) { print
( if ( c.
toInt >= 65 && c.
toInt <= 122 ) { val i1
: Int
= ( c.
toInt -
65 - key
) % 58 ( if ( i1
>= 0 ) 65 + i1
else 123 + i1
) toChar
if ( keySet contains
( i
) ) key
= keySet
( i
)
}
}
def breakWithSpecialChars
= { val dictionary
= scala.
io .
StdIn .
readLine ( "Enter dictionary words:\n " ) split
( " " ) val cipher
= scala.
io .
StdIn readLine
( "Enter the cipher:\n " )
pt += {
val i1
: Int
= ( c.
toInt -
32 - key
) % 95 ( if ( i1
>= 0 ) 32 + i1
else 127 + i1
) toChar
}
}
dictionaryMatching( dictionary, pt, key)
}
}
val dictionary
= scala.
io .
StdIn .
readLine ( "Enter dictionary words:\n " ) split
( " " ) val ciphers
= scala.
io .
StdIn .
readLine ( "Enter the cipher (should contain spaces):\n " ) split
( " " )
for ( cipher
< - ciphers
) { pt += {
val i1
: Int
= ( c.
toInt -
65 - key
) % 58 ( if ( i1
>= 0 ) 65 + i1
else 123 + i1
) toChar
}
}
dictionaryMatching( dictionary, pt, key)
}
}
}
def dictionaryMatching
( dictionary
: Array
[ String
] , pt
: String, key
: Int
) = { if ( pt.
toLowerCase contains
( d toLowerCase
) ) { println( "match:\n key:" + key + "\n pt:" + pt)
}
}
}
def discussionAnswers
= {
println( "The one with the key set is more secure as it could be used to add multiple layers of encryption which gonna require more computing power to attack,\n " +
"(cipher length * 255*number of sets) instead of (cipher length * 255).\n " +
"However it could be improved by applying a transposition algorithm so it take away the characteristics of the English language " )
}
}
LyoKKiAgQ3JlYXRlZCBieSBhaG1lZGVuZ3UuCiovCgpvYmplY3QgTWFpbiBleHRlbmRzIEFwcCB7CgoKICAgIHdoaWxlICgwICE9IChzY2FsYS5pby5TdGRJbi5yZWFkTGluZSgKICAgICAgIkNob29zZSB0aGUgY2Vhc2VyIGNpcGhlciBpbXBsZW1pbnRpb246XG4iICsKICAgICAgICAiMSkgV2l0aCBzcGljaWFsIGNoYXJhY3RlcnMgXG4iICsKICAgICAgICAiMikgV2l0aCBrZXkgc2V0c1xuIiArCiAgICAgICAgIjMpIEJyZWFrIDFcbiIgKwogICAgICAgICI0KSBCcmVhayAyXG4iICsKICAgICAgICAiNSkgU2hvdyB0aGUgZGlzY3Vzc2lvbiBhbnN3ZXJzXG4iICsKICAgICAgICAiMCkgVG8gZXhpdFxuIikgdG9JbnQgbWF0Y2ggewogICAgICBjYXNlIDEgPT4gewogICAgICAgIHdpdGhTcGljaWFsQ2hhcnMKICAgICAgICAxCiAgICAgIH0KICAgICAgY2FzZSAyID0+IHsKICAgICAgICB3aXRoS2V5U2V0cwogICAgICAgIDIKICAgICAgfQogICAgICBjYXNlIDMgPT4gewogICAgICAgIGJyZWFrV2l0aFNwZWNpYWxDaGFycwogICAgICAgIDMKICAgICAgfQogICAgICBjYXNlIDQgPT4gewogICAgICAgIGJyZWFrV2l0aEtleVNldHMKICAgICAgICA0CiAgICAgIH0KICAgICAgY2FzZSA1ID0+IHsKICAgICAgICBkaXNjdXNzaW9uQW5zd2VycwogICAgICAgIDUKICAgICAgfQogICAgICBjYXNlIF8gPT4gewogICAgICAgIDAKICAgICAgfQogICAgfSkpIHByaW50bG4oIlxuX19fX19fX19fX18iKQogIAoKICBkZWYgd2l0aFNwaWNpYWxDaGFyczogVW5pdCA9IHsKICAgIHZhbCBrZXkgPSBzY2FsYS5pby5TdGRJbi5yZWFkTGluZSgiRW50ZXIgdGhlIGtleVxuIikgdG9JbnQKCiAgICB3aGlsZSAoMyAhPSAoc2NhbGEuaW8uU3RkSW4ucmVhZExpbmUoIkNob29zZSBvcGVyYXRpb246XG4iICsKICAgICAgIjEpIEVuY3JpcHRcbiIgKwogICAgICAiMikgRGVjcmlwdFxuIiArCiAgICAgICIzKSBUbyByZXR1cm5cbiIpIHRvSW50IG1hdGNoIHsKICAgICAgY2FzZSAxID0+IHsKICAgICAgICBlbmNyeXB0V3RoU3BlY2lhbChrZXkpCiAgICAgIH0KICAgICAgY2FzZSAyID0+IHsKICAgICAgICBkZWNyeXB0V3RoU3BlY2lhbChrZXkpCiAgICAgIH0KICAgICAgY2FzZSBfID0+IHsKICAgICAgICAzCiAgICAgIH0KICAgIH0pKSBwcmludGxuKCJcbl9fX19fX19fX19fIikKICB9CgogIGRlZiBkZWNyeXB0V3RoU3BlY2lhbChrZXk6IEludCk6IFVuaXQgPSB7CiAgICB2YWwgY2lwaGVyID0gc2NhbGEuaW8uU3RkSW4gcmVhZExpbmUoIkVudGVyIGNpcGhlclxuIikKICAgIGZvciAoYyA8LSBjaXBoZXIpIHsKICAgICAgcHJpbnQoaWYgKGMudG9JbnQgPj0gMzIgJiYgYy50b0ludCA8PSAxMjYpIHsKICAgICAgICB2YWwgaTE6IEludCA9IChjLnRvSW50IC0gMzIgLSBrZXkpICUgOTUKICAgICAgICAoaWYgKGkxID49IDApIDMyICsgaTEgZWxzZSAxMjcgKyBpMSkgdG9DaGFyCiAgICAgIH0gZWxzZSBjKQogICAgfQogIH0KCiAgZGVmIGVuY3J5cHRXdGhTcGVjaWFsKGtleTogSW50KTogVW5pdCA9IHsKICAgIHZhbCBwdCA9IHNjYWxhLmlvLlN0ZEluIHJlYWRMaW5lKCJFbnRlciBQVFxuIikKICAgIGZvciAoYyA8LSBwdCkgewogICAgICBwcmludChpZiAoYy50b0ludCA+PSAzMiAmJiBjLnRvSW50IDw9IDEyNikgewogICAgICAgICgzMiArIChjLnRvSW50IC0gMzIgKyBrZXkpICUgOTUpIHRvQ2hhcgogICAgICB9IGVsc2UgYykKICAgIH0KICB9CgoKICBkZWYgd2l0aEtleVNldHM6IFVuaXQgPSB7CiAgICB2YWwga2V5QXJyOiBBcnJheVtTdHJpbmddID0gc2NhbGEuaW8uU3RkSW4ucmVhZExpbmUoIkVudGVyIEtleSBzZXRzOiAoZXg6IFsoMCwyKSwgKDUsIDMpXSApXG4iKS5yZXBsYWNlQWxsKCJcXCh8XFwpfFxcW3xcXF18XFxzIiwgIiIpIHNwbGl0KCIsIikKICAgIHZhciBrZXlTZXQ6IE1hcFtJbnQsIEludF0gPSBNYXAoKQogICAgZm9yIChpIDwtIDAgdG8ga2V5QXJyLmxlbmd0aCAtIDIgYnkgMikgewogICAgICBrZXlTZXQgKz0gKGtleUFycihpKS50b0ludCAtPiBrZXlBcnIoaSArIDEpLnRvSW50KQogICAgfQogICAgd2hpbGUgKDMgIT0gKHNjYWxhLmlvLlN0ZEluLnJlYWRMaW5lKCJDaG9vc2Ugb3BlcmF0aW9uOlxuIiArCiAgICAgICIxKSBFbmNyaXB0XG4iICsKICAgICAgIjIpIERlY3JpcHRcbiIgKwogICAgICAiMykgVG8gcmV0dXJuXG4iKSB0b0ludCBtYXRjaCB7CiAgICAgIGNhc2UgMSA9PiB7CiAgICAgICAgZW5jcnlwdFd0aEtleVNldHMoa2V5U2V0KQogICAgICB9CiAgICAgIGNhc2UgMiA9PiB7CiAgICAgICAgZGVjcnlwdFd0aEtleVNldHMoa2V5U2V0KQogICAgICB9CiAgICAgIGNhc2UgXyA9PiB7CiAgICAgICAgMwogICAgICB9CiAgICB9KSkgcHJpbnRsbigiXG5fX19fX19fX19fXyIpCiAgfQoKICBkZWYgZW5jcnlwdFd0aEtleVNldHMoa2V5U2V0OiBNYXBbSW50LCBJbnRdKSA9IHsKICAgIHZhbCBwdCA9IHNjYWxhLmlvLlN0ZEluIHJlYWRMaW5lKCJFbnRlciBQVFxuIikKICAgIHZhciBrZXk6IEludCA9IGtleVNldCgwKQogICAgZm9yIChpIDwtIDAgdG8gcHQubGVuZ3RoIC0gMSkgewogICAgICB2YWwgYyA9IHB0IGNoYXJBdChpKQogICAgICBwcmludChpZiAoYy50b0ludCA+PSA2NSAmJiBjLnRvSW50IDw9IDEyMikgewogICAgICAgICg2NSArIChjLnRvSW50IC0gNjUgKyBrZXkpICUgNTgpIHRvQ2hhcgogICAgICB9IGVsc2UgYykKICAgICAgaWYgKGtleVNldCBjb250YWlucyhpKSkga2V5ID0ga2V5U2V0KGkpCiAgICB9CiAgfQoKICBkZWYgZGVjcnlwdFd0aEtleVNldHMoa2V5U2V0OiBNYXBbSW50LCBJbnRdKSA9IHsKICAgIHZhbCBjaXBoZXIgPSBzY2FsYS5pby5TdGRJbiByZWFkTGluZSgiRW50ZXIgY2lwaGVyXG4iKQogICAgdmFyIGtleTogSW50ID0ga2V5U2V0KDApCiAgICBmb3IgKGkgPC0gMCB0byBjaXBoZXIubGVuZ3RoIC0gMSkgewogICAgICB2YWwgYyA9IGNpcGhlciBjaGFyQXQoaSkKICAgICAgcHJpbnQoaWYgKGMudG9JbnQgPj0gNjUgJiYgYy50b0ludCA8PSAxMjIpIHsKICAgICAgICB2YWwgaTE6IEludCA9IChjLnRvSW50IC0gNjUgLSBrZXkpICUgNTgKICAgICAgICAoaWYgKGkxID49IDApIDY1ICsgaTEgZWxzZSAxMjMgKyBpMSkgdG9DaGFyCiAgICAgIH0gZWxzZSBjKQogICAgICBpZiAoa2V5U2V0IGNvbnRhaW5zKGkpKSBrZXkgPSBrZXlTZXQoaSkKCiAgICB9CiAgfQoKCiAgZGVmIGJyZWFrV2l0aFNwZWNpYWxDaGFycyA9IHsKICAgIHZhbCBkaWN0aW9uYXJ5ID0gc2NhbGEuaW8uU3RkSW4ucmVhZExpbmUoIkVudGVyIGRpY3Rpb25hcnkgd29yZHM6XG4iKSBzcGxpdCgiICIpCiAgICB2YWwgY2lwaGVyID0gc2NhbGEuaW8uU3RkSW4gcmVhZExpbmUoIkVudGVyIHRoZSBjaXBoZXI6XG4iKQoKICAgIGZvciAoa2V5IDwtIDAgdG8gMjU1KSB7CiAgICAgIHZhciBwdCA9ICIiCiAgICAgIGZvciAoYyA8LSBjaXBoZXIpIHsKICAgICAgICBwdCArPSB7CiAgICAgICAgICB2YWwgaTE6IEludCA9IChjLnRvSW50IC0gMzIgLSBrZXkpICUgOTUKICAgICAgICAgIChpZiAoaTEgPj0gMCkgMzIgKyBpMSBlbHNlIDEyNyArIGkxKSB0b0NoYXIKICAgICAgICB9CiAgICAgIH0KICAgICAgZGljdGlvbmFyeU1hdGNoaW5nKGRpY3Rpb25hcnksIHB0LCBrZXkpCiAgICB9CgogIH0KCiAgZGVmIGJyZWFrV2l0aEtleVNldHMgPSB7CiAgICB2YWwgZGljdGlvbmFyeSA9IHNjYWxhLmlvLlN0ZEluLnJlYWRMaW5lKCJFbnRlciBkaWN0aW9uYXJ5IHdvcmRzOlxuIikgc3BsaXQoIiAiKQogICAgdmFsIGNpcGhlcnMgPSBzY2FsYS5pby5TdGRJbi5yZWFkTGluZSgiRW50ZXIgdGhlIGNpcGhlciAoc2hvdWxkIGNvbnRhaW4gc3BhY2VzKTpcbiIpIHNwbGl0KCIgIikKCiAgICBmb3IgKGNpcGhlciA8LSBjaXBoZXJzKSB7CiAgICAgIGZvciAoa2V5IDwtIDAgdG8gMjU1KSB7CiAgICAgICAgdmFyIHB0ID0gIiIKICAgICAgICBmb3IgKGMgPC0gY2lwaGVyKSB7CiAgICAgICAgICBwdCArPSB7CiAgICAgICAgICAgIHZhbCBpMTogSW50ID0gKGMudG9JbnQgLSA2NSAtIGtleSkgJSA1OAogICAgICAgICAgICAoaWYgKGkxID49IDApIDY1ICsgaTEgZWxzZSAxMjMgKyBpMSkgdG9DaGFyCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRpY3Rpb25hcnlNYXRjaGluZyhkaWN0aW9uYXJ5LCBwdCwga2V5KQogICAgICB9CiAgICB9CgogIH0KCiAgZGVmIGRpY3Rpb25hcnlNYXRjaGluZyhkaWN0aW9uYXJ5OiBBcnJheVtTdHJpbmddLCBwdDogU3RyaW5nLCBrZXk6IEludCkgPSB7CiAgICBmb3IgKGQgPC0gZGljdGlvbmFyeSkgewogICAgICBpZiAocHQudG9Mb3dlckNhc2UgY29udGFpbnMgKGQgdG9Mb3dlckNhc2UpKSB7CiAgICAgICAgcHJpbnRsbigibWF0Y2g6XG4ga2V5OiIgKyBrZXkgKyAiXG4gcHQ6IiArIHB0KQogICAgICB9CiAgICB9CiAgfQoKICBkZWYgZGlzY3Vzc2lvbkFuc3dlcnMgPSB7CgogICAgcHJpbnRsbigiVGhlIG9uZSB3aXRoIHRoZSBrZXkgc2V0IGlzIG1vcmUgc2VjdXJlIGFzIGl0IGNvdWxkIGJlIHVzZWQgdG8gYWRkIG11bHRpcGxlIGxheWVycyBvZiBlbmNyeXB0aW9uIHdoaWNoIGdvbm5hIHJlcXVpcmUgbW9yZSBjb21wdXRpbmcgcG93ZXIgdG8gYXR0YWNrLFxuIiArCiAgICAgICIoY2lwaGVyIGxlbmd0aCAqIDI1NSpudW1iZXIgb2Ygc2V0cykgaW5zdGVhZCBvZiAoY2lwaGVyIGxlbmd0aCAqIDI1NSkuXG4iICsKICAgICAgIkhvd2V2ZXIgaXQgY291bGQgYmUgaW1wcm92ZWQgYnkgYXBwbHlpbmcgYSB0cmFuc3Bvc2l0aW9uIGFsZ29yaXRobSBzbyBpdCB0YWtlIGF3YXkgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgRW5nbGlzaCBsYW5ndWFnZSAiKQogIH0KfQ==