- 作者:
- 分类:知识&开发->协议&标准->其它
- 阅读:1555
- 点赞:1
- 版权:CC BY-SA 4.0
- 创建:2019-10-12
- 更新:2020-09-15
原文链接(持续更新):https://neucrack.com/p/2
组成
IMEI 由 15 位 0-9 的十进制数字组成,根据 IMEI 国际标准, IMEI可分为 TAC(Type Allocation Code,型号分配码)、序列号和校验位三个组成部分,其编号格式如下:
TAC-型号分配码(8位) | 序列号(6位) | 校验位(1位) |
---|---|---|
NNXXXXXX | ZZZZZZ | A |
TAC 的组成及含义
如上图所示,TAC 由 8 位数字组成,实际上目前所有 IMEI审核机构均是对 TAC 进行核发与管理。
TAC 前 2 位“NN”为审批机构标识码,通过不同的号码代表不同的 TAC 审批机构。目前 BABT 的审批机构标识码为“35”,即核发以“35”开头的 TAC;TAF 的审批机构标识码为“86”,即核发以“86”开头的TAC。TAC 后 6 位“XXXXXX”为审批机构定义的移动终端型号标识码。序列号的组成及含义
IMEI 的 9-14 位 数 字 “ ZZZZZZ ” 为 产 品 序 列 号 , 代 表“000000-999999”共 100 万个编号,企业根据实际生产需要对某个固定型号的终端设备进行分配。因此,企业为每个型号所申请的 TAC 可以被用于同型号的 100 万台终端上,当一个型号的终端产量超过 100 万台时,需再次申请另外的 TAC。根据 GSMA 发布的 TS.06 (DG06)IMEI Allocation and Approval Guidelines v8.0(《IMEI 号分配和审批指导文件》)相关要求,自 2015 年 6月 22 日起,一个 TAC 只能对应一个产品型号。校验码的含义
校验码(Check Digit)可通过 Luhn 公式(ISO/IEC 7812)计算得到,具体计算方法参考 3GPP TS 23.003 中附录 B 的要求。校验码用于企业对 IMEI 所有其他数字进行校验,目前暂不被运营商所使用。
校验位算法
15位IMEI
比如:123456781234568
(当然这只是方便识别举得例子不是实际的码,实际的需要按照要求申请TAC)
- 定义第一位位偶数位
- 则先计算所有偶数位之和为eSum
- 所有奇数位×2,然后取个位和十位的数值之和,比如11取值位2,24取值位6,然后累加和位oSum
total = oSum+eSum
, 如果值为0,则校验位为0,否则取10减去total的个位数值,比如12346则取值4,12340则取值0
python代码:
def IMEI_checksum(tac_number, serial_number):
imei_str = "%08d%06d" %(tac_number, serial_number)
i = 0
eSum = 0
oSum = 0
for num in imei_str:
if i%2 == 0:
eSum += int(num)
else:
tmp = int(num)*2
tmp = tmp//10 + tmp%10
oSum += tmp
i += 1
total = oSum + eSum
checkSum = 0
if total%10 != 0:
checkSum = 10 - total%10
imei_str += str(checkSum)
return imei_str
tac = 12345678
serial_number = 0
for i in range(0,50):
print(IMEI_checksum(tac,serial_number+i))