views:

174

answers:

7

Project Euler

I have recently begun to solve some of the Project Euler riddles. I found the discussion forum in the site a bit frustrating (most of the discussions are closed and poorly-threaded), So I have decided to publish my Python solutions on launchpad for discussion.

The problem is that it seems quite unethical to publish these solutions, as it would let other people gain reputation without doing the programming work, which the site deeply discourages.

My Encryption problem

I want to encrypt my answers so that only those who have already solved the riddles can see my code. The logical key would be the answer to the riddle, which is always numeric.

In order to prevent brute-force attacks on my answers, I want to find an encryption algorithm that takes a significantly long time (few seconds) to run.

Do you know any such algorithm? I would fancy a Python package, which I can attach to the code, over an external program that might have portability issues.

Thanks,

Adam

+1  A: 

Yes, you can do this with virtually any symmetric encryption algorithm: DSA, or AES, for example; just use the integer as the key, and pad the key out to the required length of the encryption algorithm's key, and use that key to decrypt the answer.

Keep in mind that if you extend a short key, the encryption won't be very good. The strength of the encryption has a lot more to do with key length and the algorithm itself than how long it takes to run.

This question seems to have some examples of libraries to use with python.

WhirlWind
Reason for downvote?
WhirlWind
A: 

Just use triple DES and use different keys for each iteration, use the number to generate a each of the 3 keys. Pad up the key length with some text, and you're good.

Tripple DES was designed to increase effectiveness against brute force.

It's not the world's most secure option, but I'll keep most bruter's at bay.

Aren
+1  A: 

If you encrypt your answers, those who have solved the problem simply do not want to see your answers with such effort, provided that they already have plenty of answers to see in the answer page. Those who haven't cannot see. Then your work becomes less useful.

Btw, there are many places providing answers to Project Euler, e.g. Haskell answers, Clojure answers, F# answers. If somebody only wants the answer to a question, he/she could simply run the program. Provided that Python is so popular, google "Python Euler xx" would give you plenty of blogs solving a specific problem.

Yin Zhu
It's right for the simple problems, but there are significantly less solutions to the complicated ones. Other than that, I'm loking for a `python decrypt.py --problem=123 --key="1234567"' mechanism, which is quite simple.
Adam Matan
@Adam. If you really want to promote your solutions and reach more audience, you'd better start with no encryption. One thing I can guarantee you is that few experienced users (with >200 solved problems) will `submit` solutions to your answer set to get checked to get your answer.
Yin Zhu
+4  A: 

It sounds like people will have to write their own decryption utility, or use something off-the-shelf, or use off-the-shelf components to decrypt your posts.

PBKDF2 is a standardized algorithm for password-based key derivation, defined in PKCS #5. Basically, you can tune "iterations" parameter so that deriving the key from a password (the answer to the Euler problem) would take several seconds. The key can then be used for any common symmetric encryption algorithm, like AES-128.

This has the advantage that most crypto libraries already support PBKDF2. In fact, you might find mail clients that support password-based encryption for S/MIME messages. Then you could just post an S/MIME and people could read it with the mail client. Unfortunately, my mail client (Thunderbird) only supports public-key encryption.

erickson
+2  A: 

I think Yin Zhu pegged the social aspect of it and Whirlwind the technical. Using your preferred approach of:

python decrypt.py --problem=123 --key=1234567

the key number is readily available to Google, and even without that, slamming through a million keys (assuming a median key length of 5 decimal digits yields less than 20 bits of key) is pretty fast. If I wanted to be more clever I could use plain-text assumptions (e.g. import, for) and vastly reduce my search space.

For all the trouble you're probably best off using something really complicated like:

>>> print codecs.getencoder('rot_13')('import codecs')[0]
vzcbeg pbqrpf 

And if you want the solution to Project Euler problem 123, you'll have to beat it out of me...

msw
Oh, and the secret key to this symmetric encryption algorithm is `rot_13`, but don't tell anyone...
msw
A: 

The simplest approach would be to hash the answer using a secure hash function such as SHA-1, then provide the hash so users can verify their answer. If you want to make brute-forcing more difficult, iterate the hash - eg, provide the result of n recursive applications of SHA1, where n is some parameter you choose to make it difficult to brute-force.

If the number of possible answers is small, though, it'll be difficult to impossible to prevent someone from brute-forcing it even with an expensive hash function.

Edit: Sorry, I misread your original question. If you want to encrypt your answer, you could do that by using the resulting hash, above, as the encryption key for your answer, rather than posting the hash.

Nick Johnson
A: 

If you want an encryption routine that is easy to use and distribute, I recommend Paul Rubin's p3.py. It's probably on the fast side, for how secure it is, but since you seem to be in need of a hurdle to be jumped rather than a siege-resistant wall, it may be a good choice for your purposes.

You could also look into rijndael.py, which is an implementation of AES, and slower than p3.py.

John Y