【国密】基于SM2的协同签名与协同解密方案

24 篇文章 50 订阅 ¥79.90 ¥99.00

一、协同签名

在业务应用中,两方或多方的协同签名一般采用门限签名方案可以用来构造。相比传统的数字签名方案,整个签名过程避免了由单一主体保管密钥带来的系统性单点故障以及跨机构信任问题。

门限签名方案是门限密码最常见的应用,其基于秘密分享的核心理念,将私钥切分成多个秘密分片,实现如下效果:

  • 只有当不少于门限值的秘密分片持有者共同协作,才可以生成有效的签名。
  • 即便部分秘密分片丢失,只要剩余秘密分片不少于门限值,依旧可以生成有效的签名。
  • 联合生成的签名中,并没有透露具体哪些持有者参与了签名过程。

多方协作完成签名,涉及到如下几个方面:

  • 如何将单个密钥安全地切分成多个密钥分片?(单个主体拥有的密钥分片不被其他主体所知)
  • 如何让单个主体能独立安全地使用自己的密钥分片?
  • 如何协同完成签名与验签操作?

解决上述问题的关键在于门限密码算法的巧妙构造。

门限密码算法在多方协作的相关场景中应用十分广泛,可以实现数据联合授权、认证、密钥安全恢复、密钥安全交换等需求,在诸多分布式多方计算协议中均可见其身影。

以下从两方协同签名方案介绍入手,介绍门限密码在协同签名中的应用。

二、两方协同签名方案

两方协同签名指客户端与服务端协同完成签名、验签操作,具体实现方案参考了信工所专利[3]。协同签名整体遵循SM2标准数字签名规范,其内核思想亦是借鉴了SM2算法——以s分量校验r分量是否一致;其次,在设计联合公钥综合考虑两方私钥。

协同签名公钥生成流程如下&#x

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,我可以为你提供国密算法SM2签名和验证签名示例。以下是示例代码: 签名示例(使用Java语言): ```java import org.bouncycastle.crypto.AsymmetricCipherKeyPair; import org.bouncycastle.crypto.CryptoException; import org.bouncycastle.crypto.digests.SM3Digest; import org.bouncycastle.crypto.engines.SM2Engine; import org.bouncycastle.crypto.generators.ECKeyPairGenerator; import org.bouncycastle.crypto.params.*; import org.bouncycastle.crypto.signers.SM2Signer; import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.math.BigInteger; import java.security.*; import java.security.spec.ECGenParameterSpec; public class SM2SignatureExample { public static void main(String[] args) { Security.addProvider(new BouncyCastleProvider()); try { // 生成密钥对 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC"); ECGenParameterSpec ecGenParameterSpec = new ECGenParameterSpec("sm2p256v1"); keyPairGenerator.initialize(ecGenParameterSpec, new SecureRandom()); KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 获取私钥和公钥 PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); // 待签名的数据 byte[] data = "Hello, SM2!".getBytes(); // 执行签名操作 SM2Signer signer = new SM2Signer(); signer.init(true, new ParametersWithRandom(privateKey, new SecureRandom())); signer.update(data, 0, data.length); byte[] signature = signer.generateSignature(); System.out.println("签名值: " + new BigInteger(1,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅唱书令

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值