The Thecus firmware is actually a tarball but encrypted with DES. Interesting enough, the key for the DES encryption is actually the model number: n1200 for my box and n2100 for another model.

To do DES encryption/decryption, it is best with OpenSSL. But OpenSSL asks for keys in 64-bit binary form. To make that, you have to use the function call:

#include <openssl/des.h>
void* DES_string_to_key(const char* string, DES_cblock* key)

The DES_cblock is actually a 8-byte array of characters. So below is my program for the string-to-key convertor (OpenSSL library required):

/* string2key: String to DES key
 * written by Adrian Sai-wah Tam
 * Thu Aug  9 17:27:33 HKT 2007
 *
 * Compile with
 *   gcc -o string2key string2key.c -lssl
 */
#include <openssl/des.h>
#include <stdio.h>

int main(int argc, char** argv)
{
    DES_cblock key;
    int j;
    if (argc != 2) {
        printf("Synopsis:\n");
        printf("    %s [string]\n",argv[0]);
        printf("It will give the DES key from string using the OpenSSL's DES_string_to_key()\n");
        return 1;
    };
    DES_string_to_key(argv[1], &key);
    printf("DES_string_to_key(%s) = ",argv[1]);
    for (j=0;j<8;j++) {
        printf("%02x",key[j]);
    };
    printf("\n");
    return 0;
};

Hence you will see:

$ ./string2key n1200
DES_string_to_key(n1200) = 578991a8c84a5b0d

At the time of writing, a beta version of the N1200 firmware is out on Thecus’ website: http://www.thecus.com/Downloads/beta/n1200upgrade.1.0.07.2.bin

We can decode it into tarball using the following command, with the key found above:

$ openssl enc -d -des -in n1200upgrade.1.0.07.2.bin \
  -out n1200upgrade.1.0.07.2.tar.gz -K 578991a8c84a5b0d \
  -iv 0 -nosalt -nopad

And it is what inside the tarball:

$ tar ztf n1200upgrade.1.0.07.2.tar.gz
upgrade/
upgrade/rc
upgrade/diff
upgrade/ca-bundle.crt
upgrade/conf.db
upgrade/pre_message
upgrade/hdroot.new.md5
upgrade/up.sh
upgrade/u-boot.version
upgrade/u-boot.bin
upgrade/u-boot.bin.md5
upgrade/hdroot.new.gz
upgrade/scsi.agent
upgrade/server.crt
upgrade/server.key
upgrade/uramdisk
upgrade/httpd.conf
upgrade/passwd
upgrade/ssl.conf
upgrade/uImage
upgrade/version
upgrade/up2.sh
upgrade/rc.factory
upgrade/manifest.txt
upgrade/uImage.md5
upgrade/php.ini
upgrade/crond.conf
upgrade/uramdisk.md5
upgrade/hdroot.new.gz.md5
upgrade/conf.db.awk

gzip: stdin: decompression OK, trailing garbage ignored
tar: Child returned status 2
tar: Error exit delayed from previous errors