Python验签方式

OpenSSL验签 

# !/usr/bin/python3
# -*- coding: utf-8 -*-
import OpenSSL
from OpenSSL.crypto import sign,verify
import time
from dateutil import parser

def VerifyCrtAndKey(crtFileUrl, keyFileUrl) ->bool:
  try:
    with open(crtFileUrl) as e:
      crt_data = e.read()
    with open(keyFileUrl) as e:
      key_data = e.read()

    sskey = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, key_data)
    cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, crt_data)
    signdata = sign(sskey, 'hello'.encode(), 'sha1')
    conse = verify(cert, signdata, 'hello'.encode(), 'sha1')
    if conse==None:
      return True
  except:
    return False

Cryptodome验签 

import rsa,base64
from Cryptodome.PublicKey import RSA
from Cryptodome.Hash import SHA256,MD5
from Cryptodome.Cipher import PKCS1_v1_5
from Cryptodome.Signature import PKCS1_v1_5

data = 'hello'
key = base64.b64decode(serverskey)
print(key)
prikey = RSA.importKey(key)
print(prikey)
signer = PKCS1_v1_5.new(prikey)
hash_obj = MD5.new(data.encode('utf-8'))
signature = base64.b64encode(signer.sign(hash_obj))
print(signature)

data2 = 'hello'
public_keyBytes = base64.b64decode(serverpkey)
pubKey = RSA.importKey(public_keyBytes)
h = MD5.new(data2.encode('utf-8'))
verifier = PKCS1_v1_5.new(pubKey)
print(verifier.verify(h, base64.b64decode(signature)))

 

 

### SM2操作实现方法 SM2是一种国密算法,广泛用于数字名和证操作。在实际应用中,Java与Python均可以实现对SM2名的操作,但需要特别注意跨语言兼容性问题。 #### Python中的SM2实现 Python中通常使用`gmssl`库来处理SM2相关的加解密和操作。该库提供了完整的SM2、SM3和SM4算法支持,并且易于集成到项目中。以下是Python中进行SM2的基本步骤: 1. **加载公钥**:首先需要获取名方提供的公钥。 2. **准备原始数据**:将需要证的数据准备好,并确保其内容与名时使用的数据一致。 3. **执行操作**:调用`gmssl`库中的相关函数进行。 以下是一个示例代码片段,展示如何使用`gmssl`库进行SM2操作: ```python from gmssl import sm2, sm3, func # 假设已知公钥和名值 public_key = "BwsvM6PnUgoG7yIACmZKuXWcgdRswfJhFQZubiTu5DkK1tOv9aYg8T0Hqz3l9oE5VcJb" # 初始化SM2对象 sm2_crypt = sm2.CryptSM2(public_key=public_key, private_key="") # 需要证的明文数据 plaintext = "Hello, SM2!" # 名值(假设这是从其他系统获得的名) signature = "304402207E5A3D5E4B1C0D5F2A7E9D3C0B1F8E6D2A1C0D5F2A7E9D3C0B1F8E6D2A1C0D" # 执行操作 is_valid = sm2_crypt.verify_with_sm3(plaintext.encode("utf-8"), signature) if is_valid: print("成功,数据未被篡改。") else: print("失败,数据可能已被篡改。") ``` #### Java中的SM2实现 Java中通常使用Bouncy Castle库来实现SM2操作。Bouncy Castle是一个广泛使用的加密库,支持多种加密算法,包括国密算法SM2。以下是Java中进行SM2的基本步骤: 1. **初始化Bouncy Castle提供者**:确保Bouncy Castle作为安全提供者被正确添加。 2. **加载公钥**:从文件或字符串中加载公钥。 3. **准备原始数据**:确保数据与名时使用的数据一致。 4. **执行操作**:使用`Signature`类进行。 以下是一个示例代码片段,展示如何使用Bouncy Castle库进行SM2操作: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; import java.security.Security; import java.security.Signature; import java.security.interfaces.ECPublicKey; import java.security.spec.X509EncodedKeySpec; import java.security.KeyFactory; public class SM2Verify { static { Security.addProvider(new BouncyCastleProvider()); } public static boolean verify(byte[] publicKeyBytes, byte[] data, byte[] signature) throws Exception { X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("EC", "BC"); ECPublicKey publicKey = (ECPublicKey) keyFactory.generatePublic(keySpec); Signature sig = Signature.getInstance("SHA256withECDSA", "BC"); sig.initVerify(publicKey); sig.update(data); return sig.verify(signature); } public static void main(String[] args) throws Exception { // 示例公钥、数据和名 String publicKeyHex = "04BwsvM6PnUgoG7yIACmZKuXWcgdRswfJhFQZubiTu5DkK1tOv9aYg8T0Hqz3l9oE5VcJb"; String dataStr = "Hello, SM2!"; String signatureHex = "304402207E5A3D5E4B1C0D5F2A7E9D3C0B1F8E6D2A1C0D5F2A7E9D3C0B1F8E6D2A1C0D"; byte[] publicKeyBytes = Hex.decode(publicKeyHex); byte[] data = dataStr.getBytes(); byte[] signatureBytes = Hex.decode(signatureHex); boolean result = verify(publicKeyBytes, data, signatureBytes); if (result) { System.out.println("成功,数据未被篡改。"); } else { System.out.println("失败,数据可能已被篡改。"); } } } ``` #### 注意事项 - **密钥管理**:请确保公钥和私钥的安全性,避免泄露。 - **兼容性**:不同语言之间的实现可能存在差异,特别是在名格式上。例如,在Python中生成的名可能需要特定的格式转换才能在Java中正确。 - **依赖库版本**:确保使用的库版本一致,以避免潜在的兼容性问题[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值