SM4 ECB到底能否用于加密手机号码和身份证号码?
原创
利刃信安
利刃信安
利刃信安
2026年10月22日 07:30
北京
去阅读
SM4 ECB到底能否用于加密手机号码和身份证号码?
对于这个问题,行业里面各专家众说纷纭,仁者见仁,智者见智。
抛开感性谈理性,我们用数据来说话。
首先,问题开始之前,我们需要达成一个共识,针对应用的数据解密攻击情形假设,我们有一个应用入口,可以输入明文构造密文,我们虽然不知道密钥,但是可以通过明密文构造字典。在此基础下,我们获取了某密文,问,通过密文获取明文的难度有多大?
先说手机号码,只以中华人民共和国境内手机号码为例。
ECB工作模式的特征是将明文分组直接作为算法的输入,相同的明文分组(使用相同的密钥)总是生成相同的密文分组,这意味着两个相同的明文块会产生相同的密文块,容易被攻击者建立\"明文-密文\"字典进行识别。
手机号的特点是格式固定、数值空间有限——11位数字,前三位为号段,全国实际在用的号码池规模远小于随机空间。若用ECB加密存储,数据库中大量手机号的明文差异很小、重复度高,攻击者拿到密文后很容易通过已知明文攻击和统计比对还原出手机号。
假设某系统用 SM4-ECB(SM4 分组长度 128 比特 = 16 字节)加密用户手机号。手机号 11 位数字,以 ASCII 表示不足 16 字节,需填充到分组整数倍。为了便于说明,这里用 16 字节的固定格式存储手机号(如\"手机号+补齐字节\")。
相同的明文分组总是生成相同的密文分组,这使得它容易遭受字典攻击——字典由对应的明文和密文分组构成;当敌手得到多个明文密文对时,可进行已知明文攻击。
手机号只有11位数字,第一位不能为0,实际有效组合约 9×10^10 ≈ 10^11 种(不到1000亿)。攻击者可以自己不断注册/添加记录,让自己知道越来越多的手机号对应哪个密文,逐步把字典填大。因为ECB同明文必同密文,凡是字典里已有的手机号,在数据库密文列中出现相同密文的记录,明文就能直接确定。
根据保留格式加密标准,手机号的空间大小有两种口径:
口径A:完整11位十进制数的空间
我国手机号为11位十进制数,若要求加密结果为11位十进制数,则格式空间大小为 N 约1千亿种组合
口径B:合法手机号的空间
若要求加密后仍是合法的手机号(前3位为网络识别号130~199、中间4位为地区编码、后4位为顺序号),则空间约 70亿种组合。
手机号实际数量级约为 10^11(按11位十进制全空间)或 10^10(约数百亿个合法号码,考虑实际号段占用)。
如果攻击者想建立完整的\"明文→密文\"字典,最合理的口径是枚举全部合法手机号,即约 70亿(7×10^9)个。
枚举速率取决于攻击者的算力,用硬件或GPU做SM4加密,速率大致如下:
估算所需时间,以合法手机号 7×10^9 为例:
若按全空间 10^11 计算,则时间约为上表的10倍(如GPU约700秒、单机约7~70小时)。
在合法手机号空间(7×10^9)下,一台普通PC约 2小时,一块GPU约 1分钟到几秒钟就能穷尽整个手机号空间建立字典。
也就是说,ECB加密的手机号字典攻击在分钟到小时级别就能完成,成本极低。
再来看身份证号码,还是以中华人民共和国境内身份证号码为例。
根据 GB 11643-1999《公民身份号码》及保留格式加密标准,公民身份号码由十七位数字本体码和一位数字校验码组成,共18位,排列顺序为:六位地址码 + 八位出生日期码 + 三位顺序码 + 一位校验码。
保留格式加密标准针对身份证号给出了两种格式编码方式(对应不同的应用需求)。
口径A:要求加密结果能通过身份号码校验
前17位本体码可任取 0000…0 到 9999…9(校验位由前17位算出),空间大小为 约10的17次方。
口径B:要求同一地区的号码仍属该地区且能通过校验
六位地址码固定(属于同一地区),后11位(出生日期8位+顺序码3位)可任取,空间大小为 10^11。
身份证号 vs 手机号 vs 16字节随机数的空间对比
- 身份证号空间(10^17)比手机号空间(10^11)大10^6倍(100万倍),但在实际应用中远小于16字节随机数空间(2^128 ≈ 10^38),差距达约10^21倍。
- 身份证号的真实有效空间通常更小——出生日期码限定在真实日期(约0.5亿~1亿个合法日期)、地区码限定在现有行政区划,因此实际可枚举的身份证号远小于10^17的理论上限。
取一款典型配置(如 MateBook,Intel i5/i7 或同级处理器,2~4 GHz,多核)。在纯软件(无硬件加速指令)条件下:
SM4 单核软件实现加密速率约 100~500 Mbps(软件实现,受限于无专用 AES/SM4 指令集,取中间值约 200 Mbps);
由于字典攻击(用候选明文加密并比对密文)可多线程并行,普通笔记本 4~8 核全部投入,总速率可达到约 1 Gbps 量级。
SM4 分组长度 128 比特(16 字节)。按 1 Gbps 折算每秒可处理约 7.8×10^6 块/秒,即约 780 万次加密/秒(保守取 约 10^7 次/秒)。
手机号码(空间 7×10^9)形成明密文字典只需要12分钟。
身份证号码同一地区(10^11)形成明密文字典只2.8小时
而16字节随机数(空间 2^128 ≈ 3.4×10^38)形成明密文字典约 10^24 年——远超宇宙年龄(约 1.4×10^10 年)约 10^14 倍,物理上不可能完成。
通过数据计算,大家应该有直观认知,如果使用一台普通笔记本电脑,不论是手机号码还是身份证号码均可以很容易构造字典进行密文猜解,均不适合使用ECB工作模式。
ECB的适用场景是短数据块,而非数据库字段加密
标准明确指出,ECB模式\"适用于加密较短的数据块,例如对会话密钥的加密保护\";\"对于超过一个分组长度的明文一般建议不使用ECB工作模式\";ECB的典型应用为\"单个数据的安全传输\"\"短消息的加密传输(如一个加密密钥)\"。
手机号这类数据库敏感字段的加密,标准推荐使用保留格式加密(FPE):密文与明文具有相同的类型、长度等格式,加密后不改变数据库字段的类型,\"适用于数据库加密中对个人身份证号、手机号、信用卡号等敏感字段信息进行加密的场景\"。
同理,身份证号属于数据库中需要长期存储的个人敏感字段,应采用保留格式加密(FPE)处理,而不是ECB。
若加密目的仅是一次性传输(非存储),可使用 CBC/CTR 等带初始向量(IV)的模式,避免相同明文产生相同密文,从而防止已知明文攻击。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论