I would like to offer a 20 BTC bounty for the following: a Javascript implementation of BIP 38 private key decryption, released with an open source license, so anybody can use it on their own web sites.
BIP 38:
https://en.bitcoin.it/wiki/BIP_0038I have already written functioning reference code in C#, the flow can be taken verbatim, you may freely take or incorporate any part of the code. This code will run under Windows .NET, as well as under Linux and Mac OS X using Mono. Although the ability to create intermediate codes and addresses would be nice and won't be much work beyond the decryption part, the bounty can be collected in full with just the ability to decrypt all variants of BIP38-encrypted private key.
That reference code I wrote:
https://github.com/casascius/Bitcoin-Address-UtilityThe UI can be minimal, just two text boxes, one to take the private key and the other to take the passphrase. When you click a button, the page should either decrypt the private key into some element on the screen, or report that the encrypted private key is invalid (e.g. fails base58 checksum or formatting rules), or that the passphrase is incorrect (if the key is well-formatted but the decryption with the provided passphrase fails to produce a bitcoin address matching the embedded address checksum)
I actually anticipate that this won't be too difficult, and would do it myself other than I think it'll get done sooner if I post a bounty.
The winning solution needs to properly handle the compressed private key flag, as well as the variants of encryption that include and exclude the elliptic curve multiplication step as well as the flag that turns on the presence of a sequence number.
If I were doing it, I'd probably start with much of the code and/or the same dependencies that are used in bitaddress.org, so the basics of handling bitcoin addresses, private keys, base58, elliptic curve points, etc. are already taken care of. Add scrypt and AES, and perhaps support for decompressing EC points if that's not already there.
The GOAL is so that others who currently accept unencrypted private keys, can easily switch to accepting encrypted private keys as well, just by dropping in a couple of .js files and letting the client browser do all the decryption.