国密算法sm2、sm3

package com.joinsoft.util.sm2;

import com.joinsoft.WebConstants;
import org.apache.pdfbox.pdmodel.graphics.state.PDSoftMask;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.math.ec.ECPoint;

import java.io.IOException;
import java.math.BigInteger;

public class SM2Util {
	//生成随机秘钥对
	public static SM2KeyPair generateKeyPair(){
		SM2 sm2 = SM2.Instance();
		AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.generateKeyPair();
		ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters) key.getPrivate();
		ECPublicKeyParameters ecpub = (ECPublicKeyParameters) key.getPublic();
		BigInteger privateKey = ecpriv.getD();
		ECPoint publicKey = ecpub.getQ();
        System.out.println("公钥: " + Util.byteToHex(publicKey.getEncoded()));
        System.out.println("私钥: " + Util.byteToHex(privateKey.toByteArray()));
		return  new SM2KeyPair(Util.byteToHex(publicKey.getEncoded(false)),Util.byteToHex(privateKey.toByteArray()));
	}



	//数据加密
	public static String encrypt(byte[] publicKey, byte[] data) throws IOException
	{
		if (publicKey == null || publicKey.length == 0)
		{
			return null;
		}

		if (data == null || data.length == 0)
		{
			return null;
		}

		byte[] source = new byte[data.length];
		System.arraycopy(data, 0, source, 0, data.length);

		Cipher cipher = new Cipher();
		SM2 sm2 = SM2.Instance();
		ECPoint userKey = sm2.ecc_curve.decodePoint(publicKey);

		ECPoint c1 = cipher.Init_enc(sm2, userKey);
		cipher.Encrypt(source);
		byte[] c3 = new byte[32];
		cipher.Dofinal(c3);

//      System.out.println("C1 " + Util.byteToHex(c1.getEncoded()));
//      System.out.println("C2 " + Util.byteToHex(source));
//      System.out.println("C3 " + Util.byteToHex(c3));
		//C1 C2 C3拼装成加密字串
		return Util.byteToHex(c1.getEncoded(false)) + Util.byteToHex(source) + Util.byteToHex(c3);

	}

	//数据解密
	public static byte[] decrypt(byte[] privateKey, byte[] encryptedData) throws IOException
	{
		if (privateKey == null || privateKey.length == 0)
		{
			return null;
		}

		if (encryptedData == null || encryptedData.length == 0)
		{
			return null;
		}
		//加密字节数组转换为十六进制的字符串 长度变为encryptedData.length * 2
		String data = Util.byteToHex(encryptedData);
		/***分解加密字串
		 * (C1 = C1标志位2位 + C1实体部分128位 = 130)
		 * (C3 = C3实体部分64位  = 64)
		 * (C2 = encryptedData.length * 2 - C1长度  - C2长度)
		 */
		byte[] c1Bytes = Util.hexToByte(data.substring(0,130));
		int c2Len = encryptedData.length - 97;
		byte[] c2 = Util.hexToByte(data.substring(130,130 + 2 * c2Len));
		byte[] c3 = Util.hexToByte(data.substring(130 + 2 * c2Len,194 + 2 * c2Len));

		SM2 sm2 = SM2.Instance();
		BigInteger userD = new BigInteger(1, privateKey);

		//通过C1实体字节来生成ECPoint
		ECPoint c1 = sm2.ecc_curve.decodePoint(c1Bytes);
		Cipher cipher = new Cipher();
		cipher.Init_dec(userD, c1);
		cipher.Decrypt(c2);
		cipher.Dofinal(c3);

		//返回解密结果
		return c2;
	}

	public static void main(String[] args) throws IOException {
//		SM2Util.generateKeyPair();
		String plainText = "Hello SM2 !";
		byte[] sourceData = plainText.getBytes();
		String  decryptname =  SM2Util.encrypt(Util.hexToByte(WebConstants.publick_SM2kh), sourceData);


		byte[] decryptname1 =  SM2Util.decrypt(Util.hexToByte(WebConstants.PRIVATEKEY_SM2kh), Util.hexToByte(decryptname));

		plainText=new String(decryptname1,"utf-8");
		System.out.println(plainText);

	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 国密算法SM2是中国自主研发的一种基于椭圆曲线密码学的公钥加密算法,是对RSA和ECC的一种补充和完善。SM2算法具有安全、高效、灵活等特点,性能更优,且可以在国家保密需求下有良好应用。SM2算法可用于数字签名、密钥交换和加密等密码学应用,是最适合在中国国内使用的加密算法之一。 在线SM2算法服务可以为用户提供方便的加密服务,同时保障信息安全。通过在线SM2算法服务,用户可以轻松实现加密数据、签名和验签等操作,同时可以避免因不正确使用SM2算法而造成信息泄露等安全问题。在线SM2算法服务还可以提供密钥交换功能,确保数据在传输过程中的隐私和完整性。 总之,国密算法SM2在线服务是一种安全、可靠的加密解决方案,可以帮助用户保护数据的隐私和完整性,同时可以为用户提供方便的加密服务,推动信息安全保护水平的提升和数字化进程的发展。 ### 回答2: 国密算法SM2是我国自主研发的公钥密码算法,它是适用于数字签名、密钥交换和加密等多种场景的密码算法SM2算法采用基于椭圆曲线的密码学算法,与传统的RSA、DSA、ECC等相比,具有更高的安全性和更快的速度,且能够在轻量级设备上运行,适用范围广泛。 国密算法SM2在线服务提供了SM2算法的相关功能,包括ECIES加密、ECDSA签名、公私钥生成、密钥派生等一系列操作。借助在线服务,用户可以直接在线使用SM2算法进行数据加密、签名和验证等操作,而无需安装和配置任何软件,十分方便快捷。 SM2在线服务也为企业和开发者提供了一种简单易用、高效安全的密码编程接口,可以轻松地嵌入到自己的应用中,提供更加丰富的数据保护方案。同时,SM2在线服务还提供了一系列应用案例和详细的文档资料,帮助用户更好的了解和使用SM2算法。 总之,国密算法SM2在线服务是一款基于SM2算法的在线密码工具,提供了丰富的功能和编程接口,便于用户轻松实现数据加密、签名和验证等操作,适用于各种应用场景,是一款非常有价值的密码工具。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值