SM2算法加解密中的C1,C2,C3

SM2加密

SM2非对称加密的结果由C1,C2,C3三部分组成。其中C1是生成随机数的计算出的椭圆曲线点,C2是密文数据,C3是SM3的摘要值。最开始的国密标准的结果是按C1C2C3顺序的,新标准的是按C1C3C2顺序存放的,因此我这边在做SM2加密时新增加了加密结果的顺序参数,以配置兼容之前的SM2算法加密。

SM3算法

SM2国密算法有点不一样的是,同时使用了SM3摘要算法验证,即SM2加密结果中的C3为SM3摘要。这次也使用上次JS签名进行SM3摘要计算方法,修正了JS移位运算转换为Byte字节问题,对于溢出部分截取后8位处理。

BCryptProv-JDK16是一个用于Java的密码学库,它包含了SM2算法的支持。SM2Engine.Mode.C1C3C2是一种SM2密码模式,其中C1、C3和C2代表三种不同的操作: 1. C1 (加密): 这是SM2算法的主要加密步骤,通常用于生成公钥对中的公钥以及对数据进行加密。 2. C3 (解密): 对称于C1,C3SM2的解密过程,用于从接收方的私钥解密消息。 3. C2 (签名/验签): SM2还支持数字签名,C2模式表示使用私钥进行签名(生成消息摘要并加密),而C2'则对应的是验证签名的过程。 在实际使用中,你需要创建一个`SM2Engine`实例,并设置模式为`Mode.C1C3C2`。例如,如果你想要生成一个SM2公钥对并进行加密,你可以这样做: ```java import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; // 首先,添加Bouncy Castle提供者 Security.addProvider(new BouncyCastleProvider()); // 创建X9ECParameters对象 X9ECParameters params = ...; // 根据需要加载SM2参数 // 初始化SM2 Engine SM2Engine engine = new SM2Engine(params); // 设置模式为C1C3C2 engine.setMode(SM2Engine.Mode.C1C3C2); // 发生实际的操作,如生成公钥对和加密 byte[] publicKeyBytes = engine.generatePublic(); byte[] encryptedMessage = engine.encrypt(message, privateKeyBytes); // privateKeyBytes是私钥字节形式 ``` 这里需要注意的是,你需要确保提供的`X9ECParameters`对象包含了正确的SM2参数,以及`privateKeyBytes`是你想用于加密的私钥。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值