AI手机网,短视频直播 硬改改机 一键新机 群控软件 刷机定制

 找回密码
 立即注册
搜索
查看: 2511|回复: 3

TuxeraNTFS的密钥生成算法

[复制链接]
发表于 2018-7-12 13:25:24 | 显示全部楼层 |阅读模式
这是我自己逆向出来的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-xxxxx
Format列中的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的区别在于:
    • 在变种Base32中,代换表为0123456789ACDEFGHJKLMNPQRTUVWXYZ;而在标准Base32中,代换表为ABCDEFGHIJKLMNOPQRSTUVWXYZ234567。
    • 当5比特长的编码单元跨过了某个字节时,交换编码单元中在该字节和下一字节的两个部分。
      例如:
      如果有两字节的待编码数据——10111010 11110100——那么在变种Base32中编码单元为10111 11010 11010 00000,而在标准Base32中编码单元为10111 01011 11010 00000;即标准Base32中01011编码单元的两部分——010和11——在变种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上看,我也特地写了一个中文版,方便大家看懂。
发表于 2018-7-31 16:35:29 | 显示全部楼层

就算花钱可以下载我也不带水的
发表于 2018-9-2 20:51:19 | 显示全部楼层
学习学习,谢谢分享………………
发表于 2020-7-6 14:12:00 | 显示全部楼层
66666666666666666666666666666666666666
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

技术交流售后群

QQ|小黑屋|手机版|站点找错-建议|AI手机网 |Sitemap



GMT+8, 2024-3-29 17:11 , Processed in 0.147118 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表