doronb, in the Puzzles and Riddles TA, with the cryptogram.
Main Topics
Browse All TopicsHTT"TrT"TI`8x'Z'`~~~`H2`H2
This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.
Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.
If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.
Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.
Access the answers to your technology questions today.
30-day free trial. Register in 60 seconds.
Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Try it out and discover for yourself.
30-day free trial. Register in 60 seconds.
Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.
>> From a decryption standpoint, there are way too many H's and T's for this to be a normal substitution cypher.
I noticed that too. I was thinking that there were maybe two different decodes here - use one decode for the characters between the H's, and the second between the T's. But the characters between those letters are basically the QWERTY sequence.
There are actually many repeated strings with just one or two character different. I think the key might be finding the differences between all the garbage and whatever is left over is the text.
e.g.
<.>/H#H4H$H5H%H6H^H7H_H=H+
versus
<.>/H#H4H$H5H%H6H^H7H_H=H+
Remove duplication and get only the letters 'HU' remaining in the second string.
I would do more but I have to go home now. Hopefully someone who has time can see if this is the correct way to break this code.
lots of string that are upper and lowercase in order on the key board separated T or H
H6H^H7H_H=H+HqHQHwHWHeHUHi
are these strings describing a path over the key board of 2 opponents, perhaps?
>>> We're looking at a gif or jpeg?
Indeed.
>>> Surely there would be non-printable characters if it were a standard image format (RLE, etc)...
The file has been encoded to contain only printable characters.
>>> still think we're looking at rows and columns though
>>> Yeah, maybe it's a dump of a map from Rogue!
>>> The asterisk is hitting the equals-sign with an exclaimation mark ;)
Alas, but no, to all three comments :)
>>> Are you being attacked with a sword by some creature possibly a man.
If you have decrypted the image, please post it somewhere, or otherwise provide a proper description of the "creature" attacking you :)
>>> So much for copying to Notepad and saving it as a .jpg....
I wouldn't've posted it here if it were that simple ;)
Just like I promised... the same attacker, same weapon, different data-black...
o11"1R1"1I`*x'Z'`~~~`o@`o@
>>> Is the image size 42 x 42????
>>> Or 31*61?
Just to stop the guessing game, the image is 33x52 in pixels.
>>> Is it an ogre with a club?
Nope, and once someone does decrypt the image, I'd require proof that you did, so please post the code you've used to decrypt the image so we can all see your code works :)
As far as I can tell it is a uuencoded file. The problem I am having is tryin to decode it. Tried using software but that didn't work. I started trying to do a character exchange by changing it into binary, but that got to be tedious, although this might be the way to go cause it should come out into an Ascii art file
>>> it should come out into an Ascii art file
I thought I already said it was a JPG image that is 33x52 in pixels.
>>> As far as I can tell it is a uuencoded file. The problem I am having is tryin to decode it. Tried using software but that didn't work.
Well, that's the idea isn't it, if you could decode it with just any software, what'd be the point? :)
>>> If the data is a jpg file of any form then it does not have a header.
Its a JPEG file header and all, if you haven't been able to decrypt it yet, try try again :)
>>> Is it a Microsoft GDI+ vulnerability? in a JPEG?
Nope, its an image of a "creature" holding a weapon and ready to attack, in JPEG file-format, encrypted of course.
The image itself is intact, I assure you. Before posting the text-blocks I check them to make sure they can be decrypted back into the original file, there's no tricks involved.
>>> Are the two data-blocks the same JPEG file?
Yes, they are.
>>> An encrypted .jpg, we could be here for years.
Well, I do want to test my idea for encoding a binary data-stream, and so far its holding tight :)
>>> You realise the only plain text would be in the header and that depends on the program that made it.
I didn't really understand what you meant to say... :o
>>> so this is not a reasonably solvable puzzle but an encryption test, that would have been nice to know ahead of time.
I guess its reasonably solvable to someone who knows his encoding; I have been giving hints along the way...
and in my post [02/14/2005 08:42AM GMT-12:00] I said:
"...once you decrypt the text-block..."
So I never kept that a secret and assumed anyone who'd post here would read the comments first. I consider this reasonably solvable for a person experienced in encoding/decoding. I can also tell you that there is no special key involved and there were no prime numbers involved in the encoding. The only piece of the puzzle missing is the encoding/decoding process.
Ok can you answer a few questions i have about your data block above.
The thing that puzzles me is that alot of these post almost seem to contradict or confuse the matter. It was mentioned that 2 different codes were used... Does this imply that part of your data block is encoded with one type of encryption, and the rest in another?
OR does this imply that your image was encrypted completely with one type of encryption....and the newly encrypted file is then encrypted AGAIN in another/same encryption form. The result would be one file, encrypted twice!
The other thing i am puzzled with is what type of encryption you have used.... Most types of encryption require some type of header or footer, to tell the decrypter the origianl file name, or its size etc. Our problem is that we know the file size (as you have previously mentioned it) HOWEVER the headers and footers are missing...which puzzles me.
As there are no headers or footers, i can't see this code being UUencoded, Base64, XXencoded or yEncoded, unless of course you have removed key headers or used another form of encoding....
Am i running in circles, or am i remotely close?
>>> The thing that puzzles me is that alot of these post almost seem to contradict or confuse the matter. It was mentioned that 2 different codes were used... Does this
>>> imply that part of your data block is encoded with one type of encryption, and the rest in another?
>>> OR does this imply that your image was encrypted completely with one type of encryption....and the newly encrypted file is then encrypted AGAIN in another/same
>>> encryption form. The result would be one file, encrypted twice!
I apologize since I may have misdirected you here. There are two steps to this encoding process, not two complete encoding processes. I first start with an array of characters which I rotate around (and saying that in itself is a big hint). Then the array is used to encode the contents of a stream of bytes. However, after encoding the original bytes, the process is complete. So yes, there are two phases of encoding here, which is also why the 2nd text-block is a bit different than the first but both text-blocks contain the same JPEG image. There is no double-encryption here, just a random rotating of the base character-table and then encoding of the byte-stream.
>>> The other thing i am puzzled with is what type of encryption you have used.... Most types of encryption require some type of header or footer, to tell the decrypter
>>> the origianl file name, or its size etc. Our problem is that we know the file size (as you have previously mentioned it) HOWEVER the headers and footers are
>>> missing...which puzzles me. As there are no headers or footers, i can't see this code being UUencoded, Base64, XXencoded or yEncoded, unless of course you have
>>> removed key headers or used another form of encoding....
I have used my own encoding (of course) which gives the end result of a simple text-block. I do not require a header or footer since my encoder/decoder use the same character-table and the file-size is evident from the length of the text-block itself (that is, if you understand the encoding process). I assure you that I have not removed any headers or footers as the code I use is my own and not truly Base64 or any other encoder there were no extra info-blocks to remove.
>>> Am i running in circles, or am i remotely close?
I think you're closely running in circles ;)
Honestly, there's not a lot I can say now without giving you the full answer here (or giving a bigger hint than I already have). What I did is to take a JPEG file, read its contents as a byte-stream, run the byte-stream through my encrypter/encoder, save the textual result in a text file. I then re-read the text file's contents and decoded it back to a JPEG file which I then compared with the original image. I did this process twice, once for each of the text-blocks I posted here.
Some of your comments have made me think of ways to improve my encoding algorithm:
@Arawn: >>> From a decryption standpoint, there are way too many H's and T's for this to be a normal substitution cypher.
I've improved my encoding slightly thanks to your comment :)
@JohnK813: >>> But the characters between those letters are basically the QWERTY sequence.
@ozo: >>> The encoding appears to be based on the layout of a Roman QWERTY keyboard.
That's why I decided to call my encoding QwertyEncoding, thanks guys! :)
@ ric_m: >>> ...both data blocks have exactly 1891 characters...
The same JPEG image, encoded with the new and improved QwertyEncoding algorithm is now 1659 bytes/characters long, 232 bytes smaller.
I'm still keeping the old code, but if anyone is interested, I can post a text-block from the improved QwertyEncoding algorithm.
I took your advice diegoful, and here's the result:
mzt!,m&m8mqRtm=w6qQ8-)tRm8
tRtm*wqQtRmQm-Rmqm6m6Rm&m-
+t[Rtm%65+r_Q8)7tRm4RXB"Rt
q-06-)6tRmQm-Rtm4)qe6+tRtm
4Rntme6+Qrt:tm)5-%6%tRtmQ6
The above text-block contains simple English text only. The following text-block however contains the original JPEG image:
\*-`-*CUC{-~9czXz~111~\#~\
OFp{aAdddtoGJgsj}Sds*C*o~:
1`8`~1!2@3#4$5%6*C*9~*19~!
*jUS\$\Q\O5%+qQwWiIoOpPdDf
lxXcCvVbBn/?*~1!2@3#&89(0)
4$5%6*C*9~*1(~!1!@@2@43@@~
d*]i*JqQwWIoOpPDfFgGh:'"zZ
Bn/?*~1!2@3#&89(0)_=+RtTyY
~\Ai*7\4=*$\=\:\My*L*)\#1J
FK@1\jJ\Rg\,\J*|o*x\a+\"*L
IP*^\q*L@>\L\|\B>-*Ik74-\t
+*!*3\l#VH,\Kvm=[Y*I*!*YQ*
R\P\d\{*%\:*J*+\?*xk*JY\b{
*o\s*|*H\q*F*(\Q.\s*|ig*p\
6\|*}\W\0\7@x\cR\(m-*&FG#-
*eD*8\k*=<n5\2\>\w*^e\o2T\
LZ\K\|*8*$JZB\KC*W}*F*Hi\x
.m*h?\H\P*^\'*5\w*^*=j\w\3
O*],4@\gBL\1MC\H*O*KA\g\q\
mF*Y\w*I\!\v*'o\S\x\Fsz*A\
*d*I\W.+9*"f-\>7$_-]\s\gBU
I am sure that once you figure out what the English text that's contained in the first text-block, the JPEG image would be easier to figure out as well :)
Just a comment about the text-blocks, the QwertyEncoding algorithm is an improved version that created the text-blocks posted in the beginning of the question. This means that although the 2nd text-block in my previous post does contain the same JPEG image I've used so far, the encoding is different!
Another comment, both text-blocks in my previous comment are formatted to have 80 characters per line (except the last line of text of course which usually would have less than 80 characters). It would be easier to visualize this if the text-blocks would be copied and pasted into NOTEPAD for instance with a fixed-width font like Courier or Fixedsys.
Ok, I've decided to make things really easy and post three words that define things most people would always like to have in life.
This is something almost everyone wants to find at least once in their lifetime [*^a/Cb<'] (4 letters)
This is a resource most people waste without realizing it [fjdq,XV"] (4 letters)
While this resource, most people just love to spend [xo;}VBb'?] (5 letters)
The square-brackets are not a part of the words and all three words are encoded with my QwertyEncoding.
Once you've figured out the three words and how to decode them, try the following block:
mzt!,m&m8mqRtm=w6qQ8-)tRm8
tRtm*wqQtRmQm-Rmqm6m6Rm&m-
+t[Rtm%65+r_Q8)7tRm4RXB"Rt
q-06-)6tRmQm-Rtm4)qe6+tRtm
4Rntme6+Qrt:tm)5-%6%tRtmQ6
And if you've figured that text-block, try decoding the original JPEG image:
\*-`-*CUC{-~9czXz~111~\#~\
OFp{aAdddtoGJgsj}Sds*C*o~:
1`8`~1!2@3#4$5%6*C*9~*19~!
*jUS\$\Q\O5%+qQwWiIoOpPdDf
lxXcCvVbBn/?*~1!2@3#&89(0)
4$5%6*C*9~*1(~!1!@@2@43@@~
d*]i*JqQwWIoOpPDfFgGh:'"zZ
Bn/?*~1!2@3#&89(0)_=+RtTyY
~\Ai*7\4=*$\=\:\My*L*)\#1J
FK@1\jJ\Rg\,\J*|o*x\a+\"*L
IP*^\q*L@>\L\|\B>-*Ik74-\t
+*!*3\l#VH,\Kvm=[Y*I*!*YQ*
R\P\d\{*%\:*J*+\?*xk*JY\b{
*o\s*|*H\q*F*(\Q.\s*|ig*p\
6\|*}\W\0\7@x\cR\(m-*&FG#-
*eD*8\k*=<n5\2\>\w*^e\o2T\
LZ\K\|*8*$JZB\KC*W}*F*Hi\x
.m*h?\H\P*^\'*5\w*^*=j\w\3
O*],4@\gBL\1MC\H*O*KA\g\q\
mF*Y\w*I\!\v*'o\S\x\Fsz*A\
*d*I\W.+9*"f-\>7$_-]\s\gBU
If you've finally managed to decode the image, please post the code you've used to decode my text-blocks and also, what's in the JPEG image. :)
Well, this one >>This is a resource most people waste without realizing it [fjdq,XV"] (4 letters)
Must be "time". But I still haven't figured out the combination used to change your 4 letters into 8. It would be easy to say it is some two-for-one cipher, but your next clue has a 5 letter answer but only 9 letters decrypted.
The others could be "love" and "money" (not sure of the capitalization used)
which would mean they all have "e" in the fourth position
<' V" b' all end in ' or " which go together on many qwerty keyboards
Patterns from other encodings suggest that each plaintext character maps to a fixed number of cypertext chracters,
To be decodeable, it would help it if could be determined from the first character whether a one or two character encoding is being used.
One possibility could be that ? always decodes as y
The 8 or 9 character samples don't seem to have the pairs of very common characters that seem to characterize the other samples
Yes.
public class TestApplication {
public static void main(String[] args) {
String love = QwertyEncoding.encodeBytes
String time = QwertyEncoding.encodeBytes
String money = QwertyEncoding.encodeBytes
System.out.println(new String(QwertyEncoding.deco
System.out.println(new String(QwertyEncoding.deco
System.out.println(new String(QwertyEncoding.deco
}
}
The output is:
LOVE
TIME
MONEY
Now, figure out the rest ;)
Love - [*^a/Cb<'] (4 letters)
Time - [fjdq,XV"] (4 letters)
Money - [xo;}VBb'?] (5 letters)
Those riddles were easy enough without you giving away the answers.
Trying ASCII conversions...
L - 76
O - 79
V - 86
E - 69
This doesn't look like an ASCII substitution cipher either. There's no alternate ASCII code without you applying some type of mathematical formula (and my cryptographic knowledge is rather lacking). If you're limiting yourself to the letters and numbers directly on a QWERTY keyboard, then you're probably not using substitution anyway.
So lets rethink:
My bet: You're converting the letters into XY-Qwerty Coordinates. Since you're not using SHIFT combinations, all letters are capitalized. In Qwerty Coordinates, you apply some mathematical formula to switch the characters. But I'm spying astrisks which require a shift key, so maybe you are including shift possibilities. The alternative is that you're adding on (possibly randomized) garbage that is placed in location where you can determine if it is garbage.
PS: I spy Java, how'd you learn that? I've been looking for ages for a decent guide and I've come up rather empty-handed.
PPS: Using the Altkey with the Numberpad (numlock enabled), the QWERTY or AZERTY keyboard can contain at least the whole ASCII set.
>> Those riddles were easy enough without you giving away the answers.
True, but those riddles weren't the real riddle :)
>> If you're limiting yourself to the letters and numbers directly on a QWERTY keyboard
I am, but I'm also using the SHIFT key so I have 1 and ! and 'a' and 'A'.
>> You're converting the letters into XY-Qwerty Coordinates
You're quite close there.
>> The alternative is that you're adding on (possibly randomized) garbage that is placed in location where you can determine if it is garbage.
Actually, I'm not including any grabage on purpose. There can be used characters however if the encrypted data is too short or not varied enough.
>> PS: I spy Java, how'd you learn that? I've been looking for ages for a decent guide and I've come up rather empty-handed.
>> PPS: Using the Altkey with the Numberpad (numlock enabled), the QWERTY or AZERTY keyboard can contain at least the whole ASCII set.
I'm not sure what you meant by those two comments.
>> I bet the array you use in the encoding is a multidimensional one and must somehow contain a representation of your keyboard, does it?
Multidimensional, wrong; contains a representation of an English QWERTY keyboard, correct.
>> Are you doing any binary operation on the ASCII values to get them to fit into the printable range, or you just use the values and map them onto the keyboard?
I'm actually mapping any byte-value (0-255) to a QWERTY sequence. :)
So, you've created a 256-character hash table out of the keyboard. The two steps you do are:
1) Lay out your hash table
2) Lookup the hash for each input char then spit out the hashed value
From your first pair of data blocks, it sounds as if #1 isn't a fixed method, there may be more than one way to lay out the hash. (You output the same file twice, and the two outputs were different.) This leads me tyo believe the output also includes a "key" for recereating the hash.
From your "three words" encodings, it also seems as if the hash table can contain variable number of characters. Perhaps this is unique to your part 1 creation of teh hash table. I'm thinking that perhaps there is a character to indicate "shift," so shifted chacarters are two characters long, and unshifted are one character long.
> I'm thinking that perhaps there is a character to indicate "shift," so shifted chacarters are two characters long,
> and unshifted are one character long.
If that was true, the encoded output for 'MONEY' wouldn't have had seven characters. It's not that easy.
Also, there is no direct correspondence between characters. Letters O, E and M are repeated in all three words, but there's no similarity in the encoded strings. That seems to indicate either of:
- The encoding uses a random seed, which should somehow be embedded in or obtained from the encoded data.
- The encoding uses the length of the data as a seed. The problem with this alternative is that as we have seen, the data length isn't preserved during the encoding process, so...
uKER,
> Also, there is no direct correspondence between characters. Letters O, E and M are repeated
> in all three words, but there's no similarity in the encoded strings. That seems to indicate either of:
> - The encoding uses a random seed, which should somehow be embedded in or obtained from the
> encoded data.
> - The encoding uses the length of the data as a seed. The problem with this alternative is
> that as we have seen, the data length isn't preserved during the encoding process, so...
More or less what I was saying. It could be seeded with the length of the input string, which IS known.
- qwaletee
> Bravo you two, you're on the right path for sure...
I somewhat feel you're misguiding us here. There can't be a 'header' global to the file. There have to be per-character indicators for the decoding, as you are mapping the whole byte range into printable range, or what is worse, keyboard range. So there simply can't be a direct translation anywhere, in the sense of one data byte corresponding to just one encoded byte.
Unless there's some kind of 'block header' that you could recognize as not being data, and told you for example, that the following characters fall between a given ASCII range.
*Sigh!*...
Let me give another hint... each text-block is composed out of two "segments" of characters (in a keyboard range), the first part is a "header" of sorts, without which, the second part is un-decodable. The second part is the actual encoded byte-stream.
I really can't give you more hints on this and if I would, I'd have to end up closing the question and giving the points to myself ;)
uKEr, what doronb (is your name Doron, I once new brothers Oron and Doron) is saying is that basically, the first part of the cyphertext tells the decoder what version of direct translation is in use, and the rest is teh direct translation. The first part, more specifically, tell the decoder how to construct the mapping for the direct translation.
Thing is, it is still almost impossible to figre out what he is doing without some truly serious wokr at cypherplay. Since the vast majority of the block is direct translation (albeit, not necessarily 1:1 char count), standard cryptanalysis of character frequency should yield clues for ASCII text translations. One could then possibly backtrack for a single version of the mapping. It would then be a huge job just to figure out how the header creates that mapping, and then to generalize tha to all header classes. On top of that, we have no large plain ASCII text /cryptotext to analyze for such frequencies. Which means, it may be beyond me altogether, and is certainly beyond my ability to invest time in it.
>> is your name Doron...
Yes it is :)
>> ...the first part of the cyphertext tells the decoder what version of direct translation is in use, and the rest is the direct translation...
Not exactly what version of direct translation, but very close.
>> The first part, more specifically, tell the decoder how to construct the mapping for the direct translation.
>> ...the vast majority of the block is direct translation (albeit, not necessarily 1:1 char count)...
Both statements are true.
>> It would then be a huge job just to figure out how the header creates that mapping, and then to generalize tha to all header classes. On top of that, we have no large plain ASCII text /cryptotext to analyze for such frequencies. Which means, it may be beyond me altogether, and is certainly beyond my ability to invest time in it.
Do remember that my encoder may produce different text-block results for the same byte-stream being encoded. >:)
Can someone confirm the US keyboard layout as I use a british layout and the layout is different, including characters such as £ and with various symbol keys in diferrent places. I have it as:
~!@#$%^&*()_+
`1234567890-=
QWERTYUIOP{}|
qwertyuiop[]\
ASDFGHJKL:"
asdfghjkl;'
ZXCVBNM<>?
zxcvbnm,./
(top line to bottom line, shifted line first then unshifted)
256 things to encode, 94 characters to encode it into. Obviously doesn't go - need three sets of characters to represent them.
Possible solution - take two characters as reserved (which I will call 'KEY' characters) - H and T for arguments sake - and the other 92 form your lookup table (which I call 'VALUE' characters). The first set is written as a single character as normal, set 2 is prefixed by H and set 3 is prefixed by T. Therefore g, Hg and Tg all represent a different single encoded character. (eg. 'g' might map to 'D' in set one, 'i' in set two and 'p' in set three - therefore 'gHgTg' decodes to 'Dip')
Now someone is quite likely to spot the frequency of the key characters and figure this much out without too much difficulty. You can then turn it into a straight substitution cypher again and work on frequency of key/value pairs etc to determine the lookup table. To get around this - cycle the value characters 1 place to the left for each new character to encode which 'double encodes' the text and requires previous knowledge of the entire value character set to decode it. eg for the 'Dip' example the original lookups could have been:
Decoded ... B C D E F ... g h i j k ... n o p q r ...
Encoded ... e f g h i ... He Hf Hg Hh Hi ... Te Tf Tg Th Ti ...
but now the cypher moves a place after each letter:
Decoded ... B C D E F ... g h i j k ... n o p q r ...
Encoded ... e f g h i ... He Hf Hg Hh Hi ... Te Tf Tg Th Ti ... (1st char)
Encoded ... f g h i j ... Hf Hg Hh Hi Hj ... Tf Tg Th Ti Tj ... (2nd char)
Encoded ... g h i j k ... Hg Hh Hi Hj Hk ... Tg Th Ti Tj Tk ... (3rd char) etc
Making the new encoding - 'gHhTh' = 'Dip'
These characters can be chosen differently for each new encoding as can where your cycle starts from. ('HOW!' I hear you ask ... good question, will return to this later!)
We have three sets of characters with 92 available characters in each set. 3 * 92 = 276 which is 20 more than we need to encode all the characters. So what to do with these left overs (the 'DUMMY' characters)? Insert them wherever you want of course! Your decoder can know that they're not used and ignore them, whereas anyone trying to decode your stream will just get into all manner of bother with them! In addition - using these characters in repeated sections can break up the sequence making it less apparent in any originally repeated blocks. 12 of the 20 potential dummy combinations for the original problem are (H) '~1!2@ and (T) 2@3#4$. I'll leave it to you to find the others - may give me time to work on a decoder before someone else does!
In case you're having a hard time understanding the wordy description - if you were encoding a five letter word, using only the first 15 letters of the alphabet and representing them as numbers you could do it like this:
Split your numbers into 3 groups, the VALUE, DUMMY and KEY numbers:
VALUE: 0,1,2,3,4
DUMMY: 5,6,7
KEY: 8,9
The lookups for the 5 character positions could be:
a b c d e f g h i j k l m n o (original)
0 1 2 3 4 80 81 82 83 84 90 91 92 93 94 (1st char)
94 0 1 2 3 4 80 81 82 83 84 90 91 92 93 (2nd char)
93 94 0 1 2 3 4 80 81 82 83 84 90 91 92 (3rd char)
92 93 94 0 1 2 3 4 80 81 82 83 90 84 91 (4th char)
91 92 93 94 0 1 2 3 4 80 81 82 90 83 84 (5th char)
so 'badge' = 194131, 'label' = 919494182 (note the repeated 94 section even though different letters and 'l' being represented by different numbers at the start and end of the word), and 'eeeee' comes out as 43210 (similar to the qQwWeE type output seen in the real thing)
the numbers 5, 6, 7, 85, 86, 87, 95, 96 and 97 could be placed anywhere in any of the encodings and the decoder could simply strip them out first (could even be in between a double character encoding - 8872 would become 82 would become 'h' for the first char). Thus you you could encode 'eeeee' as '486327569610' to make the sequence less obvious.
of course in theory you don't need to start at 0 for the encoding cycle, could just as easily pick 83 or 92 etc.
So what do we need so far?
We need a base character table and in this case I would suggest it is the QWERTY keyboard with each key in turn, and the key followed by it's shift equivalent ...
'~1!2@3#4$5%6^7&8*9(0)-_=+
... due to the repetition of these sequences (often interspersed with a key character) where the same original character was being repeatedly encoded.
We also need to know the order of the unencoded side of the lookup - I'm very much hoping this is in ASCII order 0-255 but until I get round to trying it this can't be easily determined.
After that we need to know where to start in the cycle, which character blocks are dummy blocks and which are the two key characters. As we are told no header and footer info is used, I would presume the encoded stream length is hashed in some way to give a number from which the start location is determined (remainder when the length is divided by 256? - or is that too obvious?!) using the dummy characters to pad out to the required length (so in the case mentioned to give the same remainder as the original uncoded stream did) - same for the dummy blocks and keys, although these could be defined uniquely for each of the 256 start points for added security (cos you'd be unable to determine them from the hash but would require a further table of lookups)
I have not had time to try and apply all this supposition to the examples given but will look at the plain text and later the images when I get some time. Am now going to get on with the work I've supposed to have been doing all afternoon instead of writing all this!
Hope it revives the thread and sets people on the way to solving it - am dying to find out what the picture is now!
*phew*
The following program decodes *^a/Cb<' fjdq,XV" xo;}VBb'?
#!/usr/bin/perl
use vars qw($seq @seq %ord);
$seq=<<'END';
`~
1!2@3#4$5%6^7&8*9(0)-_=+
qQwWeErRtTyYuUiIoOpP[{]}\|
aAsSdDfFgGhHjJkKlL;:
'"
zZxXcCvVbBnNmM,<.>/?
END
$seq =~ s/\s+//g;
@seq=split//,$seq;
@ord{@seq}=0..$#seq;
for( my @c=qw( *^a/Cb<' fjdq,XV" xo;}VBb'? ) ){
my $x=substr($_,0,2,"").subst
(my $s=$seq) =~ s/[$x]//g;
my @s = split//,$s;
my %o;
@o{@s}=(0..$#s);
while( /(.)/g ){
printf"%c",$o{$1} + 31;
}
print "\n";
}
The mzt! code seems to decrypt to
This Zquestion is Zinteresting. You Zshould Zkeep it Zopen Zjust to see how Zgood is Zyour QZwertyEZncoding. HZowever, Zdecrypting a JPG Zfile is too Zmuch of a Zbother for Zsomeone to Zanswer Zyour Zquestion. How Zabout Zposting Zjust a QZwertyEZncoded Ztext Zpharse in Zplain Zenglish?
ozo,
Hmm - whilst my idea was nice in theory (and I may implement it as an interesting encryption algorithm!) you have convinced me on the one to one mapping - in this case ignoring the m. The first 4 characters containing the entire key required also makes sense which was something I was contemplating for the LOVE TIME MONEY words but got sidetracked by something else!
However - surely it would be ' that mapped to Z and not t as you seem to have it. With R as the space character (ASCII 32) then the t (the next in the sequence) would map to ASCII 33 which is the ! character.
If this works then the encoding runs from R becomes space (ASCII 32) through to r becomes y (ASCII 121). It would be interesting to see how a 'z' would be encoded but oh well.
the 4 first characters however now bear significance - from mzt!: m is ignored in the conversion, z is the next character in the ascii sequence after the highest that is encoded (ie after the y), and the t is both ignored throughout and maps to the 4th character of the !
Don't know if this is coincidental or not, and I'm currently too tired to contemplate much further tonight!
Apologies to anyone who trawled through the essay above btw - seemed a reasonable possibility at the time!
I've gotten a JFIF header out of the \*-` data, but there are still some errors. I'm still just guessing the offset for the fourth character
and the HTT" and o11" data come out IFHF where it should be JFIF, perhaps because I don't know how to interpret the double TT or 11
#!/usr/bin/perl
use strict;
use warnings;
my $seq=<<'END';
`~
1!2@3#4$5%6^7&8*9(0)-_=+
qQwWeErRtTyYuUiIoOpP[{]}\|
aAsSdDfFgGhHjJkKlL;:
'"
zZxXcCvVbBnNmM,<.>/?
END
$seq =~ s/\s+//g;
$/='';
while( <DATA> ){
s/\s+//g;
my $x=substr($_,0,4,"");
open F,">doronb.$." or warn "$x $!";
my $x3 = substr($x,2,1);
(my $s=$seq) =~ s/[\Q$x\E]//g;
my @s = split//,$s;
my %o;
@o{@s}=(0..$#s);
my %s=();
@s{'',split//,$x}=(0,90,18
my $n=0;
while( /([\Q$x3\E]([\Q$x\E]?))|([
if( $1 ){
$n = $s{$2};
}else{
printf F "%c",($o{$4} + $s{$3} + $n)%256;
}
}
close F;
}
__DATA__
*^a/Cb<'
fjdq,XV"
xo;}VBb'?
mzt!,m&m8mqRtm=w6qQ8-)tRm8
\*-`-*CUC{-~9czXz~111~\#~\
OFp{aAdddtoGJgsj}Sds*C*o~:
1`8`~1!2@3#4$5%6*C*9~*19~!
*jUS\$\Q\O5%+qQwWiIoOpPdDf
lxXcCvVbBn/?*~1!2@3#&89(0)
4$5%6*C*9~*1(~!1!@@2@43@@~
d*]i*JqQwWIoOpPDfFgGh:'"zZ
Bn/?*~1!2@3#&89(0)_=+RtTyY
~\Ai*7\4=*$\=\:\My*L*)\#1J
FK@1\jJ\Rg\,\J*|o*x\a+\"*L
IP*^\q*L@>\L\|\B>-*Ik74-\t
+*!*3\l#VH,\Kvm=[Y*I*!*YQ*
R\P\d\{*%\:*J*+\?*xk*JY\b{
*o\s*|*H\q*F*(\Q.\s*|ig*p\
6\|*}\W\0\7@x\cR\(m-*&FG#-
*eD*8\k*=<n5\2\>\w*^e\o2T\
LZ\K\|*8*$JZB\KC*W}*F*Hi\x
.m*h?\H\P*^\'*5\w*^*=j\w\3
O*],4@\gBL\1MC\H*O*KA\g\q\
mF*Y\w*I\!\v*'o\S\x\Fsz*A\
*d*I\W.+9*"f-\>7$_-]\s\gBU
No it isn't cyclic as far as I can see. The first four characters are used for setting up the cypher and the rest are then a direct lookup translation - the long text phrase can be decyphered by using a lookup of:
RTyYuUiIoOpP[{]}\|aAsSdDfF
maps to
!"#$%&'()*+,-./0123456789:
Note the absence of m, z, t and ! from the encrypted side of the cypher table. If you ignore these four whenever they appear it translates correctly to:
This question is interesting. You should keep it open just to see how good is your QwertyEncoding. However, decrypting a JPG file is too much of a bother for someone to answer your question. How about posting just a QwertyEncoded text pharse in plain english?
Unfortunately as the plain text fits just neatly inside the 90 available characters (once you've taken out the 4 in the header) figuring out what to do with the header, and dealing with base messages with a wider range is a lot more tricky. The significance of the ms and the ts throughout the message is still eluding me - we are told they're not dummy characters but what are they! Ever get the feeling you're looking but not seeing? Just eliminating them works for the long text phrase but they must be significant in working on longer segments. The idea of having a message within a message won't shift out of my head for some reason but I don't know why!
duron - thanks for the heads up on the dummys, although to say it describes the basics seems on the generous side! Once I got into trying it out practically all I seemed to do was systematically prove that each section of the theory was false!
ozo - keep up the good work, will pick it up again later I hope but I have to get back to work now before I get fired! Someone's bound to notice I've done nothing for 2 days soon!
Could you give a text example in which all the header characters appear in the text-block itself?
How about an encoding of
!"#$%&'()*+,-./0123456789:
@ABCDEFGHIJKLMNOPQRSTUVWXY
`abcdefghijklmnopqrstuvwxy
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º
_iaxtTyYuUIoOpP[{]}\|AsSdD
*9(0)-=+qQwWeErRtTyYzZXcCv
oOpP[{]}\|AsSdDfFgGhHjJkKl
-<@`yYuUiIoOpP[{]}\|aAsSdD
(0)_=+qQwWeErRtTyYuUzZxXcC
OpP[{]}\|aAsSdDfFgGhHjJkKl
+(rjyYuUiIoOpP[{]}\|aAsSdD
*90)-_=qQwWeERtTyYuUZxXcCv
OpP[{]}\|aAsSdDfFgGhHJkKlL
ta-+yYuUiIoOpP[{]}\|AsSdDf
*9(0)_=qQwWeErRTyYuUZxXcCv
OpP[{]}\|AsSdDfFgGhHjJkKlL
All of the above text blocks are encoded versions of your requested text ozo. However, you will find that only the first three header-characters are in use. An example using all four header-characters would have to include more variation in the target data. >:)
By the way, thank you for your participation in this because this is helping me see all the "holes" in my encoding :)
Ok, that suggests the second header character is a locking shift, not a next character shift as the first header character appears to be when it's not preceded by the third character
It also looks like you omitted the spaces and newlines in my requested text.
But I still need a fourth character example, so how about seeing if an encoding of the following has enough variation:
8÷phé ÄuDD m±Á ý} ù Oѽ` to½Ùªµºk¯Éa Ú;KNÙ,+vx¡µï¹ÆÒAb)è 1S`nµUsL Ó¤ 5°P{ήQ¢üF- ?rcù=[D_ Æ«ëV=`f oq°zÂÌ/h³;D
ï¿ó 1÷ $oÚÞ8,Ö÷ ÿJr¾=9<1¼´ÁCR(çl q?â< @ m9=ë'î {VþI ún®
¦ckcQR¾êkn=3lÏKí9* '©Q¢móÎà çE¢Îܺ&;
Y¦Ú%W½G¡ÎÛ<Á ± 4?$ZËsµlbý ®Ãì¤ü Ïí] áì÷Yßu® £ï ° #Ïoâr'Y Un÷®ãÑnܯ ×±(úuP¢x|²ZâÕ¯¯b d@ÜuÿÑÉWõW@£¡®2kôñk½}½
kQw SOB{Î|k»
ZöH ßy 8Ïd ã
~ùxÓ¤BpÅjô4ÚSFÎ!,Íê
m5àDgzLþ«fô ',æÂ;· ð p«yO8äl\
ò,èxï3 îê c¥Ô[ðD
¸^Ë µ»§µpß ±¯êßí4 òñÁ^ *óÐGXîÑÌSç¹G0 njÒ¤Ðc¶ào©¼À hã.ïcÙ h`z ýø àDñjØcô°T
< } §%ýhïä o6 Òº!jÂÎc1ù¿ú @¸úÆÒà[á°ÑòÐêsÎeû¼Ùßµ¢(«hB
TöP ää;ð³
¤y5¦Z²8 e=O8NaR± ¦ p2u ø Á\Ç 1' PZ Þ2kÇ Ôz[y¥è ó^§z+þ½»Êº;94Zû? _~¥*0¯
*** WARNING: Do not try to decode the text in this post! :WARNING ***
Like I said, thanks ozo, your previous question helped me see a potential hole in the encoding. I think I've managed to improve the encoding chaos factor:
=/#?e7`Wq52+)@$0*~^8^E*6$Q
m:zNbKcVc=!bXz>m";M.LkB#=o
dL'|aJx{]W&Op+(Ui0_Ty8wErP
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Data Length: 189; Encoded Length: 206; Encoding Inflation: 9%
$;#(@w`7~r2`&052%=7Q=%9E0&
VNx'X<v/<Xn$1NV,n$!l/,?"#$
ck\zJCscLZo8+-[)W*t+8euW)q
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Data Length: 189; Encoded Length: 207; Encoding Inflation: 10%
,&#>72`w5`2=@^$0~$^8E-9%Q9
:cznKzcv,!mbx?bm'M,1/lB/#,
s"x'\L'x[J08oW80u+w=t)=we*
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Data Length: 189; Encoded Length: 207; Encoding Inflation: 10%
=#")E~~7Q@@~-55@*77w^99r$_
,XX'nVV?vNN=!x<<N:??<K"=!p
DZZkACC;}88qP00eIqq8Yee0Rt
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Data Length: 189; Encoded Length: 206; Encoding Inflation: 9%
As you can see, the text-blocks are now even more hectic although you will not detect the last header-character being used. I would give an example of the last header-characters being used in my next post.
The text-blocks contained in this post were created by a slightly modified QwertyEncoding so they are not fully compatible with the other text-blocks presented in this thread. Decoding the text-blocks in this post should result in ozo's requested text-string:
!"#$%&'()*+,-./0123456789:
The QwertyEncoding used to encode the text-string is NOT compatible with the one used to encode the original JPEG image and this post serves only as a thank you note to ozo. :)
*** WARNING: Do not try to decode the text in this post! :WARNING ***
>> But I still need a fourth character example, so how about seeing if an encoding of the following has enough variation...
Well, since I know what the fourth character is for, I can tell you now that its not about enough variation so encoding your text example isn't going to help you there >:)
However, as a major hint to what the fourth character is responsible for, imagine an image that has many shapes of SOLID COLOURS. Now, take this image and save its RAW data (i.e. pixel RGB values) to a file. Encoding an image like that with the QwertyEncoder will produce a text-block where the fourth character is used, a LOT :)
As you can see from the previous WARNING post I made four days ago, my QwertyEncoding just got more complex. The last text-block sample contains duplicate characters where the original byte-stream does not. This may prevent the occasional cracker thinking that my encoding is a direct-translation encoding and although this addition inflate the resulting text-block a bit, I think it is worth the extra confusion.
Encoding the JPEG with the new QwertyEncoding now gives a text-block that is about 540 bytes bigger than the JPEG file itself, but for the purpose of this question-thread I will use the older (easier) encoding. Again, thank you ozo. :)
Now... has anyone made any further progress yet?
qwaletee, what can i say.. sorry if it bugs you, but if this lasts 3 months with people who think about this sort of problem as fun and recreation, maybe it'd stand a chance of lasting a month with someone who thinks they can make a profit out of it :)
diegoful, at the moment, i can't really accept any answer but rather split points among the people who are the closest to getting it right, however, i do want to see this through to the end, so it'll stay open.
Diego, you want it kept open so you can work on it, or because you want the final answer?
Doron, I meant no disrespect. If it buged me, I would have just unsubscribed. I'm merely telling you that I don't think anyone is actively working on it, because those who had worked on it stopped, and it is rare for a new person to pick up an EE question if it has been open more than a day or two.
qwaletee, all of your suggestions are valuable and interesting. I posted this question here to sort of gauge the response-time with which a different encdoing scheme is met. I don't know if this is realistic or not because as a friend of mine already told me, "points aren't a stimulating motivation", but until I evaluate your suggestions, I'll keep this open and see if others have anything more to say.
The evil long haired guy is attacking me with his dagger.
http://www.synque.de/doron
I can decrypt the original posted text block as well as the modified variant. I didn't try to decrypt the most recent text-blocks tho. I might redo the decoder and post the source...
Ok synque, here's the newest encoded text-blocks. The first one is the same as the first image I've posted:
qg{jqsg%{qO\_e{|Pft{qt***_
q@lq~xq!'q^q^;zb>q`lMMMq5V
q^`&-{"{qt736Et-k{g%{q80^^
^utQw`~{\q#q7h8q3?wq%<gzgZ
F]|Fua[Jokt$)1e^+7*+@9^e$E
q>g2qxq?q,g4qvg%{qx.dpksGi
$E0W4uu8-%{6{q8-%Etw4`~ew{
!{V?bNq@Zn:MCYK}DRAyhs}Ki\
&r_{qCg2q,g`qZg4qxg2qMqBg@
{gZ^cqlq?g8q^gHBq.3q0gTEgz
gZgz-q^fZn'q0q-gJz9Xg)gfq}
rX{}gP_gTgrgJVg#wqOq$PgJg'
qWgZq[fg=gog0~q^geg7gHqeOl
.gE]q3qu_kq$q(qwgSgigs\qr{
q3AqxSg"qaq0gtgXgaqfqBoq7Z
g2@gFqCgu,glG4qeD[uqz&g'qp
qYqaVgLq3(qF6qzTgWqC'qcg}q
gug(w{q8W^RmQ{5Sg*cgEg[q"d
z{5Y/$@g1g~g!qKq5G\g]bq#iS
g[!q^q@{gYRHz{qVq|uq3qug'k
g*g\aghgCO}q%q6qWg!gonqM+q
NRqX\qYg)qJHgaqQgsg^TqIqN(
This one however, is a bit longer and is a different image:
aiexea:>KJ#re}Jo}ea%rrr#e$
1Bb'a`Vcararn.KXZnea!!!R@e
e<a&:ata3Cea%R-76&3HzEY&&5
5te:XRa)awO`a0z$aQa~i\idi6
}PdHs}g\kQ@6!r$`&%)w(&+8re
n/ei$a.a,i1a>i4eaZU|[LpdoD
T69##E3*e9eaE3*6&%9e:Xa^at
E+e;a@XKBV>a2a!la~ptjI]{|P
UW+ypO^IeaNavi4eac<Z.bXei!
a%aja@ba;i&saka\aS0iPiL&aQ
i#ltpNaM]1iFi@G`o?waIkiDi5
aG&mi}$agi5iHl}*i]a6#iza]a
ij.araMiIeaChL?eda;Qoi;saC
aAata(,eaX~BGreiZ1QigKaEa-
i8a1a]/fdi$aEiGi#a#a#4ikiY
$a_LawijWa8?ea,5$0eQ4M1i9a
)aZi%i`acPiuacW$i]lif?a7a-
rirR?qiwa[N<rYeat\?]i*9yze
ri#aJiRitiPasa\RZ'i:i=iCa0
Oa~iEi!Da8itasCioiL.iTiYHi
_iril[aIak)Fa\DEa<va}7ik[T
c=5,9oBauihti$ciIi:ilgayar
i:'ida%E}iYa$6fiZea+B7"Vet
If you can show some source-code that would decode both of these text-blocks back into their correct images, you'd get your share of the points :)
Open a new question if you want to know how good your improved algorithm is. The question title is "Who's attacking you, and what with?" and in your first comment you explain "Ok, this is attacking as in a game... once you decrypt the text-block, it should be obvious someone is attacking you... Just tell me who (generally) and with what :)". You already got once algorithm change free of charge :P
Just because you asked synque, here's the different question: http://www.experts-exchang
However, I'm sure you'd understand why I need you to show the source code you used in here, and also why it'd be a point-split here as well :)
Synque, the whole point of this excersize was for me to discover how "strong" this encoding is, for that, I need to know how long this actually took to crack, and taking a look into your code would also help in that. However, as I have put that in more obvious terms in the other question I opened, I will split the points and close this question. If you want to answer the other question and get any points for it, you will have to show me your code. :)
Okay, okay, your encryption took me most of yesterday to figure out. I got most of my clues by manually decrypting the English Text-Block.
After that, I decrypted the "old" text-blocks and figured out what the fourth header character does.
I was a bit hesitant to post the source code because I'm still new to C++ and hate showing ugly code. Oh well, here goes nothing:
#include <iostream>
#include <string>
#include <algorithm>
#include <sstream>
#include <fstream>
#include <ios>
using namespace std;
template <class Out>
void decode(const string& s, Out out) {
string cset = "`~1!2@3#4$5%6^7&8*9(0)-_=
char sw_base1 = s[0],
sw_base2 = s[1],
sw_block = s[2],
sw_rle = s[3];
cset.erase(cset.find(sw_ba
cset.erase(cset.find(sw_ba
cset.erase(cset.find(sw_bl
cset.erase(cset.find(sw_rl
int base = 0;
bool in_block = false;
int i = 4;
while (i != s.size())
{
if (sw_block == s[i]) {
base = 0;
in_block = in_block ? false : true;
} else
if (sw_base1 == s[i]) {
base = cset.size();
} else
if (sw_base2 == s[i]) {
base = cset.size()*2;
} else
if (sw_rle == s[i]) {
stringstream ss;
while (s[++i] != sw_rle)
ss << s[i];
int count;
ss >> hex >> count;
fill_n(out, count, cset.find(s[++i]));
}
else {
out++ = base + cset.find(s[i]);
if (!in_block) base = 0;
}
++i;
}
}
int main(int argc, char* argv[])
{
if(argc != 3) {
cout << "QwertyDec\nUsage: qwertydec infile outfile" << endl;
return EXIT_FAILURE;
}
ifstream in(argv[1]);
ofstream out(argv[2], ios::binary | ios::out);
string data;
string x;
while (in >> x)
data += x;
decode(data, ostream_iterator<char>(out
return 0;
}
Binary, Source & Text-blocks: http://www.synque.de/qwert
No, it decodes the English text-block starting with [mzt!,], the jpeg image starting with with [\*-`], and the single words you posted. If you remove the code dealing with
header character 3 and 4 it could also decode the first two text-blocks you posted - starting with [HTT"] and [o11"].
I didn't even try to decrypt the most recent incarnation of your cipher. If I do, I'll post in your other thread.
Well, I found your question right after I joined EE (february) and tried decoding the text-block for half an hour. Back then I noticed that you use the
first two characters as a kind of "control characters". I forgot about your thread while I was trying to get my premium membership, however.
I read most of the thread before trying to decode it on sunday. Your hints were helpful, but maybe not in the way you intended. For example the
knowledge that you spelled the words LOVE, MONEY and TIME in capital letters was very helpful. I think the most helpful thing was the English
text-block. I dunno how long it'd have taken me to decode the JPG directly.
Business Accounts
Answer for Membership
by: snoyes_jwPosted on 2005-02-14 at 12:29:22ID: 13307914
A cave troll with a heavy cudgel. And he's not so much attacking as expressing his opinion. Perhaps some active listening would help.
Is this attacking as in a game, or attacking as in DoS/virus/password hack?