- From: Donald E. Eastlake 3rd <dee3@torque.pothole.com>
- Date: Tue, 08 Jan 2002 09:37:11 -0500
- To: Christian Geuer-Pollmann <geuer-pollmann@nue.et-inf.uni-siegen.de>
- cc: Dan Lanz <lanz@zolera.com>, xml-encryption@w3.org, reagle@w3.org, blaird@microsoft.com
This is a good point... The best solution seems to be to sign the data inside the encryption. But we might as well recommend blocksize-1 length nonces for CBC as that's the best you can do and should certainly add enough entropy... Donald From: Christian Geuer-Pollmann <geuer-pollmann@nue.et-inf.uni-siegen.de> Date: Fri, 04 Jan 2002 14:16:42 +0100 In-reply-to: <3C34AB3F.F6F3215B@zolera.com> To: Dan Lanz <lanz@zolera.com>, xml-encryption@w3.org, reagle@w3.org, blaird@microsoft.com Message-id: <836488354.1010153802@crypto> >Hi Dan, > >the xenc:EncryptedData/@Nonce attribute like described in the spec is NOT a >fully-working solution against IV-Attacks. Even while using a Nonce, an >attacker can modify encrypted contents without knowing the key if he can >make a good guess about the plaintext. In short, the number of modifyable >bytes is: > >modifyableByteLength = blockLength - (nonceLength % blockLength) > >Example AES (blockLength = 16 bytes) > >nonceLength | modifyableByteLength(nonceLength) >-------------+----------------------------------- > 0 | 16 bytes > 1 | 15 bytes > 2 | 14 bytes > 3 | 13 bytes >... > 15 | 1 bytes > 16 | 16 bytes > 17 | 15 bytes > 18 | 14 bytes > >This attack works because the decryptor has no way to detect that the IV or >bytes inside a complete Nonce block are tampered. (Yes, I know that >encryption does not provide integrity, but in the past it was argued that >the Nonce solves the IV-attack problem). In the spec, we have to following >sentence (section 6.3): > > "Some encryption algorithms take an initialization > vector (IV) such that an adversary modifying the > IV can make a known change in the plain text after > decryption. This attack can be avoided by securing > the integrity of the plain text data, for example > by signing it, or, for most such algorithms, by > including an algorithm dependent length. A nonce > at least as long as the block for CBC chaining > block encryption algorithms may be adequate." > >Well, today I've learned that only nonce values of (n * blocklength - 1) >are 'secure' and this only if you encrypt an Element (because in this case >only the 1st byte can be modified and this is the '<' sign which MUST be >the first if you have Element content). > >Example below shows how this looks like; I encrypt the contents of the root >element which is only a Text node (luckily of length = blocklength ;-))) In >the example I changed "1 USD " to "999.999.999 EUR ". > > >- Plaintext ------------------------------------------------ > ><!-- AES-Key is in hex "000102030405060708090a0b0c0d0e0f" ><!-- 1 --> ><root>1 USD </root> ><!-- 2 --> > >- Original ciphertext -------------------------------------- > ><!-- AES-Key is in hex "000102030405060708090a0b0c0d0e0f" ><!-- 1 --> ><root><xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" >Id="myFirstEncryptedElement" Nonce="32" >Type="http://www.w3.org/2001/04/xmlenc#Content"> ><xenc:EncryptionMethod >Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"></xenc:EncryptionMe >thod> ><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> ><ds:KeyName>Christian Geuer-Pollmann</ds:KeyName> ></ds:KeyInfo> ><xenc:CipherData> ><xenc:CipherValue>xk0dIDXBBtpMGasfZFQXegnju13ya7MMSMZvwBKycKJ+AzhsG7D/dPK6l >qy1aRFxzIdIfGON9Zl+ >prptdMSo+ob76T3CY1bHPQhGjQQmnEA=</xenc:CipherValue> ></xenc:CipherData> ></xenc:EncryptedData></root> ><!-- 2 --> > >- modified ciphertext -------------------------------------- > ><!-- AES-Key is in hex "000102030405060708090a0b0c0d0e0f" ><!-- 1 --> ><root><xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" >Id="myFirstEncryptedElement" Nonce="32" >Type="http://www.w3.org/2001/04/xmlenc#Content"> ><xenc:EncryptionMethod >Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"></xenc:EncryptionMe >thod> ><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> ><ds:KeyName>Christian Geuer-Pollmann</ds:KeyName> ></ds:KeyInfo> ><xenc:CipherData> ><xenc:CipherValue>xk0dIDXBBtpMGasfZFQXegnju13ya7MMSMZvwBKycKJ2GlQRZqnmeuujj >6zQHGNxzIdIfGON9Zl+ >prptdMSo+ob76T3CY1bHPQhGjQQmnEA=</xenc:CipherValue> ></xenc:CipherData> ></xenc:EncryptedData></root> ><!-- 2 --> > >- resulting plaintext -------------------------------------- > ><!-- AES-Key is in hex "000102030405060708090a0b0c0d0e0f" ><!-- 1 --> ><root>999.999.999 EUR </root> ><!-- 2 --> > >------------------------------------------------------------
Received on Tuesday, 8 January 2002 09:40:12 UTC