Module bus.crypto

Class SM2

All Implemented Interfaces:
Serializable, Decryptor, Encryptor

public class SM2 extends AbstractCrypto<SM2>
国密SM2非对称算法实现,基于BC库 SM2算法只支持公钥加密,私钥解密 参考:https://blog.csdn.net/pridas/article/details/86118774

国密算法包括:

  1. 非对称加密和签名:SM2,asymmetric
  2. 摘要签名算法:SM3,digest
  3. 对称加密:SM4,symmetric
Since:
Java 17+
Author:
Kimi Liu
See Also:
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected org.bouncycastle.crypto.engines.SM2Engine
    SM2引擎
    protected org.bouncycastle.crypto.signers.SM2Signer
    签名

    Fields inherited from class org.miaixz.bus.crypto.builtin.asymmetric.Asymmetric

    algorithm, lock, privateKey, publicKey
  • Constructor Summary

    Constructors
    Constructor
    Description
    SM2()
    构造,生成新的随机私钥公钥对
    SM2(byte[] privateKey, byte[] publicKey)
    构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
    SM2(byte[] privateKey, byte[] publicKeyX, byte[] publicKeyY)
    构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
    SM2(String privateKey, String publicKey)
    构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
    SM2(String privateKey, String privateKeyX, String privateKeyY)
    构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
    SM2(PrivateKey privateKey, PublicKey publicKey)
    构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
    SM2(org.bouncycastle.crypto.params.ECPrivateKeyParameters privateKey, org.bouncycastle.crypto.params.ECPublicKeyParameters publicKey)
    构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
  • Method Summary

    Modifier and Type
    Method
    Description
    byte[]
    decrypt(byte[] data)
    使用私钥解密
    byte[]
    decrypt(byte[] data, org.bouncycastle.crypto.CipherParameters privateKeyParameters)
    解密
    byte[]
    decrypt(byte[] data, KeyType keyType)
    解密
    byte[]
    使用私钥解密
    byte[]
    使用私钥解密
    使用私钥解密
    decryptString(String data, Charset charset)
    使用私钥解密
    byte[]
    encrypt(byte[] data)
    使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
    byte[]
    encrypt(byte[] data, org.bouncycastle.crypto.CipherParameters pubKeyParameters)
    加密,SM2非对称加密的结果由C1,C2,C3三部分组成,其中:
    byte[]
    encrypt(byte[] data, KeyType keyType)
    加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
    byte[]
    使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
    byte[]
    使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
    encryptBase64(byte[] data)
    使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
    使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
    使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
    byte[]
    获得私钥D值(编码后的私钥)
    获得私钥D值
    获得私钥D值(编码后的私钥)
    byte[]
    getQ(boolean isCompressed)
    获得公钥Q值(编码后的公钥)
    初始化 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密(签名)或者解密(校验)
    生成随机公钥和私钥
    setDigest(org.bouncycastle.crypto.Digest digest)
    设置Hash算法
    setEncoding(org.bouncycastle.crypto.signers.DSAEncoding encoding)
    设置DSA signatures的编码
    setMode(org.bouncycastle.crypto.engines.SM2Engine.Mode mode)
    设置SM2模式,旧版是C1C2C3,新版本是C1C3C2
    设置私钥
    setPrivateKeyParams(org.bouncycastle.crypto.params.ECPrivateKeyParameters privateKeyParams)
    设置私钥参数
    设置公钥
    setPublicKeyParams(org.bouncycastle.crypto.params.ECPublicKeyParameters publicKeyParams)
    设置公钥参数
    设置随机数生成器,可自定义随机数种子
    setRemoveCompressedFlag(boolean removeCompressedFlag)
    设置是否移除压缩标记,默认为false 移除后的密文兼容gmssl等库
    byte[]
    sign(byte[] data)
    用私钥对信息生成数字签名,签名格式为ASN1 * 在硬件签名中,返回结果为R+S,可以通过调用Builder.rsAsn1ToPlain(byte[])方法转换之。
    byte[]
    sign(byte[] data, byte[] id)
    用私钥对信息生成数字签名,签名格式为ASN1 在硬件签名中,返回结果为R+S,可以通过调用Builder.rsAsn1ToPlain(byte[])方法转换之。
    signHex(byte[] data)
    用私钥对信息生成数字签名
    signHex(byte[] data, byte[] id)
    用私钥对信息生成数字签名
    用私钥对信息生成数字签名
    signHexFromHex(String dataHex, String idHex)
    用私钥对信息生成数字签名
    设置DSA signatures的编码为PlainDSAEncoding
    boolean
    verify(byte[] data, byte[] sign)
    用公钥检验数字签名的合法性
    boolean
    verify(byte[] data, byte[] sign, byte[] id)
    用公钥检验数字签名的合法性
    boolean
    verifyHex(String dataHex, String signHex)
    用公钥检验数字签名的合法性
    boolean
    verifyHex(String dataHex, String signHex, String idHex)
    用公钥检验数字签名的合法性

    Methods inherited from class org.miaixz.bus.crypto.builtin.asymmetric.Asymmetric

    getKeyByType, getPrivateKey, getPrivateKeyBase64, getPublicKey, getPublicKeyBase64, init, setKey, setLock

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface org.miaixz.bus.crypto.builtin.asymmetric.Decryptor

    decrypt, decrypt, decryptString, decryptString

    Methods inherited from interface org.miaixz.bus.crypto.builtin.asymmetric.Encryptor

    encrypt, encrypt, encrypt, encryptBase64, encryptBase64, encryptBase64, encryptBase64, encryptHex, encryptHex, encryptHex, encryptHex
  • Field Details

    • engine

      protected org.bouncycastle.crypto.engines.SM2Engine engine
      SM2引擎
    • signer

      protected org.bouncycastle.crypto.signers.SM2Signer signer
      签名
  • Constructor Details

    • SM2

      public SM2()
      构造,生成新的随机私钥公钥对
    • SM2

      public SM2(String privateKey, String publicKey)
      构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
      Parameters:
      privateKey - 私钥Hex或Base64表示,必须使用PKCS#8规范
      publicKey - 公钥Hex或Base64表示,必须使用X509规范
    • SM2

      public SM2(byte[] privateKey, byte[] publicKey)
      构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
      Parameters:
      privateKey - 私钥,可以使用PKCS#8、D值或PKCS#1规范
      publicKey - 公钥,可以使用X509、Q值或PKCS#1规范
    • SM2

      public SM2(String privateKey, String privateKeyX, String privateKeyY)
      构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
      Parameters:
      privateKey - 私钥16进制(私钥D值)
      privateKeyX - 公钥X16进制
      privateKeyY - 公钥Y16进制
    • SM2

      public SM2(byte[] privateKey, byte[] publicKeyX, byte[] publicKeyY)
      构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
      Parameters:
      privateKey - 私钥(D值)
      publicKeyX - 公钥X
      publicKeyY - 公钥Y
    • SM2

      public SM2(PrivateKey privateKey, PublicKey publicKey)
      构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
      Parameters:
      privateKey - 私钥
      publicKey - 公钥
    • SM2

      public SM2(org.bouncycastle.crypto.params.ECPrivateKeyParameters privateKey, org.bouncycastle.crypto.params.ECPublicKeyParameters publicKey)
      构造 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
      Parameters:
      privateKey - 私钥,可以为null
      publicKey - 公钥,可以为null
  • Method Details

    • init

      public SM2 init()
      初始化 私钥和公钥同时为空时生成一对新的私钥和公钥 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密(签名)或者解密(校验)
      Returns:
      this
    • initKeys

      public SM2 initKeys()
      Description copied from class: Asymmetric
      生成随机公钥和私钥
      Overrides:
      initKeys in class Asymmetric<SM2>
      Returns:
      this
    • encryptBase64

      public String encryptBase64(String data)
      使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
       C1 生成随机数的计算出的椭圆曲线点
       C3 SM3的摘要值
       C2 密文数据
       
      Parameters:
      data - 被加密的字符串,UTF8编码
      Returns:
      加密后的Base64
      Throws:
      org.miaixz.bus.core.lang.exception.CryptoException - 包括InvalidKeyException和InvalidCipherTextException的包装异常
    • encryptBase64

      public String encryptBase64(InputStream in)
      使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
       C1 生成随机数的计算出的椭圆曲线点
       C3 SM3的摘要值
       C2 密文数据
       
      Parameters:
      in - 被加密的数据流
      Returns:
      加密后的Base64
    • encryptBase64

      public String encryptBase64(byte[] data)
      使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
       C1 生成随机数的计算出的椭圆曲线点
       C3 SM3的摘要值
       C2 密文数据
       
      Parameters:
      data - 被加密的bytes
      Returns:
      加密后的Base64
    • encrypt

      public byte[] encrypt(byte[] data) throws org.miaixz.bus.core.lang.exception.CryptoException
      使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
       C1 生成随机数的计算出的椭圆曲线点
       C3 SM3的摘要值
       C2 密文数据
       
      Parameters:
      data - 被加密的bytes
      Returns:
      加密后的bytes
      Throws:
      org.miaixz.bus.core.lang.exception.CryptoException - 包括InvalidKeyException和InvalidCipherTextException的包装异常
    • encrypt

      public byte[] encrypt(byte[] data, KeyType keyType) throws org.miaixz.bus.core.lang.exception.CryptoException
      加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
       C1 生成随机数的计算出的椭圆曲线点
       C3 SM3的摘要值
       C2 密文数据
       
      Parameters:
      data - 被加密的bytes
      keyType - 私钥或公钥 KeyType
      Returns:
      加密后的bytes
      Throws:
      org.miaixz.bus.core.lang.exception.CryptoException - 包括InvalidKeyException和InvalidCipherTextException的包装异常
    • encrypt

      public byte[] encrypt(String data)
      使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
       C1 生成随机数的计算出的椭圆曲线点
       C3 SM3的摘要值
       C2 密文数据
       
      Parameters:
      data - 被加密的字符串,UTF8编码
      Returns:
      加密后的bytes
      Throws:
      org.miaixz.bus.core.lang.exception.CryptoException - 包括InvalidKeyException和InvalidCipherTextException的包装异常
    • encrypt

      public byte[] encrypt(InputStream in)
      使用公钥加密,SM2非对称加密的结果由C1,C3,C2三部分组成,其中:
       C1 生成随机数的计算出的椭圆曲线点
       C3 SM3的摘要值
       C2 密文数据
       
      Parameters:
      in - 被加密的数据流
      Returns:
      加密后的bytes
    • encrypt

      public byte[] encrypt(byte[] data, org.bouncycastle.crypto.CipherParameters pubKeyParameters) throws org.miaixz.bus.core.lang.exception.CryptoException
      加密,SM2非对称加密的结果由C1,C2,C3三部分组成,其中:
       C1 生成随机数的计算出的椭圆曲线点
       C2 密文数据
       C3 SM3的摘要值
       
      Parameters:
      data - 被加密的bytes
      pubKeyParameters - 公钥参数
      Returns:
      加密后的bytes
      Throws:
      org.miaixz.bus.core.lang.exception.CryptoException - 包括InvalidKeyException和InvalidCipherTextException的包装异常
    • decryptString

      public String decryptString(String data)
      使用私钥解密
      Parameters:
      data - SM2密文数据,Hex(16进制)或Base64字符串
      Returns:
      解密后的字符串,UTF-8 编码
    • decryptString

      public String decryptString(String data, Charset charset)
      使用私钥解密
      Parameters:
      data - SM2密文数据,Hex(16进制)或Base64字符串
      charset - 编码
      Returns:
      解密后的bytes
      Throws:
      org.miaixz.bus.core.lang.exception.CryptoException - 包括InvalidKeyException和InvalidCipherTextException的包装异常
    • decrypt

      public byte[] decrypt(byte[] data) throws org.miaixz.bus.core.lang.exception.CryptoException
      使用私钥解密
      Parameters:
      data - SM2密文,实际包含三部分:ECC公钥、真正的密文、公钥和原文的SM3-HASH值
      Returns:
      加密后的bytes
      Throws:
      org.miaixz.bus.core.lang.exception.CryptoException - 包括InvalidKeyException和InvalidCipherTextException的包装异常
    • decrypt

      public byte[] decrypt(byte[] data, KeyType keyType) throws org.miaixz.bus.core.lang.exception.CryptoException
      解密
      Parameters:
      data - SM2密文,实际包含三部分:ECC公钥、真正的密文、公钥和原文的SM3-HASH值
      keyType - 私钥或公钥 KeyType
      Returns:
      加密后的bytes
      Throws:
      org.miaixz.bus.core.lang.exception.CryptoException - 包括InvalidKeyException和InvalidCipherTextException的包装异常
    • decrypt

      public byte[] decrypt(InputStream in)
      使用私钥解密
      Parameters:
      in - 密文数据流
      Returns:
      解密后的bytes
    • signHexFromHex

      public String signHexFromHex(String dataHex)
      用私钥对信息生成数字签名
      Parameters:
      dataHex - 被签名的数据(Hex格式)
      Returns:
      签名
    • signHexFromHex

      public String signHexFromHex(String dataHex, String idHex)
      用私钥对信息生成数字签名
      Parameters:
      dataHex - 被签名的数据(Hex格式)
      idHex - 可以为null,若为null,则默认withId为字节数组:"1234567812345678".getBytes()
      Returns:
      签名
    • signHex

      public String signHex(byte[] data)
      用私钥对信息生成数字签名
      Parameters:
      data - 被签名的数据
      Returns:
      签名
    • signHex

      public String signHex(byte[] data, byte[] id)
      用私钥对信息生成数字签名
      Parameters:
      data - 被签名的数据
      id - 可以为null,若为null,则默认withId为字节数组:"1234567812345678".getBytes()
      Returns:
      签名
    • sign

      public byte[] sign(byte[] data)
      用私钥对信息生成数字签名,签名格式为ASN1 * 在硬件签名中,返回结果为R+S,可以通过调用Builder.rsAsn1ToPlain(byte[])方法转换之。
      Parameters:
      data - 加密数据
      Returns:
      签名
    • sign

      public byte[] sign(byte[] data, byte[] id)
      用私钥对信息生成数字签名,签名格式为ASN1 在硬件签名中,返回结果为R+S,可以通过调用Builder.rsAsn1ToPlain(byte[])方法转换之。
      Parameters:
      data - 被签名的数据
      id - 可以为null,若为null,则默认withId为字节数组:"1234567812345678".getBytes()
      Returns:
      签名
    • verifyHex

      public boolean verifyHex(String dataHex, String signHex)
      用公钥检验数字签名的合法性
      Parameters:
      dataHex - 后的数据
      signHex - 签名
      Returns:
      是否验证通过
    • verify

      public boolean verify(byte[] data, byte[] sign)
      用公钥检验数字签名的合法性
      Parameters:
      data - 数据
      sign - 签名
      Returns:
      是否验证通过
    • verifyHex

      public boolean verifyHex(String dataHex, String signHex, String idHex)
      用公钥检验数字签名的合法性
      Parameters:
      dataHex - 数据的Hex值
      signHex - 签名的Hex值
      idHex - ID的Hex值
      Returns:
      是否验证通过
    • verify

      public boolean verify(byte[] data, byte[] sign, byte[] id)
      用公钥检验数字签名的合法性
      Parameters:
      data - 数据
      sign - 签名
      id - 可以为null,若为null,则默认withId为字节数组:"1234567812345678".getBytes()
      Returns:
      是否验证通过
    • setPrivateKey

      public SM2 setPrivateKey(PrivateKey privateKey)
      Description copied from class: Asymmetric
      设置私钥
      Overrides:
      setPrivateKey in class Asymmetric<SM2>
      Parameters:
      privateKey - 私钥
      Returns:
      this
    • setPrivateKeyParams

      public SM2 setPrivateKeyParams(org.bouncycastle.crypto.params.ECPrivateKeyParameters privateKeyParams)
      设置私钥参数
      Parameters:
      privateKeyParams - 私钥参数
      Returns:
      this
    • setRandom

      public SM2 setRandom(SecureRandom random)
      设置随机数生成器,可自定义随机数种子
      Parameters:
      random - 随机数生成器,可自定义随机数种子
      Returns:
      this
    • setPublicKey

      public SM2 setPublicKey(PublicKey publicKey)
      Description copied from class: Asymmetric
      设置公钥
      Overrides:
      setPublicKey in class Asymmetric<SM2>
      Parameters:
      publicKey - 公钥
      Returns:
      this
    • setPublicKeyParams

      public SM2 setPublicKeyParams(org.bouncycastle.crypto.params.ECPublicKeyParameters publicKeyParams)
      设置公钥参数
      Parameters:
      publicKeyParams - 公钥参数
      Returns:
      this
    • decrypt

      public byte[] decrypt(String data)
      使用私钥解密
      Parameters:
      data - SM2密文,实际包含三部分:ECC公钥、真正的密文、公钥和原文的SM3-HASH值
      Returns:
      解密后的bytes
    • usePlainEncoding

      public SM2 usePlainEncoding()
      设置DSA signatures的编码为PlainDSAEncoding
      Returns:
      this
    • setEncoding

      public SM2 setEncoding(org.bouncycastle.crypto.signers.DSAEncoding encoding)
      设置DSA signatures的编码
      Parameters:
      encoding - DSAEncoding实现
      Returns:
      this
    • setDigest

      public SM2 setDigest(org.bouncycastle.crypto.Digest digest)
      设置Hash算法
      Parameters:
      digest - Digest实现
      Returns:
      this
    • setMode

      public SM2 setMode(org.bouncycastle.crypto.engines.SM2Engine.Mode mode)
      设置SM2模式,旧版是C1C2C3,新版本是C1C3C2
      Parameters:
      mode - SM2Engine.Mode
      Returns:
      this
    • getD

      public byte[] getD()
      获得私钥D值(编码后的私钥)
      Returns:
      D值
    • getDHex

      public String getDHex()
      获得私钥D值(编码后的私钥)
      Returns:
      D值
    • getDBigInteger

      public BigInteger getDBigInteger()
      获得私钥D值
      Returns:
      D值
    • getQ

      public byte[] getQ(boolean isCompressed)
      获得公钥Q值(编码后的公钥)
      Parameters:
      isCompressed - 是否压缩
      Returns:
      Q值
    • decrypt

      public byte[] decrypt(byte[] data, org.bouncycastle.crypto.CipherParameters privateKeyParameters) throws org.miaixz.bus.core.lang.exception.CryptoException
      解密
      Parameters:
      data - SM2密文,实际包含三部分:ECC公钥、真正的密文、公钥和原文的SM3-HASH值
      privateKeyParameters - 私钥参数
      Returns:
      加密后的bytes
      Throws:
      org.miaixz.bus.core.lang.exception.CryptoException - 包括InvalidKeyException和InvalidCipherTextException的包装异常
    • setRemoveCompressedFlag

      public SM2 setRemoveCompressedFlag(boolean removeCompressedFlag)
      设置是否移除压缩标记,默认为false 移除后的密文兼容gmssl等库
      Parameters:
      removeCompressedFlag - 是否移除压缩标记
      Returns:
      this