这是我自己逆向出来的TuxeraNTFS的密钥生成算法,大家可以看看,如果有问题欢迎评论。
1. Tuxera NTFS是什么Tuxera NTFS是个可用于内部和外部存储、经过性能优化,具备容错性和完全兼容性的文件系统解决方案。Tuxera NTFS已经在市场上一些最新的高端电视、电视机顶盒、智能手机、平板电脑、路由器、网络附属存储和其他设备上使用。Tuxera NTFS目前适用于安卓和其他Linux平台、还有QNX、WinCE Series 40、Nucleus RTOS和 VxWorks等。Tuxera同时也适用于许多构架,如ARM、MIPS、PowerPC、SuperH和x86等。 2. 激活密钥是如何生成的?在Tuxera NTFS中有两类激活密钥,它们分别是 Key Type Key Length Format
Long Product Key34 charsxxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx
Short Product Key23 charsxxxxx-xxxxx-xxxxx-xxxxxFormat列中的x字符代表的是下面编码表中的字符: // defined in CustomBase32Encode function, helper.c file.const char SubstitutionTable[33] = "0123456789ACDEFGHJKLMNPQRTUVWXYZ";其中\0字符并不包含在其中。 下文将只会介绍长激活密钥的生成算法。 2.1 长激活密钥是如何生成的?Tuxera NTFS是使用 ECC (Elliptic-curve Cryptography) 来生成长激活密钥的。 其中用到的曲线为secp112r1,是基于有限域  的曲线,方程为 其中 使用的基点  为 基点  的阶为 Tuxera NTFS将官方ECC公钥写在了/Library/PreferencePanes/Tuxera\ NTFS.prefPane/Contents/MacOS/Tuxera\ NTFS二进制文件中,具体的值为 目前我并不知道对应的私钥  是什么。在这里我们必须写一个patcher,将当中的公钥替换。 以下将说明长激活密钥是如何生成的: - 生成一个大数
,其中 必须满足 。
- 计算
。
- 准备好一个buffer uint8_t bin_rG[2][14]。将大数
和 按照 大端字节序 分别写入到bin_rG[0] 和 bin_rG[1]中。如果大数没有14个字节,则在高位补“0”字节即可。
准备好一个buffer uint8_t Hash[5]。用argon2_hash函数计算bin_rG的哈希,这个函数的定义可在argon2中找到。 argon2_hash(1, 1 << 16, 1, bin_rG, sizeof(bin_rG), salt, sizeof(salt), Hash, sizeof(Hash), NULL, 0, Argon2_d, ARGON2_VERSION_13);其中salt为 const uint8_t salt[16] = { 0xa1, 0x38, 0x11, 0x98, 0x12, 0x2f, 0x28, 0xee, 0x2c, 0x3a, 0xa0, 0x57, 0xbd, 0xcf, 0x2d, 0x83 };计算完成后,清除Hash[4]的低两位。换句话说执行Hash[4] &= 0xFC;。
- 将Hash(5字节)按 大端字节序 转化为一个大数
。
准备好一个buffer uint8_t bin_s[14]。计算 并将 按照 大端字节序 写入到bin_s中。同样如果大数不满14字节,则在高位补“0”字节。
- 将bin_s(14字节)和Hash(5字节)拼接,则会得到uint8_t key_data[14 + 5],其中key_data的前14字节为bin_s。
使用变种Base32编码方式编码key_data,然后你可以得到prekey_str字符串(包含31个字符)。变种Base32和标准Base32的区别在于: - 在prekey_str中,最后一个字符肯定是'0',因为Hash[4]的低两位被清空了。移除掉这个字符,那么prekey_str的长度就变为30个字符了。
- 将prekey_str倒序。然后按照每6个字符分块,总共分成5块。将这个5块用英文连字符'-'连接就可以得到长激活密钥。
3. 激活密钥是如何被验证的?3.1 长激活密钥是如何被验证的?- 将长激活密钥解码成19字节长的key_data
- 将key_data的前14字节和后5字节按照 大端字节序 转化成大数
和 。
- 计算
并将结果按照 大端字节序 写入到uint8_t bin_R[2][14]中,同样若大数不满足14字节则在高位补“0”字节。
- 使用argon2_hash函数计算bin_R的哈希uint8_t Hash[5]。
- 检查Hash是否与key_data的后5字节相同。如果相同则长激活密钥有效,反之无效。
为什么?因为如果长激活密钥是有效的,则必有 成立,所以key_data的后5字——bin_rG的哈希——必然与Hash相同:这是长激活密钥有效的必要条件。如果不等,则长激活密钥必然不是合法的激活密钥。
关于TuxeraNTFS的算法注册机,我已经公布在了我的github上
https://github.com/DoubleLabyrinth/TuxeraNTFS-keygen
编译教程和使用方法就不在这里写了,大家可以去github上看,我也特地写了一个中文版,方便大家看懂。
|