My guess is that you have a miscompiled losetup utility. Most losetups compiled with glibc 2.0 are broken, because glibc changed the size of dev_t without bothering to supply a linux/loop.h replacement (struct loop_info contains dev_t). Compiled with a 32bit dev_t you really need set lo_encrypt_type, and the kernel obviously doesn't know how to deal with lo_encrypt_type 2048.

Unfortunately there is no easy way to fix losetup without introducing glibc version dependencies, because glibc offers no public function to convert its dev_t (from its stat wrapper) into a kernel dev_t.