如何在SM中使用Number

本文介绍如何在服务管理中实现格式化的配置项ID自动生成。通过使用number功能,定义特定格式如SW-OPS-WIN-XXXXXXXX,并确保ID能自动递增。

Requirement: In Configuration Management, customer always wants to define a formated configuration item ID, such as SW-OPS-WIN-XXXXXXXX. And the ID should be increased automatically.

 

Implementation: To accomplish this, service manager provides a number function to do this. Here are the steps:

  1. Input 'number' in quick launch filed, and type enter key.
  2. Input a legal name in class field, and set the correct start number in Last Number filed. REMEMBER THE NAME IN CLASS FIELD.
  3. Opend format control of the form on which will be applied the function.
  4. Click Javascript button.
  5. Input true to Add field, and input following script:
  6. function getNumber (file) {

        if (file == null )  file = "event" ;

        var rc = new SCDatum () ;

        var number = new SCDatum () ;

        system.functions.rtecall ("getNumber" , rc , number , file) ;

        var ret = number.getText () ;

        ret = ret

        return ret ;

    }

     

内容概要:本文档介绍了基于3D FDTD(时域有限差分)方法在MATLAB平台上对微带线馈电的矩形天线进行仿真分析的技术方案,重点在于模拟超MATLAB基于3D FDTD的微带线馈矩形天线分析[用于模拟超宽带脉冲通过线馈矩形天线的传播,以计算微带结构的回波损耗参数]宽带脉冲信号通过天线结构的传播过程,并计算微带结构的回波损耗参数(S11),以评估天线的匹配性能和辐射特性。该方法通过建立三维电磁场模型,精确求解麦克斯韦方程组,适用于高频电磁仿真,能够有效分析天线在宽频带内的响应特性。文档还提及该资源属于一个涵盖多个科研方向的综合性MATLAB仿真资源包,涉及通信、信号处理、电力系统、机器学习等多个领域。; 适合人群:具备电磁场与微波技术基础知识,熟悉MATLAB编程及数值仿真的高校研究生、科研人员及通信工程领域技术人员。; 使用场景及目标:① 掌握3D FDTD方法在天线仿真中的具体实现流程;② 分析微带天线的回波损耗特性,优化天线设计参数以提升宽带匹配性能;③ 学习复杂电磁问题的数值建模与仿真技巧,拓展在射频与无线通信领域的研究能力。; 阅读建议:建议读者结合电磁理论基础,仔细理解FDTD算法的离散化过程和边界条件设置,运行并调试提供的MATLAB代码,通过调整天线几何尺寸和材料参数观察回波损耗曲线的变化,从而深入掌握仿真原理与工程应用方法。
<think>好的,用户现在遇到了SM2加密中的两个问题:强制使用C1C3C2模式时出现ValueError,提示非十六进制字符。我需要结合之前的回答和用户的新问题来提供解决方案。 首先,回顾之前的回答,用户的问题出在十六进制字符串的格式错误,可能是非法字符或拆分错误导致。现在用户明确提到想强制使用C1C3C2模式,并解决相关的ValueError。 用户可能使用的库是gmssl或者类似的国密库。需要确认这些库是否支持C1C3C2模式,或者是否需要手动重组密文结构。例如,gmssl默认可能使用C1C2C3,而用户需要调整顺序为C1C3C2。 接下来,关于ValueError,位置93出现非十六进制字符,可能是在拆分或重组过程中,字符串被截断或包含非法字符。需要检查加密后的密文长度是否正确,并过滤非法字符。 另外,用户可能需要处理来自其他系统的密文,比如Java或其他语言生成的C1C3C2格式,需要Python端正确解析。这时需要拆分各部分并重新组合,同时确保十六进制字符串的合法性。 还需要考虑ASN.1编码的问题,某些库可能在密文中加入ASN.1结构,导致直接拆分失败。如果用户遇到这种情况,可能需要解析ASN.1格式,再提取C1、C3、C2部分。 最后,提供代码示例,展示如何强制使用C1C3C2模式,并在解码前清洗字符串,处理可能的非法字符,确保长度正确。同时,提醒用户检查库的版本和文档,确认默认的密文结构,必要时手动调整。</think>针对SM2加密中强制使用`C1C3C2`模式的需求及`ValueError: non-hexadecimal number`错误,结合Python实现提供以下解决方案: --- ### 一、强制使用C1C3C2模式的实现方法 #### 1. 理解SM2密文结构 - **标准模式**:SM2密文包含3部分(具体顺序取决于实现库) - `C1`:椭圆曲线公钥点坐标(65字节,130字符十六进制) - `C2`:加密后的密文数据(长度与明文相关) - `C3`:SM3哈希摘要(32字节,64字符十六进制) - **模式差异**: - `gmssl`库默认使用`C1C3C2`模式[^1] - 其他库(如`python-gmssl`)可能使用`C1C2C3`模式 #### 2. 手动重组密文结构 若需强制使用`C1C3C2`模式,需按以下步骤操作: ```python from gmssl import sm2 def encrypt_with_c1c3c2(public_key, plaintext): # 加密生成默认格式密文(假设库返回C1C2C3) crypt = sm2.CryptSM2(public_key=public_key, private_key=None) encrypted = crypt.encrypt(plaintext) encrypted_hex = encrypted.hex() # 拆分并重组为C1C3C2 c1 = encrypted_hex[:130] # 固定65字节 c3 = encrypted_hex[130:194] # 固定32字节 c2 = encrypted_hex[194:] # 剩余部分 return bytes.fromhex(c1 + c3 + c2) # 返回C1C3C2格式的字节流 ``` --- ### 二、解决`non-hexadecimal number`错误 #### 1. 错误根源分析 当密文在位置93出现非十六进制字符时,可能原因包括: - **跨库兼容性问题**:与其他语言(如Java)交互时,密文包含ASN.1编码结构[^1] - **数据截断**:网络传输或存储过程中丢失部分字符 - **非法字符**:包含`g-zG-Z`或特殊符号(如`:`、`-`) #### 2. 通用解决方案 ```python def safe_fromhex(hex_str): # 清洗非法字符并补全长 hex_clean = ''.join(filter(lambda c: c in '0123456789abcdefABCDEF', hex_str)) if len(hex_clean) % 2 != 0: hex_clean = hex_clean[:-1] # 移除末尾奇数位字符 return bytes.fromhex(hex_clean) # 示例:处理可能污染的密文 corrupted_hex = "306f...0a3g" # 包含非法字符的输入 encrypted_bytes = safe_fromhex(corrupted_hex) ``` #### 3. ASN.1编码处理 若密文包含ASN.1结构(常见于Java实现),需解析后再重组: ```python from pyasn1.codec.der import decoder def parse_asn1_c1c3c2(der_data): # 解析ASN.1格式密文 asn1_seq, _ = decoder.decode(der_data) c1 = bytes(asn1_seq[0]).hex() # 04开头公钥点 c3 = bytes(asn1_seq[1]).hex() # 32字节哈希 c2 = bytes(asn1_seq[2]).hex() # 加密数据 return bytes.fromhex(c1 + c3 + c2) ``` --- ### 三、完整工作流程示例 ```python from gmssl import sm2 public_key = "04..." # 130字符十六进制公钥 private_key = "00..." # 64字符十六进制私钥 plaintext = b"ABC123" # 1. 加密并强制使用C1C3C2 crypt = sm2.CryptSM2(public_key=public_key, private_key=private_key) encrypted_default = crypt.encrypt(plaintext) encrypted_c1c3c2 = bytes.fromhex(encrypted_default.hex()[:130] + encrypted_default.hex()[194:] + encrypted_default.hex()[130:194]) # 2. 解密处理(需匹配模式) def decrypt_c1c3c2(ciphertext): cipher_hex = ciphertext.hex() c1 = cipher_hex[:130] c3 = cipher_hex[-64:] c2 = cipher_hex[130:-64] return crypt.decrypt(bytes.fromhex(c1 + c2 + c3)) # 重组为库期望的C1C2C3 decrypted = decrypt_c1c3c2(encrypted_c1c3c2) print(decrypted) # 应输出b'ABC123' ``` --- ### 关键注意事项 1. **密钥格式验证**: ```python assert len(public_key) == 130 and public_key.startswith('04'), "无效公钥" assert len(private_key) == 64, "无效私钥" ``` 2. **跨语言交互测试**: - 与Java的`BouncyCastle`交互时,需统一使用`C1C3C2`模式[^1] - 测试案例应包括含中文、符号的明文 3. **错误日志增强**: ```python try: decrypted = crypt.decrypt(encrypted_bytes) except ValueError as e: print(f"解密失败: {str(e)}\n密文HEX: {encrypted_bytes.hex()[:200]}...") raise ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值