Bug #10915 | AES_Decrypt() returns NULL values | ||
---|---|---|---|
Submitted: | 27 May 2005 13:08 | Modified: | 14 Sep 2005 23:10 |
Reporter: | Martins Brivnieks | Email Updates: | |
Status: | Won't fix | Impact on me: | |
Category: | MySQL Server | Severity: | S3 (Non-critical) |
Version: | mysql-standard-4.1.7; 4.1.14-nt | OS: | pc-linux-i686-icc-glibc23, Windows |
Assigned to: | Jim Winstead | CPU Architecture: | Any |
[27 May 2005 13:08]
Martins Brivnieks
[2 Sep 2005 10:13]
Valeriy Kravchuk
Thank you for your bug report. I tried a simplified test on latest 4.1.14: mysql> Set @key='F696282AA4CD4F614AA995190CF442FE'; Query OK, 0 rows affected (0.00 sec) mysql> select AES_Decrypt(AES_Encrypt('abcdefghijklmnopqrstuvwxwz1234567890', Un Hex(@key)), UnHex(@key)); +------------------------------------------------------------------------------- -------------+ | AES_Decrypt(AES_Encrypt('abcdefghijklmnopqrstuvwxwz1234567890', UnHex(@key)), UnHex(@key)) | +------------------------------------------------------------------------------- -------------+ | abcdefghijklmnopqrstuvwxwz1234567890 | +------------------------------------------------------------------------------- -------------+ 1 row in set (0.00 sec) mysql> select AES_Decrypt(AES_Encrypt('abcdefghijklmnopqrstuvwxwz123456789012345 67890123456789012345678901234567890', UnHex(@key)), UnHex(@key)); +------------------------------------------------------------------------------- -----------------------------------------------------+ | AES_Decrypt(AES_Encrypt('abcdefghijklmnopqrstuvwxwz123456789012345678901234567 89012345678901234567890', UnHex(@key)), UnHex(@key)) | +------------------------------------------------------------------------------- -----------------------------------------------------+ | abcdefghijklmnopqrstuvwxwz12345678901234567890123456789012345678901234567890 | +------------------------------------------------------------------------------- -----------------------------------------------------+ 1 row in set (0.00 sec) mysql> select version(); +-----------+ | version() | +-----------+ | 4.1.14-nt | +-----------+ 1 row in set (0.03 sec) So, looks like data decrypted correctly for me, for lenght > 16 too. Please, check in on newer version of MySQL and give a (simple) repeatable test case if the problem still exists.
[2 Sep 2005 13:40]
Martins Brivnieks
i have tryed with 4.1.13a - same result :( http://www.superfm.lv/m/MySQL/dump.frm http://www.superfm.lv/m/MySQL/dump.MYD http://www.superfm.lv/m/MySQL/dump.MYI udachi
[2 Sep 2005 14:24]
Valeriy Kravchuk
OK, i'll try with your new files. But have you tried my simple select on 4.1.13? What are the results?
[2 Sep 2005 15:24]
Martins Brivnieks
yes, simple examples work but my data in table is binary data crypted with binary key
[4 Sep 2005 15:14]
Hartmut Holzgraefe
Can you please add queries showing the eratic behavior with the files you provided? I think it will be hard to do anything without knowing the key used ...?
[5 Sep 2005 6:37]
Martins Brivnieks
from first post :) http://www.superfm.lv/m/MySQL/AES_Decrypt_with_not_NULL.sql
[5 Sep 2005 7:23]
Valeriy Kravchuk
Please, try the following test, based on my previous one: mysql> Set @key='F696282AA4CD4F614AA995190CF442FE'; Query OK, 0 rows affected (0.03 sec) mysql> Set @val='F696282AA4CD4F614AA995190CF442FE01010101010101010ABCDEF'; Query OK, 0 rows affected (0.00 sec) mysql> select length(@val); +--------------+ | length(@val) | +--------------+ | 55 | +--------------+ 1 row in set (0.00 sec) So, the value is longer that 16 bytes. mysql> select Hex(AES_Decrypt(AES_Encrypt(UnHex(@val), UnHex(@key)), UnHex(@key))); +----------------------------------------------------------------------+ | Hex(AES_Decrypt(AES_Encrypt(UnHex(@val), UnHex(@key)), UnHex(@key))) | +----------------------------------------------------------------------+ | 0F696282AA4CD4F614AA995190CF442FE01010101010101010ABCDEF | +----------------------------------------------------------------------+ 1 row in set (0.01 sec) So, I've got the same result I encrypted (note the leading zero - I used 55 hex digits, but each byte is rtepresented by 2 hex digits). mysql> select version(); +----------------+ | version() | +----------------+ | 5.0.12-beta-nt | +----------------+ 1 row in set (0.00 sec) Looks like it works as expected (on 5.0.12). Try it on your version, please.
[5 Sep 2005 8:01]
Martins Brivnieks
youre example works allso on 4.1.7-standard have you tryed import table in your db: http://www.superfm.lv/m/MySQL/dump.frm http://www.superfm.lv/m/MySQL/dump.MYD http://www.superfm.lv/m/MySQL/dump.MYI and run: http://www.superfm.lv/m/MySQL/AES_Decrypt_with_not_NULL.sql
[6 Sep 2005 14:38]
Valeriy Kravchuk
I was able to repeat the bug with the dump table mentioned in the last note. I stopped the server, copied the files to my data/test directory, started the server and, in the test database I performed: mysql> Set @key='F696282AA4CD4F614AA995190CF442FE'; Query OK, 0 rows affected (0.00 sec) mysql> Set @MyCrStr=AES_Encrypt('texttexttext',UnHex(@key)); Query OK, 0 rows affected (0.00 sec) mysql> SELECT packet_binary,length(mid(packet_binary,5))/16 as LEN, -> hex(AES_Decrypt(mid(packet_binary,5,16),UnHex(@key))) as h1,hex(AES_Decrypt(mid(packet_binary,5,32),UnHex(@key))) as h2,hex(AES_Decrypt(mid(packet_binary,5,48),UnHex(@key))) as h3 -> ,hex(AES_Decrypt(mid(packet_binary,5,64),UnHex(@key))) as h4,hex(AES_Decrypt(mid(packet_binary,5,80),UnHex(@key))) as h5,hex(AES_Decrypt(mid(packet_binary,5,96),UnHex(@key))) as h6 -> ,hex(AES_Decrypt(mid(packet_binary,5,112),UnHex(@key))) as h7#,hex(AES_Decrypt(mid(packet_binary,5,128),UnHex(@key))) as h8,hex(AES_Decrypt(mid(packet_binary,5,144),UnHex(@key))) as h9 -> ,hex(Replace(AES_Decrypt(Concat(mid(packet_binary,5),@MyCrStr),UnHex(@key )),'text','')) as DecryptedStr -> FROM `dump` T -> LIMIT 1; +------------------------------------------------------------------------------- ---------------------------------------+------+--------------------------------- -+------+------+------+------+------+------+------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------------------------------+ | packet_binary | LEN | h1 | h2 | h3 | h4 | h5 | h6 | h7 | DecryptedStr | +------------------------------------------------------------------------------- ---------------------------------------+------+--------------------------------- -+------+------+------+------+------+------+------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------------------------------+ R | 7.00 | 00540067158F74EE00A5170200000000 | NULL | NULL | NULL | NULL | NULL | NULL | 00540067158F74EE00A517020000000050A5DBB0817051C90000000110100048130 74505018600889AB5C08EEECE77CFEFC6028A2CF404F5B7466A4DF19D1D224E7BE6F970F53A08D97 21A558C7CFF70170C0C84A14DD3F28B4822B4E843CE286F14E1871AB4348BFFFFFFFFFFFFFFFF | +------------------------------------------------------------------------------- ---------------------------------------+------+--------------------------------- -+------+------+------+------+------+------+------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------------------------------+ 1 row in set (0.00 sec) mysql> SELECT packet_binary,length(mid(packet_binary,5))/16 as LEN, -> hex(AES_Decrypt(mid(packet_binary,5,16),UnHex(@key))) as h1,hex(AES_Decry pt(mid(packet_binary,5,32),UnHex(@key))) as h2,hex(AES_Decrypt(mid(packet_binary ,5,48),UnHex(@key))) as h3 -> ,hex(AES_Decrypt(mid(packet_binary,5,64),UnHex(@key))) as h4,hex(AES_Decr ypt(mid(packet_binary,5,80),UnHex(@key))) as h5,hex(AES_Decrypt(mid(packet_binar y,5,96),UnHex(@key))) as h6 -> ,hex(AES_Decrypt(mid(packet_binary,5,112),UnHex(@key))) as h7#,hex(AES_De crypt(mid(packet_binary,5,128),UnHex(@key))) as h8,hex(AES_Decrypt(mid(packet_bi nary,5,144),UnHex(@key))) as h9 -> ,hex(Replace(AES_Decrypt(Concat(mid(packet_binary,5),@MyCrStr),UnHex(@key )),'text','')) as DecryptedStr -> FROM `dump` T -> LIMIT 1; +------------------------------------------------------------------------------- ---------------------------------------+------+--------------------------------- -+------+------+------+------+------+------+------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------------------------------+ | packet_binary | LEN | h1 | h2 | h3 | h4 | h5 | h6 | h7 | DecryptedStr | +------------------------------------------------------------------------------- ---------------------------------------+------+--------------------------------- -+------+------+------+------+------+------+------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------------------------------+ R | 7.00 | 00540067158F74EE00A5170200000000 | NULL | NULL | NULL | NULL | N ULL | NULL | 00540067158F74EE00A517020000000050A5DBB0817051C90000000110100048130 74505018600889AB5C08EEECE77CFEFC6028A2CF404F5B7466A4DF19D1D224E7BE6F970F53A08D97 21A558C7CFF70170C0C84A14DD3F28B4822B4E843CE286F14E1871AB4348BFFFFFFFFFFFFFFFF | +------------------------------------------------------------------------------- ---------------------------------------+------+--------------------------------- -+------+------+------+------+------+------+------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------------------------------+ 1 row in set (0.00 sec)
[9 Sep 2005 20:01]
[ name withheld ]
Hi is there any update on this bug?. Is it affecting any other version of mysql other than 4.1.7 and 4.1.14-nt? I am having the same problem with 4.1.7, I just need to know if I can get around this problem by switching to newer version and if yes, which version. Thanks
[14 Sep 2005 23:10]
Jim Winstead
The problem is the way that MySQL's AES_ENCRYPT() and AES_DECRYPT() handle the padding of the data to create a complete blocksize. AES_DECRYPT() extracts the length of the padding from the last bytes of the decoded data. Because the example query is attempting to pass individual blocks to AES_DECRYPT(), those blocks which have a last byte with a value greater than 16 are seen as invalid data, so NULL is returned. MySQL's AES_DECRYPT() is not able to handle the data encrypted by the external program because it is not using a similar method to encode the padding in the final block.
[15 Sep 2005 6:49]
Martins Brivnieks
RE: MySQL's AES_DECRYPT() is using diferent method to encode the padding in the final block. that is an other problem: to mede correct outgoing data i have to: 1. before AES_DECRYPT add at the end of data some fake data Concat(Data,UnHex(Repeat('F',30))) 2. AES_DECRYPT(data+fake data) 3. cut last 16 of crypted string Left(CryptedData,Length(CryptedData)-16) onlly then i can get CryptedData which can be encrypted by another programm