当前位置: 首页 > 后端技术 > Python

爬虫逆向基础,理解SM1-SM9、ZUC国密算法

时间:2023-03-26 15:34:35 Python

关注微信公众号:爬虫K哥,QQ交流群:808574309,继续分享高级爬虫、JS/Android逆向等技术干货!【01x00】简介国密是国家密码管理局认可的国产加密算法。爬虫工程师在做JS逆向时,会遇到各种加密算法,其中RSA、AES、SHA等算法最为常见。算法都是国外的,在K哥之前的文章中也介绍过:《【爬虫知识】爬虫常见加密解密算法》其实从2010年开始,中国国家密码管理局就陆续发布了一系列国产加密算法,包括SM1和SM2、SM3、SM4、SM7、SM9、ZUC(祖冲的加密算法)等,SM代表商业机密,即商业加密,是指用于商业的加密技术,不涉及国家机密。SM1和SM7的算法没有公开,其余算法已经成为ISO/IEC国际标准。在这些国产加密算法中,SM2、SM3、SM4这三种加密算法是比较常见的。在爬一些gov网站的时候也可能会遇到这些算法,所以作为一个爬虫工程师,了解这些算法是很有必要的。如下图,某政府网站使用SM2和SM4加密算法:【02x00】算法概述算法名称算法类别应用领域特点SM1对称(组)加密算法芯片组长度和密钥长度均为128位SM2非对称(数据encryptionbasedonellipticcurve(ECC)加密算法ECCellipticcurvecryptographymechanism256bits,比RSA更快的处理速度和更少的消耗SM3散列(hash)函数算法完整性校验安全性和效率等同于SHA-256,压缩功能更多复杂的SM4对称(组)加密算法数据加密与局域网乘积组长,密钥长度为128位,计算轮数较多SM7对称(组)加密算法非接触式IC卡组长,密钥长度为128位SM9IdentityEncryptionAlgorithm(IBE)端到端离线安全通信加密强度相当于3072位密钥RSA加密算法orithmZUC对称(串口)加密算法移动通信4G网络流密码[03x00]算法详解[03x01]SM1包加密算法SM1是块加密算法,对称加密,块长和密钥长度都是128位,所以在加密和解密一个消息,如果消息长度太长,需要分组,如果消息长度不够,需要填充。算法的安全保密强度和相关软硬件性能等同于AES。算法不公开,仅以IP核的形式存在于芯片中。调用算法时,需要通过加密芯片的接口调用。该算法已开发。系列芯片、智能IC卡、智能密码钥匙、加密卡、加密机等安全产品广泛应用于电子政务、电子商务和国民经济的各个应用领域(包括国家政务通信、警务等重要领域沟通)。很少有人知道,爬虫工程师也不会遇到这种加密算法。[03x02]SM2椭圆曲线公钥加密算法SM2是一种椭圆曲线(ECC)公钥加密算法,非对称加密,SM2算法和RSA算法都是公钥加密算法,SM2算法是一种比较先进和安全的算法,在它用于替代我国商业加密系统中的RSA算法,在很多政府网站上都可以看到这类加密算法。我国学者从20世纪80年代开始研究椭圆曲线密码学,并取得了很多成果。SM2椭圆曲线公钥密码算法与RSA算法相比有以下优点:SM2RSA安全性256位SM2强度已超过RSA-2048通用算法基本结构椭圆曲线(ECC)基于特殊可逆模幂计算复杂度全指数子-指数存储空间(密钥长度)192-256bit2048-4096bit秘钥生成速度比RSA算法快一百多倍解密较慢速度一般较快[03x03]SM3哈希算法SM3是一种密码哈希算法,采用密码哈希(hash)函数标准,用于替代MD5/SHA-1/SHA-2等国际算法。它是在SHA-256的基础上改进实现的一种算法,消息组长度为512位,摘要值长度为256位,其中使用了异或、取模、模加、移位、与、或,和非操作,它由填充、迭代过程、消息扩展和压缩功能组成。在商用密码系统中,SM3主要用于数字签名与验证、消息认证码生成与验证、随机数生成等,根据国家密码管理局的说法,其安全性和效率高于MD5算法和SHA-1算法,它相当于SHA-256。【03x04】SM4数据包加密算法SM4是无线局域网标准数据包加密算法,对称加密,用于替代DES/AES等国际算法,SM4算法和AES算法密钥长度和数据包长度相同,都是128位,因此,在对消息进行加解密时,如果消息长度过长,需要进行分组,如果消息长度不够,则需要进行填充。加密算法和密钥扩展算法均采用32轮非线性迭代结构,解密算法与加密算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。SM4DESAES计算轮数3216(3DES为16*3)10/12/14密码组件S-box、非线性变换、线性变换、合成变换标准算术逻辑运算,先替换再置换,不包括线性变换S-box、行移位变换、列混合变换、加圆键变换(AddRoundKey)[03x05]SM7块加密算法SM7是一种块加密算法,对称加密,算法不公开,应用包括身份识别应用(非接触式IC卡、门禁卡、工作证、参展证件等)、票务应用(大型活动门票、展会门票等)、支付及卡类应用(积分消费卡、校园卡、企业卡等)。爬虫工程师基本上不会遇到这样的算法。[03x06]SM9身份加密算法SM9是基于身份的密码学(Identity-BasedCryptography),非对称加密,身份加密利用用户的身份(如微信ID、邮箱、手机号、QQ号等)作为公钥,省略了交换数字证书和公钥的过程,使安全系统易于部署和管理,适用于互联网应用的各种新兴应用的安全保障,如基于云的密码服务、电子邮件安全、智能终端防护、物联网安全、云存储安全等。这些安全应用可以使用手机号码或邮箱地址作为公钥,实现数据加密、身份认证、通话加密、信道加密等。在商业加密中系统中,SM9主要用于用户身份认证。据新华网公开报道,SM9的加密强度相当于3072位密钥的RSA加密算法。【03x07】ZUC祖冲之算法ZUC是一种对称加密的流密码算法。该保密算法可应用于3GPPLTE通信中的加密和解密。该算法包括祖冲之算法(ZUC)、保密算法(128-EEA3)和完全性算法(128-EIA3)三部分。已被国际组织3GPP推荐为第三套4G无线通信国际加密和完整性标准的候选算法。【04x00】编程语言实现【04x01】Python语言实现Python中没有官方库实现国密算法。这里只介绍两个比较完善的第三方库。需要注意的是,SM1和SM7算法并不公开,目前大多数库只实现了三种密码算法:SM2、SM3和SM4。snowland-smx-python:https://gitee.com/snowlandltd...gmssl:https://github.com/duanhongyi...gmssl-python:https://github.com/gongxian-d...其中,gmssl-python是gmssl的改进版,gmssl-python增加了对SM9算法的支持,但是截至发稿,gmssl-python还没有发布pypi,也没有PR到gmssl,安装gmssl使用pipinstallgmssl不支持SM9算法。如果想使用SM9算法,可以下载gmssl-python源码,手动安装。以gmssl的SM2算法为例,实现如下(其他算法及详细用法请参考其官方文档):SM2加密(encrypt)和解密(decrypt):fromgmsslimportsm2#16进制公钥andprivatekeyprivate_key='00B9AB0B828FF68872F21A837FC303668428DEA11DCD1B24429D0C99E24EED83D5'public_key='B9C9A6E04E9C91F7BA880429273747D7EF5DDEB0BB2FF6317EB00BEF331A83081A6994B8993F3F5D6EADDDB81872266C87C018FB4162F5AF347B483E24620207'sm2_crypt=sm2.CryptSM2(public_key=public_key,private_key=private_key)#待加密数据和加密后数据为bytes类型data=b"thisisthedatatobeencrypted"enc_data=sm2_crypt.encrypt(data)dec_data=sm2_crypt.decrypt(enc_data)print('enc_data:',enc_data.hex())print('dec_data:',dec_data)#enc_data:3cb96dd2e0b6c24df8e22a5da3951d061a6ee6ce99f46a446426feca83e501073288b1553ca8d91fad79054e26696a27c982492466dafb5ed06a573fb09947f2aed8dfae243b095ab88115c584bb6f0814efe2f338a00de42b244c99698e81c7913c1d82b7609557677a36681dd10b646229350ad0261b51ca5ed6030d660947#dec_data:b'这是要加密的数据'SM2签名(sign)和验证(verify):fromgmsslimportsm2,func#16进制的公钥和私钥private_key='00B9AB0B828FF68872F21A837FC303668428DEA11DCD1B24429D0C99E24EED83D5'public_key='B9C9A6E04E9C91F7BA880429273747D7EF5DDEB0BB2FF6317EB00BEF331A83081A6994B8993F3F5D6EADDDB81872266C87C018FB4162F5AF347B483E24620207'sm2_crypt=sm2.CryptSM2(public_key=public_key,private_key=private_key)#待签名数据为bytes类型data=b"thisisthedatatobesigned"random_hex_str=func.random_hex(sm2_crypt.para_len)#hexadecimalsign=sm2_crypt.sign(data,random_hex_str)verify=sm2_crypt.verify(sign,data)print('sign:',sign)print('verify:',verify)#sign:45cfe5306b1a87cf5d0034ef6712babdd1d98547e75bcf89a17f3bcb617150a3f111ab05597601bab8c41e2b980754b74ebe9a169a59db37d549569910ae273a#verify:True【04x02】JavaScript语言实现在JavaScript中已有比较成熟的实现库,这里推荐sm-crypto,目前支持SM2、SM3和SM4,需要注意WhatisinterestingisthattheresultofSM2asymmetricencryptionconsistsofthreeparts:C1,C2,andC3,whereC1isthecalculatedellipticcurvepointforgeneratingrandomnumbers,C2istheciphertextdata,andC3isthesummaryvalueofSM3.TheresultsoftheencryptionstandardarestoredintheorderofC1C2C3,andthenewstandardisstoredintheorderofC1C3C2.sm-cryptosupportssettingcipherMode,whichisC1C2C3排序sm-crypto:https://www.npmjs.com/package...以SM2算法为例,实现如下(其他算法及详细用法请参考其官方文档):SM2加密(encrypt)和解密(decrypt):constsm2=require('sm-crypto').sm2//1-C1C3C2,0-C1C2C3,defaultis1constcipherMode=1//获取密钥对letkeypair=sm2.generateKeyPairHex()letpublicKey=keypair.publicKey//公钥letprivateKey=keypair.privateKey//私钥letmsgString="这是要加密的数据"letencryptData=sm2.doEncrypt(msgString,publicKey,cipherMode)//加密结果letdecryptData=sm2.doDecrypt(encryptData,privateKey,cipherMode)//解密结果console.log("encryptData:",encryptData)console.log("decryptData:",decryptData)//encryptData:ddf261103fae06d0efe20ea0fe0d82bcc170e8efd8eeae24e9559b3835993f0ed2acb8ba6782fc21941ee74ca453d77664a5cb7dbb91517e6a3b0c27db7ce587ae7af54f8df48d7fa822b7062e2af66c112aa57de94d12ba28e5ba96bf4439d299b41da4a5282d054696adc64156d248049d1eb1d0af28d76b542fe8a95d427e//解密数据:这是要加密的数据SM2签名(sign)并校验(verify):constsm2=require('sm-crypto').sm2//获取密钥对letkeypair=sm2.generateKeyPairHex()letpublicKey=keypair.publicKey//公钥letprivateKey=keypair.privateKey//私钥//纯签名+生成Elliptic曲线点letmsgString="thisisthedatatobesigned"letsigValueHex=sm2.doSignature(msgString,privateKey)//signatureletverifyResult=sm2.doVerifySignature(msgString,sigValueHex,publicKey)//签名校验结果console.log("sigValueHex:",sigValueHex)console.log("verifyResult:",verifyResult)//sigValueHex:924cbb9f2b5adb554ef77129ff1e3a00b2da42017ad3ec2f806d824a77646987ba8c8c4fb94576c38bc11ae69cc98ebbb40b5d47715171ec7dcea913dfc6ccc1//verifyResult:true【04x03】其他语言实现以及参考资料Java语言实现:https://github.com/bcgit/bc-c...https://github.com/xjfuuu/SM2...Go语言实现:https://github.com/tjfoc/gmsm开源国密算法工具箱:http://gmssl.org/国密算法源码下载:http://www.scctc.org.cn/templ...国家密码管理局:https://www.sca.gov.cn/密码标准化委员会:http://www.gmbz.org.cn/【05x00】附录:GM/T密码行业标准GM/T0001.1-2012:祖冲之时序密码算法:第1部分:算法说明GM/T0001.2-2012:祖冲之序贯密码算法:第2部分:基于祖冲之算法的机密性算法GM/T0001.3-2012:祖冲之序贯密码算法:第3部分:基于祖冲之算法的完整性算法GM/T0003.1-2012:SM2椭圆曲线公钥密码算法第1部分:通用GM/T0003.2-2012:SM2椭圆曲线公钥密码算法第2部分:数字签名算法GM/T0003.3-2012:SM2椭圆曲线公钥密码算法第3部分:密码密钥交换协议GM/T0003.4-2012:SM2EllipticCurvePublicKeyCryptographyAlgorithmPart4:PublicKeyCryptographyAlgorithmGM/T0003.5-2012:SM2EllipticCurvePublicKeyCryptographyAlgorithmPart5:ParameterDefinitionGM/T0004-2012:SM3密码哈希AlgorithmGM/T0002-2012:SM4BlockCipherAlgorithmGM/T0044.1-2016:SM9IdentificationCryptographicAlgorithmPart1:GeneralGM/T0044.2-2016:SM9IdentificationCryptographicAlgorithmPart2:数字签名atureAlgorithmGM/T0044.3-2016:SM9身份密码算法第3部分:密钥交换协议GM/T0044.4-2016:SM9身份密码算法第4部分:密钥封装机制和公钥加密算法GM/T0044.5-2016:SM9身份密码算法第5部分:参数定义

最新推荐
猜你喜欢