Class SM2

java.lang.Object
tech.riemann.nif.utils.codec.SM2

public class SM2 extends Object
SM2 加密工具类(对标RSA等非对称加密和签名算法)

SM2是中国国家标准的非对称加密算法,用于保护数据的机密性和完整性

本类提供了SM2加密、解密、签名、验证等功能

  • Constructor Details

    • SM2

      public SM2()
  • Method Details

    • generateKeyPair

      public KeyPair generateKeyPair()
      生成SM2非对称加密算法的密钥对

      使用BouncyCastle加密库,基于SM2椭圆曲线参数(sm2p256v1)生成密钥对 生成的密钥对包含公钥和私钥,可用于后续的加密、解密、签名和验证操作

      Returns:
      生成的 KeyPair 对象,包含公钥和私钥;生成失败返回 null
      See Also:
    • base64KeyPair

      public KeyPair base64KeyPair()
      生成SM2密钥对并返回Base64编码的密钥对对象

      该方法首先调用 generateKeyPair() 生成密钥对,然后将公钥和私钥分别转换为Base64编码字符串 公钥采用X.509格式编码,私钥采用PKCS#8格式编码

      Returns:
      包含Base64编码公钥和私钥的 KeyPair 对象;生成失败返回 null
      See Also:
    • hexKeyPair

      public KeyPair hexKeyPair()
      生成SM2密钥对并返回Hex编码的密钥对对象

      该方法首先调用 generateKeyPair() 生成密钥对,然后将公钥和私钥分别转换为Hex编码字符串 公钥采用X.509格式编码(以0x30开头),私钥采用PKCS#8格式编码

      Returns:
      包含Hex编码公钥和私钥的 KeyPair 对象;生成失败返回 null
      See Also:
    • publicKeyToBase64

      public String publicKeyToBase64(PublicKey publicKey)
      将PublicKey对象转换为Base64编码的字符串

      公钥编码格式为X.509格式,生成的Base64字符串不含换行符

      Parameters:
      publicKey - PublicKey对象(SM2算法的公钥)
      Returns:
      Base64编码的公钥字符串(X.509格式);若输入为null则返回null
      See Also:
    • base64ToPublicKey

      public PublicKey base64ToPublicKey(String base64PublicKey)
      将Base64编码的公钥字符串转换为PublicKey对象

      转换步骤: 1. Base64解码获取原始字节数组 2. 构建X.509格式的密钥规范 3. 使用BouncyCastle提供者创建EC算法密钥工厂 4. 根据密钥规范生成PublicKey对象

      Parameters:
      base64PublicKey - Base64编码的公钥字符串(必须为X.509格式)
      Returns:
      转换后的PublicKey对象(SM2算法的公钥);转换失败返回null
      See Also:
    • privateKeyToBase64

      public String privateKeyToBase64(PrivateKey privateKey)
      将PrivateKey对象转换为Base64编码的字符串

      私钥编码格式为PKCS#8格式,生成的Base64字符串不含换行符

      Parameters:
      privateKey - PrivateKey对象(SM2算法的私钥)
      Returns:
      Base64编码的私钥字符串(PKCS#8格式);若输入为null则返回null
      See Also:
    • base64ToPrivateKey

      public PrivateKey base64ToPrivateKey(String base64PrivateKey)
      将Base64编码的私钥字符串转换为PrivateKey对象

      转换步骤: 1. Base64解码获取原始字节数组 2. 构建PKCS#8格式的密钥规范 3. 使用BouncyCastle提供者创建EC算法密钥工厂 4. 根据密钥规范生成PrivateKey对象

      Parameters:
      base64PrivateKey - Base64编码的私钥字符串(必须为PKCS#8格式)
      Returns:
      转换后的PrivateKey对象(SM2算法的私钥);转换失败返回null
      See Also:
    • getPublicKeyHex

      public String getPublicKeyHex(KeyPair keyPair)
      从KeyPair中提取公钥并转换为Hex格式的原始公钥字符串

      该方法提取椭圆曲线上的公钥点Q,转换为非压缩格式(去掉04头)的Hex字符串 生成的公钥字符串长度为128字符(64字节),包含X坐标(前64字符)和Y坐标(后64字符) 这种格式便于跨平台传输和存储

      Parameters:
      keyPair - SM2密钥对对象
      Returns:
      Hex格式的原始公钥字符串(128字符);若输入为null或转换失败返回null
      See Also:
    • getPrivateKeyHex

      public String getPrivateKeyHex(KeyPair keyPair)
      从KeyPair中提取私钥并转换为Hex格式的原始私钥字符串

      该方法提取椭圆曲线私钥的D值(大整数),转换为Hex字符串 生成的私钥字符串长度为64字符(32字节),便于跨平台传输和存储

      Parameters:
      keyPair - SM2密钥对对象
      Returns:
      Hex格式的原始私钥字符串(64字符);若输入为null或转换失败返回null
      See Also:
    • hexToPublicKey

      public PublicKey hexToPublicKey(String hexPublicKey)
      将Hex格式的公钥字符串转换为PublicKey对象

      支持两种输入格式:

      • 完整X.509格式:以0x30开头的ASN.1编码
      • 原始公钥格式:128字符(X+Y坐标各64字符)或带04头130字符

      对于原始公钥格式,内部会自动组装为非压缩格式(04+X+Y),然后封装为X.509格式

      Parameters:
      hexPublicKey - Hex格式的公钥字符串
      Returns:
      转换后的PublicKey对象(SM2算法的公钥);转换失败返回null
      See Also:
    • hexToPrivateKey

      public PrivateKey hexToPrivateKey(String hexPrivateKey)
      将Hex格式的私钥字符串转换为PrivateKey对象

      支持两种输入格式:

      • 完整PKCS#8格式:以0x30开头的ASN.1编码
      • 原始私钥格式:64字符(32字节)的大整数D值

      对于原始私钥格式,内部会自动进行高位零填充,确保32字节长度 然后使用SM2椭圆曲线参数(sm2p256v1)构建ECPrivateKeySpec

      Parameters:
      hexPrivateKey - Hex格式的私钥字符串
      Returns:
      转换后的PrivateKey对象(SM2算法的私钥);转换失败返回null
      See Also:
    • encrypt

      public String encrypt(String data, PublicKey publicKey)
      使用SM2公钥加密数据

      使用BouncyCastle的SM2算法进行加密,明文数据采用UTF-8编码 加密结果使用Base64编码返回,便于传输和存储

      Parameters:
      data - 待加密的明文数据(UTF-8字符串),不可为 null 或空字符串
      publicKey - SM2公钥对象
      Returns:
      Base64编码的加密密文
      Throws:
      IllegalArgumentException - 当明文为 null 或空字符串时(SM2 不支持空输入)
      See Also:
    • encryptByHex

      public String encryptByHex(String data, String hexPublicKey)
      使用Hex格式的SM2公钥加密数据

      该方法是便捷方法,内部先调用 hexToPublicKey(String) 将Hex格式公钥转换为PublicKey对象, 然后调用 encrypt(String, PublicKey) 进行加密

      Parameters:
      data - 待加密的明文数据(UTF-8字符串)
      hexPublicKey - Hex格式的公钥字符串(支持完整X.509格式或128字符原始格式)
      Returns:
      Base64编码的加密密文;公钥转换失败或加密失败返回null
      See Also:
    • encrypt

      public String encrypt(String data, String base64PublicKey)
      使用Base64格式的SM2公钥加密数据

      该方法是便捷方法,内部先调用 base64ToPublicKey(String) 将Base64格式公钥转换为PublicKey对象, 然后调用 encrypt(String, PublicKey) 进行加密

      Parameters:
      data - 待加密的明文数据(UTF-8字符串)
      base64PublicKey - Base64编码的公钥字符串(X.509格式)
      Returns:
      Base64编码的加密密文;公钥转换失败或加密失败返回null
      See Also:
    • decrypt

      public String decrypt(String encryptedData, PrivateKey privateKey)
      使用SM2私钥解密数据

      使用BouncyCastle的SM2算法进行解密,密文数据采用Base64编码 解密结果使用UTF-8编码转换为字符串

      Parameters:
      encryptedData - Base64编码的加密密文
      privateKey - SM2私钥对象
      Returns:
      解密后的明文数据(UTF-8字符串);解密失败返回null
      See Also:
    • decryptByHex

      public String decryptByHex(String encryptedData, String hexPrivateKey)
      使用Hex格式的SM2私钥解密数据

      该方法是便捷方法,内部先调用 hexToPrivateKey(String) 将Hex格式私钥转换为PrivateKey对象, 然后调用 decrypt(String, PrivateKey) 进行解密

      Parameters:
      encryptedData - Base64编码的加密密文
      hexPrivateKey - Hex格式的私钥字符串(支持完整PKCS#8格式或64字符原始格式)
      Returns:
      解密后的明文数据(UTF-8字符串);私钥转换失败或解密失败返回null
      See Also:
    • decrypt

      public String decrypt(String encryptedData, String base64PrivateKey)
      使用Base64格式的SM2私钥解密数据

      该方法是便捷方法,内部先调用 base64ToPrivateKey(String) 将Base64格式私钥转换为PrivateKey对象, 然后调用 decrypt(String, PrivateKey) 进行解密

      Parameters:
      encryptedData - Base64编码的加密密文
      base64PrivateKey - Base64编码的私钥字符串(PKCS#8格式)
      Returns:
      解密后的明文数据(UTF-8字符串);私钥转换失败或解密失败返回null
      See Also:
    • sign

      public SM2.SM2Signature sign(String data, PrivateKey privateKey)
      使用SM2私钥对数据进行签名

      使用SM3WithSM2签名算法(SM3哈希算法+SM2签名算法)进行签名 签名结果为DER格式,内部解析为r和s两个分量,封装为SM2Signature对象返回 明文数据采用UTF-8编码

      Parameters:
      data - 待签名的数据(UTF-8字符串)
      privateKey - SM2私钥对象
      Returns:
      签名结果对象(包含r和s两个Hex格式分量);签名失败返回null
      See Also:
    • verify

      public boolean verify(String data, SM2.SM2Signature signature, PublicKey publicKey)
      使用SM2公钥验证签名的有效性

      使用SM3WithSM2签名算法验证签名,将签名的r和s分量组装为DER格式后进行验证 明文数据采用UTF-8编码

      Parameters:
      data - 待验证的数据(UTF-8字符串)
      signature - 签名结果对象(包含r和s两个分量)
      publicKey - SM2公钥对象
      Returns:
      签名验证结果,验证通过返回true,验证失败或异常返回false
      See Also:
    • signByBase64

      public SM2.SM2Signature signByBase64(String data, String base64PrivateKey)
      使用Base64格式的SM2私钥对数据进行签名

      该方法是便捷方法,内部先调用 base64ToPrivateKey(String) 将Base64格式私钥转换为PrivateKey对象, 然后调用 sign(String, PrivateKey) 进行签名

      Parameters:
      data - 待签名的数据(UTF-8字符串)
      base64PrivateKey - Base64编码的私钥字符串(PKCS#8格式)
      Returns:
      签名结果对象(包含r和s两个Hex格式分量);私钥转换失败或签名失败返回null
      See Also:
    • signByHex

      public SM2.SM2Signature signByHex(String data, String hexPrivateKey)
      使用Hex格式的SM2私钥对数据进行签名

      该方法是便捷方法,内部先调用 hexToPrivateKey(String) 将Hex格式私钥转换为PrivateKey对象, 然后调用 sign(String, PrivateKey) 进行签名

      Parameters:
      data - 待签名的数据(UTF-8字符串)
      hexPrivateKey - Hex格式的私钥字符串(支持完整PKCS#8格式或64字符原始格式)
      Returns:
      签名结果对象(包含r和s两个Hex格式分量);私钥转换失败或签名失败返回null
      See Also:
    • verifyByBase64

      public boolean verifyByBase64(String data, SM2.SM2Signature signature, String base64PublicKey)
      使用Base64格式的SM2公钥验证签名

      该方法是便捷方法,内部先调用 base64ToPublicKey(String) 将Base64格式公钥转换为PublicKey对象, 然后调用 verify(String, SM2Signature, PublicKey) 进行签名验证

      Parameters:
      data - 待验证的数据(UTF-8字符串)
      signature - 签名结果对象(包含r和s两个分量)
      base64PublicKey - Base64编码的公钥字符串(X.509格式)
      Returns:
      签名验证结果,验证通过返回true,验证失败或异常返回false
      See Also:
    • verifyByHex

      public boolean verifyByHex(String data, SM2.SM2Signature signature, String hexPublicKey)
      使用Hex格式的SM2公钥验证签名

      该方法是便捷方法,内部先调用 hexToPublicKey(String) 将Hex格式公钥转换为PublicKey对象, 然后调用 verify(String, SM2Signature, PublicKey) 进行签名验证

      Parameters:
      data - 待验证的数据(UTF-8字符串)
      signature - 签名结果对象(包含r和s两个分量)
      hexPublicKey - Hex格式的公钥字符串(支持完整X.509格式或128字符原始格式)
      Returns:
      签名验证结果,验证通过返回true,验证失败或异常返回false
      See Also:
    • verifyByBase64

      public boolean verifyByBase64(String data, String signatureStr, String base64PublicKey)
      使用Base64格式的SM2公钥验证签名(签名格式为R.S字符串)

      该方法是便捷方法,内部先调用 SM2.SM2Signature.parse(String) 将签名字符串解析为SM2Signature对象, 然后调用 base64ToPublicKey(String) 将Base64格式公钥转换为PublicKey对象, 最后调用 verify(String, SM2Signature, PublicKey) 进行签名验证

      Parameters:
      data - 待验证的数据(UTF-8字符串)
      signatureStr - 签名字符串,格式为 "R.S"(R和S用点号连接)
      base64PublicKey - Base64编码的公钥字符串(X.509格式)
      Returns:
      签名验证结果,验证通过返回true,签名格式错误、公钥转换失败、验证失败或异常返回false
      See Also:
    • verifyByHex

      public boolean verifyByHex(String data, String signatureStr, String hexPublicKey)
      使用Hex格式的SM2公钥验证签名(签名格式为R.S字符串)

      该方法是便捷方法,内部先调用 SM2.SM2Signature.parse(String) 将签名字符串解析为SM2Signature对象, 然后调用 hexToPublicKey(String) 将Hex格式公钥转换为PublicKey对象, 最后调用 verify(String, SM2Signature, PublicKey) 进行签名验证

      Parameters:
      data - 待验证的数据(UTF-8字符串)
      signatureStr - 签名字符串,格式为 "R.S"(R和S用点号连接)
      hexPublicKey - Hex格式的公钥字符串(支持完整X.509格式或128字符原始格式)
      Returns:
      签名验证结果,验证通过返回true,签名格式错误、公钥转换失败、验证失败或异常返回false
      See Also:
    • verify

      public boolean verify(String data, String signatureStr, PublicKey publicKey)
      使用SM2公钥验证签名(签名格式为R.S字符串)

      该方法是便捷方法,内部先调用 SM2.SM2Signature.parse(String) 将签名字符串解析为SM2Signature对象, 然后调用 verify(String, SM2Signature, PublicKey) 进行签名验证

      Parameters:
      data - 待验证的数据(UTF-8字符串)
      signatureStr - 签名字符串,格式为 "R.S"(R和S用点号连接)
      publicKey - SM2公钥对象
      Returns:
      签名验证结果,验证通过返回true,签名格式错误、验证失败或异常返回false
      See Also: