"""
Author: tanglei
DateTime:2024-11-18 完成
微信:ciss_cedar
欢迎一起学习
"""
import re
from datetime import datetime
from sm3_apply import sm3_hash
#key 16进制 16字节密钥
#T-参与运算的时间因子(5.2.1的计算结果);
#C-参与运算的事件因子,表示为一个4字节整数; 2^32
#Q --鉴别双方通过协商输入的挑战因子(或其他类型参与运算的因子),使用ASCII码表示
#N 动态口令长度最小为6
#Period otp 周期,60代表60秒有效
def gen_otp(Key,T,C,Q,N,Period=60):
"""
:param key:key 16进制 16字节密钥
:param T:T-参与运算的时间因子,传入当前时间
:param C:参与运算的事件因子,表示为一个4字节整数; 2^32,
:param Q:鉴别双方通过协商输入的挑战因子可以和平台协调一个随机数
:param N:动态口令长度最小为6
:param Period:otp 周期,60代表60秒有效
:return:
"""
t = calculate_t(T,Period)
id = calculate_id(t,C,Q)
s = calculate_s(Key, id)
od = calculate_od(s)
p = calculate_p(od,N)
return p
def calculate_t(input_time:datetime,Period=60):
# 获取当前时间的UTC秒数(从某个固定时间点,通常是1970年1月1日00:00:00开始)
c_seconds=input_time.timestamp()
c_seconds=int(c_seconds)
# 由于我们只需要一个周期内的递增值,我们可以对当前时间秒数进行模运算
# 这里我们假设period是60秒或30秒等,确保它不大于60秒
t = c_seconds // Period # 使用整除来获取当前周期内的“序号”
# 如果需要,可以对time_factor进行进一步处理,比如转换为8字节整数格式(这里简单返回)
return t
def calculate_id(T=None, C=None, Q=None):
if C is not None and len(str(C))==0:
C=None
if Q is not None and len(str(Q))==0:
Q=None
if T is None and C is None:
raise ValueError("At least one of T or C must be provided.")
# Convert integers to byte representation
if C is not None:
C_bytes = C.to_bytes(4, 'big') # 4 bytes for a 32-bit integer
else:
C_bytes = b''
# Ensure Q is a string and contains at least 4 characters
if Q is not None:
if not isinstance(Q, str) or len(Q) < 4:
raise ValueError("Q must be a string with at least 4 characters.")
# Convert Q to byte representation using ASCII
#将难以识别的字符(例如空格)或容易混淆的字符(例如数字1和字母1、数字0和字母O、字符’和字符、。替换为空字符
pattern = re.compile(r"[ 1I0O'、]", flags=re.IGNORECASE)
Q = pattern.sub('', Q)
Q_bytes = Q.encode('ascii')
else:
Q_bytes = b''
# Convert T to byte representation (assuming it's a string and using UTF-8 encoding)
if T is not None:
T=str(T)
T_bytes = T.encode('utf-8')
else:
T_bytes = b''
# Combine the bytes
combined_bytes = T_bytes + C_bytes + Q_bytes
# Pad with '0' (null bytes) to ensure the length is at least 16 bytes (128 bits)
while len(combined_bytes) < 16:
combined_bytes += b'\x00'
# Ensure the length is exactly 16 bytes by truncating if necessary
id = combined_bytes[:16]
# Convert the final byte sequence back to a hexadecimal string for easy viewing (optional)
# final_hex = combined_bytes.hex()
return id
def calculate_s(key,id):
key=bytes.fromhex(key)
input=key+id
input=input.hex()
s=sm3_hash(input)
return s
def calculate_od(s:str):
"""
8个整数相加,并截断为32比特。
"""
# 计算8个整数的和
s1 = int(s[0:8],16)
s2 = int(s[8:16],16)
s3 = int(s[16:24],16)
s4 = int(s[24:32],16)
s5 = int(s[32:40],16)
s6 = int(s[40:48],16)
s7 = int(s[48:56],16)
s8 = int(s[56:64],16)
sum_s = s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8
# 截断为32比特
od = sum_s % (2 ** 32)
return od
def calculate_p(od, n):
"""
生成动态口令
od (int): 一次性中间值,n (int): 动态口令的位数,应不小于6
返回:str: 动态口令(十进制数字字符串)
"""
if n < 6:
raise ValueError("动态口令的位数应不小于6")
# 计算动态口令
password = od % (10 ** n)
# 将数字转换为字符串并返回
return f"{password:0{n}d}"
def main():
# 示例使用
period = 60 # 口令变化周期,单位为秒
input_time=datetime.now()
t = calculate_t(input_time,period)
print(f't={t}')
# Example usage:
T = t#"202310011230" # Example time factor
C = 1357924681 # Example event factor 事件因子
Q = "ABCD1234" # Example challenge factor 挑战因子
id = calculate_id(T=T, C=C, Q=Q)
print(f'id={id.hex()}') # Print in hexadecimal for easy verification
# pattern = re.compile(r"[ 1I0O'、]", flags=re.IGNORECASE)
# Q = pattern.sub('', Q)
# print(Q)
key='2934412A66B7A186DC35DC40E926F9EE'
s=calculate_s(key,id)
print(f's={s}')
od=calculate_od(s)
print(f'od={od}')
n=6
p=calculate_p(od, n)
print(f'p={p}')
T=datetime.now()
N=6
otp=gen_otp(key,T,C,Q,N,Period=60)
print(f'otp={otp}')
if __name__ == '__main__':
main()
相关推荐
国密动态令牌java实现(SM3/SM4 OTP)
国密动态口令java实现(SM3/SM4 OTP)
python3使用国密SM3加密
SM3算法是一种国产密码散列函数标准,与MD5、SHA1、SHA256类似。
Python实现SM3算法完整源代码及讲解
b) 如果输入消息的长度超过448比特,则在消息末尾添加一个比特“1”,再添加若干个比特“0”,直到数据块长度模512比特余数为0,即长度为448+512k(k为非负整数)比特。其中,符号“+”表示模232加法,FF0和FF1是非线性变换,具体实现详见代码中的函数FF0()和FF1(),P0是一种非线性变换,具体实现详见代码中的函数P0()。a) 如果输入消息的长度不超过448比特,则在消息末尾添加一个比特“1”,再添加若干个比特“0”,直到数据块长度为448比特;c) 对于i=0, 1, …
国密算法 SM3 消息摘要 杂凑算法 哈希函数 散列函数 python实现完整代码
国密算法 SM2 公钥加密 非对称加密 数字签名 密钥协商 python实现完整代码 依次分享完SM2和SM4的python实现代码,今天分享SM3
Python实现国家商用密码算法sm2/sm3/sm4/sm9(国密)
2010 年开始,我国国家密码管理局就已经开始陆续发布了一系列国产加密算法,这其中就包括 SM1、SM2、SM3 、SM4、SM7、SM9、ZUC(祖冲之加密算法)等,SM 代表商密,即商业密码,是指用于商业的、不涉及国家秘密的密码技术。SM1 和 SM7 的算法不公开,其余算法都已成为 ISO/IEC 国际标准。目前应用较多的是SM2、SM3和SM4算法,这三者用法不一。
【信息科学与工程学】【安全领域】第一百四十二篇 零信任网络解决方案中的算法04
对于节点 i, 有功和无功功率平衡方程为: Pi=Vi∑j=1NVj(Gijcosθij+Bijsinθij), Qi=Vi∑j=1NVj(Gijsinθij−Bijcosθij)。下风向某点 (x,y,z)的浓度 C为: C=2πuσyσzQexp(−2σy2y2)[exp(−2σz2(z−H)2)+exp(−2σz2(z+H)2)], 其中 Q是源强, u是风速, H是有效源高, σy,σz是水平和垂直扩散参数。
密码技术应该怎么用第四天!
哪些密码算法不再安全,不能再使用,怎么才能防重复,给出一个接口定义的样例,特别适用于系统之间的交互,同时完成,机密性,完整性,真实性,当前如果非要不可否认性,必须考虑非对称算法如sm2的sign作为mac的值,如果需要法律效力就必须引入合规的证书。本次考虑纯粹的接口定义,不使用sm2模式。在后续中会将15843实体鉴别时再讨论。
Python中使用GMSSL库进行SM3计算
GMSSL(也称为国密SSL)是一个基于OpenSSL的国密密码学库,提供了对国家密码算法标准的支持。使用上述代码示例,您可以轻松地在Python中使用GMSSL库进行SM3计算。根据您的需求,您可以将其集成到您的项目中,并根据需要进行相应的修改和优化。要在Python中使用GMSSL库进行SM3计算,需要先安装GMSSL库。根据实际情况,您可能需要根据数据的类型和格式进行适当的编码。请注意,为了计算SM3哈希值,我们需要将数据转换为字节类型。函数,该函数接受一个字符串类型的数据作为输入,并使用。
嵌入式设备安全合规:先御OS如何从裸奔到等保2.0达标
在物联网与工业数字化加速落地背景下,嵌入式设备的安全合规已从可选项变成硬性门槛。传统裸机或裁剪Linux系统普遍缺乏权限隔离、安全启动、审计追溯等基础防护,难以满足等保2.0物联网扩展要求及行业审计规范。操作系统层面的整体安全设计成为关键解法:通过信任链安全启动、国密算法适配、日志审计与远程上报、A/B分区升级回滚等模块化能力,设备厂商无需自研安全框架即可获得合规基座。此类方案适用于网关、边缘计算盒子、工业控制器等中高算力场景,既能降低过检成本,又能支撑多行业复用。先御OS作为专用嵌入式操作系统,以标准化安
Protege新手入门:5分钟搞定本体建模基础(附实战案例)
本文为Protege本体建模新手提供了一份快速入门指南。通过构建一个关于“披萨”的实战案例,详细讲解了从环境准备、定义核心类(Classes)、建立对象属性(Object Properties)到设置数据属性(Data Properties)和创建个体的完整流程。文章旨在帮助读者绕过复杂理论,在5分钟内直观掌握本体建模的基础操作,快速建立知识图谱构建的信心。
片上眼图(Eye-opening monitor)
当它们值不同的时候error counter +1,通过统计RX到的码元个数、error counter,可以获得offset sampler上下左右不停的调整位置时的一个误码率(BER),通过这个误码率去描绘出眼图。如上图所示,eye-scan RX端 offset sampler独立且并行的和使用CDR sample的采样电路一起跑,offset-sampler可以任意调整水平(time)和垂直(voltage)方向的偏移(如下图所示),在一个UI内产生一个全新的sample点。
SM3 python代码
实际上sm3是一个哈希加密算法,也就是能加密,但是不能解密,不管多长的串扔进去都是64位十六进制数,相同的内容加密后得到的结果必然相同。(所以说看到文心一言说到对称加密就可以判定它在胡说八道了)问了问文心一言SM3是什么,我觉得它在胡说八道,贴出来给大家看看(放图片是怕污染大家的搜索)
别再瞎调了!STM32 Systick延时函数避坑指南(正点原子、野火、慧净代码对比)
本文深入解析STM32 Systick延时函数的实现差异与优化策略,对比正点原子、野火、慧净等主流方案的优缺点。针对us和ms级延时精度问题,提供避坑指南和高级优化技巧,帮助开发者根据项目需求选择最佳方案,提升嵌入式系统的定时控制精度。
SM3算法Python实现(无第三方库)
首先对SM3杂凑算法进行了介绍,之后用Python进行了实现,最后结合标准文档的测试用例进行正确性验证。结果表明,我们的代码能正确的执行。
ABAP 平台下配置 OAuth 2.0 Authorization Code 授权类型的完整指引
本文是面向ABAP管理员和SAP开发者的OAuth 2.0授权码配置实战指南。文章详细介绍了在ABAP平台启用Authorization Code的完整流程,包括前置条件检查(如TLS配置和系统用户准备)、SOAUTH2事务码中各字段配置要点(授权类型启用、Redirect URI设置、授权码有效期等)、Scope分配规则以及验证方法。通过一个销售订单OData接口的实际案例,说明了如何将抽象规范转化为具体配置。最后提供了多种验证方式(事务码测试、端点测试和Postman测试)以及关键配置参数(如授权码有效
使用YubiKey进行全盘加密、加密启动分区以及利用UEFI安全启动的详细指南
在本教程中,我们将使用YubiKey来增强电脑的安全性,通过加密整个硬盘,确保只有持有正确YubiKey的人才能访问。UEFI安全启动是一种在UEFI固件级别实施的安全标准,确保计算机仅启动签名的启动加载程序。为了符合您的要求,我将以此方式分配内容,确保每部分都有详尽的说明和代码。现在,您已经成功地使用YubiKey设置了全盘加密,并使用UEFI安全启动为系统增加了额外的安全层。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。
python实现sm3算法
背景 sm3密码杂凑算法是中国国家密码管理局颁布的一种密码Hash函数,它与sm4分组密码、sm2椭圆曲线公钥密钥一起都是中国商用密码的重要组成部分。 SM3密码Hash算法的输入数据长度为 l 比特,1≤ l ≤ 264-1,输出Hash值的长度为256比特。 1.常量与函数 SM3密码Hash函数使用以下常数与函数。 (1)常量 初始值IV=7380166f 4914b2b9 172442d7...
YOLO26改进策略【卷积层】| SPD-Conv 针对小目标和低分辨率图像的检测任务
SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。
SM3、SM4算法学习记录(包含算法过程及相应代码 python语言)
假设消息m的长度为l比特。首先将比特“1”添加到消息的末尾,再添加k个“0”,k是满 足l+1+k≡448mod512的最小的非负整数(其实也就是满足(l+1)%512+k = 448)。填充后的消息m′的比特长度为512的倍数。将填充后的消息m按照512比特(64字节)进行分组,每个分组标记为B[0]、B[1]、B[2]......B[n-1],n=(l+k+65) / 512。目的:将每个B[i]经过扩展后化为132个字,分别为W0,W1,···,W67,W′ 0,W′ 1,···,W′ 63。
大模型产品Deepseek(七)、可视化本地知识库搭建详细教程(Cherry Studio)
Cherry Studio 为智能体的开发提供了一个强大的可视化平台,结合大模型和嵌入式知识库,它可以在多个应用场景中提供智能化的支持。如果你有进一步的需求或问题,可以继续在 Cherry Studio 中进行更多自定义配置,或者通过 API 调用集成到你的应用中。现在,知识库已经搭建并与 DeepSeek 模型连接好,接下来,我们将使用 Cherry Studio 提供的可视化界面进行智能提问。为了让智能体能够通过大模型查询到知识库中的信息,你需要为知识库配置索引和匹配模型。
学Simulink--基于电力电子变换器的建模与仿真实例:LLC谐振变换器在高频AC-DC转换中的建模
本文详细介绍了使用Simulink+Simscape Electrical对LLC谐振变换器进行建模与仿真的完整流程。LLC谐振变换器因其高效率、低噪声的特点,广泛应用于高频AC-DC转换场景。文章从背景原理出发,逐步讲解系统结构设计、建模步骤(包括AC源、整流器、LLC变换器、负载等模块搭建)、控制策略实现(固定频率/变频/PID控制)和仿真设置。通过分析仿真结果的关键指标,提出参数整定和算法优化建议。该建模方法为电力电子设计人员提供了实用的仿真工具,有助于优化LLC变换器性能,缩短开发周期。
让TOTP支持国密SM3算法
只是生成当前时间的动态密码还达不到OTP的功能要求,一般OTP还能允许预设定的前后几个时间窗口的密码验证通过,实现起来也不麻烦,不过可以直接利用其他现成的轮子改改,比如speakeasy的OTP,虽然默认不支持SM3,但是跟其他算法的主要区别就在摘要函数实现中,改改就可以支持SM3算法了。做一个算法为SM3的otpauth url很简单,设置下&algorithm=SM3即可,不过常用的这些扫码的app由于不支持SM3算法,所以不能正确显示动态密码。国密SM3算法是公开的,可以自行开发实现。
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
国密算法:利用python进行sm3 hash算法,计算hash值,国密算法库gmssl的使用
本篇介绍利用gmssl算法库中的sm3模块来进行hash值的计算。 ## 一 sm3 hash算法的特点: - sm3用于计算一个消息的hash值; - 几乎无法被逆向,即通过hash值无法推断出原始消息; - sm3类似于md5,但是比md5安全;sm3是国密算法。
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
Python 实现国产SM3加密算法
SM3是中华人民共和国政府采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。主要用于报告文件数字签名及验证。
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
SM3的Python实现和实例测试
SM3的Python实现和实例测试 最近研究非对称加密算法的实现,尽管RSA世界通行,但是SM2毕竟是国标,不重视不行。结果发现,SM2中的杂凑需要用SM3,所以不得不先搞懂SM3。 网上SM3的介绍资料和源码很多,回过头来看,站在我自己的角度,感觉有必要记录下自己的理解,或许更能适合某些与我思维习惯比较一致的读者。 一. SM3原理 哈希(hash)/杂凑/散列的用途广泛,这里不赘述。国标SM3的权威文件可以到国家密码管理局官网下载([http://www.sca.gov.cn/sca/xwdt/2010
python 实现sm3国密算法
【代码】python 实现sm3国密算法。
2174



被折叠的 条评论
为什么被折叠?



