public class Main {
public static void main
( String [ ] args
) { int [ ] ciphertext = {
102 , 141 , 142 , 161 , 148 , 131 , 158 , 157 , 120 , 131 ,
126 , 153 , 130 , 143 , 154 , 135 , 118 , 137 , 148 , 111 ,
116 , 145 , 134 , 133 , 118 , 103 , 136 , 107 , 138 , 127 ,
102 , 131 , 194 , 99 , 114 , 200 , 202 , 127 , 120 , 105 ,
126 , 202 , 108 , 194 , 198 , 214 , 222 , 204 , 116 , 224 ,
194 , 198 , 202 , 230 , 166 , 222 , 216 , 234 , 232 , 210 ,
222 , 220 , 210 , 230 , 194 , 230 , 198 , 210 , 210 , 230 ,
234 , 218 , 222 , 204 , 194 , 216 , 216 , 224 , 216 , 194 ,
210 , 220 , 232 , 202 , 240 , 232 , 198 , 208 , 194 , 228 , 230
} ;
decrypt( ciphertext) ;
}
public static void decrypt( int [ ] ct) {
int length = ct.length ;
System .
out .
println ( "Ciphertext length: " + length
+ " characters" ) ; System .
out .
println ( "Testing possible keys from " + ( length
/ 2 ) + " to " + length
) ;
for ( int initialKey = length/ 2 ; initialKey <= length; initialKey++ ) {
StringBuilder plaintext = new StringBuilder( ) ;
boolean valid = true ;
int currentKey = initialKey;
for ( int encrypted : ct) {
boolean found = false ;
// Try all possible ASCII characters (32-126)
for ( int c = 32 ; c <= 126 ; c++ ) {
if ( c + ( c % currentKey) == encrypted) {
plaintext.append ( ( char ) c) ;
found = true ;
break ;
}
}
if ( ! found) {
valid = false ;
break ;
}
currentKey++;
}
if ( valid) {
System .
out .
println ( "\n Found valid decryption with initial key " + initialKey
+ ":" ) ; System .
out .
println ( plaintext.
toString ( ) ) ; return ;
}
}
System .
out .
println ( "No valid decryption found with standard ASCII characters." ) ; }
}
cHVibGljIGNsYXNzIE1haW4gewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIGludFtdIGNpcGhlcnRleHQgPSB7CiAgICAgICAgICAgIDEwMiwgMTQxLCAxNDIsIDE2MSwgMTQ4LCAxMzEsIDE1OCwgMTU3LCAxMjAsIDEzMSwgCiAgICAgICAgICAgIDEyNiwgMTUzLCAxMzAsIDE0MywgMTU0LCAxMzUsIDExOCwgMTM3LCAxNDgsIDExMSwgCiAgICAgICAgICAgIDExNiwgMTQ1LCAxMzQsIDEzMywgMTE4LCAxMDMsIDEzNiwgMTA3LCAxMzgsIDEyNywgCiAgICAgICAgICAgIDEwMiwgMTMxLCAxOTQsIDk5LCAxMTQsIDIwMCwgMjAyLCAxMjcsIDEyMCwgMTA1LCAKICAgICAgICAgICAgMTI2LCAyMDIsIDEwOCwgMTk0LCAxOTgsIDIxNCwgMjIyLCAyMDQsIDExNiwgMjI0LCAKICAgICAgICAgICAgMTk0LCAxOTgsIDIwMiwgMjMwLCAxNjYsIDIyMiwgMjE2LCAyMzQsIDIzMiwgMjEwLCAKICAgICAgICAgICAgMjIyLCAyMjAsIDIxMCwgMjMwLCAxOTQsIDIzMCwgMTk4LCAyMTAsIDIxMCwgMjMwLCAKICAgICAgICAgICAgMjM0LCAyMTgsIDIyMiwgMjA0LCAxOTQsIDIxNiwgMjE2LCAyMjQsIDIxNiwgMTk0LCAKICAgICAgICAgICAgMjEwLCAyMjAsIDIzMiwgMjAyLCAyNDAsIDIzMiwgMTk4LCAyMDgsIDE5NCwgMjI4LCAyMzAKICAgICAgICB9OwogICAgICAgIAogICAgICAgIGRlY3J5cHQoY2lwaGVydGV4dCk7CiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWNyeXB0KGludFtdIGN0KSB7CiAgICAgICAgaW50IGxlbmd0aCA9IGN0Lmxlbmd0aDsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNpcGhlcnRleHQgbGVuZ3RoOiAiICsgbGVuZ3RoICsgIiBjaGFyYWN0ZXJzIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0aW5nIHBvc3NpYmxlIGtleXMgZnJvbSAiICsgKGxlbmd0aC8yKSArICIgdG8gIiArIGxlbmd0aCk7CiAgICAgICAgCiAgICAgICAgZm9yIChpbnQgaW5pdGlhbEtleSA9IGxlbmd0aC8yOyBpbml0aWFsS2V5IDw9IGxlbmd0aDsgaW5pdGlhbEtleSsrKSB7CiAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcGxhaW50ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgIGludCBjdXJyZW50S2V5ID0gaW5pdGlhbEtleTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAoaW50IGVuY3J5cHRlZCA6IGN0KSB7CiAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgICAvLyBUcnkgYWxsIHBvc3NpYmxlIEFTQ0lJIGNoYXJhY3RlcnMgKDMyLTEyNikKICAgICAgICAgICAgICAgIGZvciAoaW50IGMgPSAzMjsgYyA8PSAxMjY7IGMrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChjICsgKGMgJSBjdXJyZW50S2V5KSA9PSBlbmNyeXB0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW50ZXh0LmFwcGVuZCgoY2hhciljKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBjdXJyZW50S2V5Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkZvdW5kIHZhbGlkIGRlY3J5cHRpb24gd2l0aCBpbml0aWFsIGtleSAiICsgaW5pdGlhbEtleSArICI6Iik7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocGxhaW50ZXh0LnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gdmFsaWQgZGVjcnlwdGlvbiBmb3VuZCB3aXRoIHN0YW5kYXJkIEFTQ0lJIGNoYXJhY3RlcnMuIik7CiAgICB9Cn0=