Reasoning by Lego: A wrong way to think about cryptography
cryptofails.com
cryptofails.com
If you use a higher-level crypto API like libsodium/NaCl then you can treat functions like lego blocks just fine.
I've been talking in #php.security on Freenode with ircmaxell and a few others about making a pluggable high-level PHP library that abstracts all the lego blocks away and just gives a sane interface. (Note: This is mostly ircmaxell's idea, I just offered a draft for the API layout.)
For example:
$c = new \Crypto\Symmetric('openssl:cipher=aes-128;mode=cbc;hash=sha256');
$k = $c->generateKey();
$cipher = $c->encrypt("Some message", $k);
Omitting any of these parameters (e.g. just passing 'openssl:') should have sane, opinionated defaults that prioritize security. Developers will NOT be allowed to use ECB mode.The idea is that it should support multiple "drivers" (openssl, libsodium, possibly a begrudging mcrypt inclusion).
PDO : databases :: this idea : cryptography
The roadmap looks like this:
1. a PHP implementation/PoC
2. a PECL extension
3. a RFC and pull request to make it part of the PHP 7.1 core
We already have password_hash() and password_verify(), there's no reason we can't abstract a typical use-case away from the average PHP developer and prevent them from implementing it themselves, horribly.Can someone explain this:
> Let’s ignore the fact that it’s using MCRYPT_RIJNDAEL_256 (the 256-bit block version of Rijndael, not AES) instead of MCRYPT_RIJNDAEL_128 (real AES),
When I look at those enum names I would immediately think that MCRYPT_RIJNDAEL_256 was stronger than MCRYPT_RIJNDAEL_128. The naming strongly suggests the same algorithm but _256 being stronger.
Is this part of an API design issue?
https://paragonie.com/blog/2015/05/if-you-re-typing-word-mcr...
I wouldn't go out of my way to use it, but I flinched a little when this report suggested its use was a vulnerability. I don't think 32 byte blocks are much better than 16 byte blocks, but 16 byte blocks are much, much better than 8 byte blocks, and so I feel like I should be consistent.
That does not appear to be the case this time, however, since the page acknowledges (in an update) "256 bit block" and the fact that it isn't AES. So I should probably make note of that in the CryptoFails post.
I'm unsure how well the analysis of AES (and the attacks against it) carry over to Rijndael-256, so I'd be hesitant to actually recommend it without asking a cryptographer... but, like you, I'd be very surprised if it was a source of vulnerability itself.
There are probably zero crypto implementations that that contain the string "AES" that use Rijndael-X/256 that aren't broken in some other comical way.
Are all the studies on the 128-bit block variant of Rijndael (the one christened as AES) also applicable to the 256-bit block variant? I don't know the answer to this question.