龙空技术网

旗舰版 JAVA 接口文档

有趣的灵魂yesAZJl 122

前言:

眼前你们对“java接口成员”大致比较着重,你们都需要了解一些“java接口成员”的相关内容。那么小编在网络上搜集了一些对于“java接口成员””的相关知识,希望朋友们能喜欢,咱们快快来学习一下吧!

说明

Java 语言 SDK,底层通过 C 实现算法,通过 jni 封装后,作为本地接口供 Java 语言调用。

错误码

异常码

说明

0

正常返回

10010

sdk 初始化错误

10011

DataKeyManager 无效,不能为 null

10013

加密上下文超过最大长度,最大长度为1024

10012

算法不支持

10014

解密密钥获取失败

10015

加密密钥过期,重置密钥

10016

参数不能为空

10017

无效的 key

10018

无效的 iv

10019

aad 不能为 null

10020

密钥缓存初始化错误

20011

数据密钥创建异常

20012

签名检查异常

20013

腾讯 KMS 加密或解密异常

20014

无效参数,主密钥个数超过最大值,最大值为5

20015

域名为 null,且环境变量未设置域名

20016

主密钥 keyId 或 region 为空

初始化 SDK 接口EncryptSdk.initSdk功能描述:检验用户是否开通 KMS 旗舰版服务。输入参数:

参数名称

必选

类型

描述

region

String

CMK 地域信息字符串,详见产品支持的 地域列表

secretId

String

云账户 API 密钥 ID 值

secretKey

String

云账号 API 密钥 Key 值

domainName

String

域名信息字符串

返回值:接口返回一个整数。当接口返回值为0,表示初始化成功。当接口返回值非0,代表初始化失败。

注意:

需注意 SecretId 和 SecretKey 的保密存储: 腾讯云接口认证主要依靠 SecretID 和 SecretKey,SecretID 和 SecretKey 是用户的唯一认证凭证。业务系统需要该凭证调用腾讯云接口。需注意 SecretID 和 SecretKey 的权限控制:建议使用子账号,根据业务需要进行接口授权的方式管控风险。需注意 domainName 的设置:如果 domainName 入参为"",则从环境变量 TENCENT_SDK_DOMAIN 中读取值,反之,则以入参为准。

KMS加密方式的接口说明EncryptSdk.createKeyManager功能描述:初始化用户的主密钥,包含主密钥信息、密钥加密次数、密钥生效时间等,具体看后续参数。参数说明:

参数名称

必选

类型

描述

masterKey

List

主密钥(CMK)信息列表

msgCount

KeyCache

每个缓存 DataKey 可加密的消息数量,加密的数量达到后,会重新向 KMS 后台请求,生成新的 DataKey,设置为0表示没有限制使用次数。

enExpiretime

KeyCache

加密使用的 DataKey 在缓存中的有效期,单位为秒。和消息数量一起生效,消息数量超过或者超时时间达到,都会触发 DataKey 的替换,0表示不过期。

deExpiretime

KeyCache

解密使用的 DataKey 缓存的有效期,单位为秒,0表示不过期。

secretId

String

云账户 API 密钥 ID 值

secretKey

String

云账号 API 密钥 Key 值

返回值:接口返回 DataKeyManager 对象。当接口返回值正常,表示初始化成功。当接口返回值抛异常,代表初始化失败。

注意:

初始化 keyManager 对象方法:

EncryptSdk.createKeyManager(List masterKey, KeyCache keyCache,String secretId, String secretKey)。masterKey:主密钥的集合,最多5个主密钥。keyChe:密钥缓存对象,三个成员变量 msgCount、enExpiretime、deExpiretime。

EncryptSdk.Encrypt功能描述:使用 KMS 平台创建的 DataKey,进行本地数据加密。输入参数:

参数名称

必选

类型

描述

masterKeys

List

主密钥(CMK)信息列表

source

byte[]

待加密的明文数据

keyManager

kms_enc_sdk.KeyManager

已经初始化的 KeyManager 结构体指针

algorithm

KmsSdk.Algorithm

算法枚举值,参照后面算法列表

encryptionContext

String

用于标识 DataKey 的辅助字段,key/value 对的 json 字符串格式,最大支持2048字节。如:{"name":"test","date":"20200228"}

blockSize

int

0 表示加密时不分块加密,非0表示分块加密以及分块大小,单位 byte

返回值:接口返回 EncryptResult 对象。当接口返回值正常,代表加密成功。当接口返回值抛异常,代表加密失败。

注意:

加密后的数据,会加入 DataKey 相关信息,只能使用 KMS 密钥保护方式的接口进行解密。

EncryptSdk.Decrypt功能描述:方法用于解密密文,得到明文数据。输入参数:

参数名称

必选

类型

描述

source

byte[]

加密后的数据

keyManager

DataKeyManager

已经初始化的 KeyManager 对象

返回值:接口返回 DecryptResult 对象。当接口返回值正常,代表解密成功。当接口返回值抛异常,代表解密失败。Algorithm 支持的加密算法列表

枚举值

数值

说明

SM4_CBC_128_WITH_SIGNATURE

1

使用 SM3HA C签名的 SM4 CBC 模式

SM4_CBC_128

2

不使用签名的 SM4 CBC 模式加密

SM4_GCM_128_WITH_SIGNATURE

3

使用 SM3HAC 签名的 SM4 GCM 模式

SM4_GCM_128

4

不使用签名的 SM4 GCM 模式加密算法

SM4_CTR_128_WITH_SIGNATURE

5

使用 SM3HAC 签名的 SM4 CTR 模式

SM4_CTR_128

6

不使用签名的 SM4 CTR 模式

SM4_ECB_128_WITH_SIGNATURE

7

使用 SM3HAC 签名的 SM4 ECB 模式

SM4_ECB_128

8

不使用签名的 SM4 ECB 模式

原生加密方式接口说明原生加密方式对应的服务也需要升级为旗舰版,与 KMS 密钥保护方式相比,原生加密方式需要用户自己生成加密密钥进行加解密,来保证密钥的安全性。出于安全与合规的考虑,建议用户使用 KMS 密钥保护方式。其中CTR模式加密没有填充,其他的模式加密采用 PKCS#7 标准进行填充。EncryptSdk.genSm2KeyPair功能描述:使用 SM2 算法生成密钥对。输入参数:无需填充输入参数。返回值:接口返回一个字节数组(包含生成的公钥值、私钥值)。当接口返回返回值正常,表示获取密钥对成功。当接口返回值抛异常,代表获取失败。EncryptSdk.sm2Sign功能描述:使用 SM2 算法进行签名。输入参数:

参数名称

必选

类型

描述

pubKey

byte[]

公钥内容,数据长度固定为64字节

priKey

byte[]

私钥内容,数据长度固定为32字节

source

byte[]

原文数据

返回值:接口返回一个包含签名内容的字节数组。当接口返回值正常,代表签名成功。当接口返回值抛异常,代表签名失败。

注意:

公钥和私钥的长度为固定长度,用户如果输入长度不一致的数据,可能导致内存访问异常。

EncryptSdk.sm2Verify功能描述:使用 SM2 算法进行验签。输入参数:

参数名称

必选

类型

描述

pubkey

byte[]

公钥内容,数据长度固定为64字节

sign

byte[]

签名后的数据

source

byte[]

原文数据

返回值:接口返回一个 boolean 值。当接口返回值为 true,表示验签成功。当接口返回值非 true,代表验签失败。

注意:

公钥长度为固定长度64字节,用户如果输入长度不一致的数据,可能导致内存访问异常。

EncryptSdk.sm2Encrypt功能描述:使用 SM2 算法进行加密。输入参数:

参数名称

必选

类型

描述

pubkey

byte[]

公钥内容,数据长度为64字节

source

byte[]

源数据

返回值:接口返回一个包含加密后的密文内容的字节数组。当接口返回值正常,代表加密成功。当接口返回值抛异常,代表加密失败。

>! SM2 加密适用于小数据的场景,不建议加密超过256k的数据。EncryptSdk.sm2Decrypt功能描述:使用 SM2 算法进行解密。输入参数:

参数名称

必选

类型

描述

prikey

byte[]

私钥内容,数据长度固定为32字节

source

byte[]

加密后的数据

返回值:接口返回一个包含解密后的明文内容的字节数组。当接口返回值正常,代表解密成功。当接口返回值抛异常,代表解密失败。EncryptSdk.sm2PemChangeToPubkey功能描述:对 pem 格式的公钥内容进行转换。输入参数:

参数名称

必选

类型

描述

pemPubKeyInfo

byte[]

pem 格式的公钥信息

返回值:接口返回一个包含转换后的公钥内容的字节数组。当接口返回值正常,代表转换成功。当接口返回值抛异常,代表转换失败。EncryptSdk.hashForSM3WithSM2功能描述:使用 Sm2GetKey 接口生成的公钥,并基于 SM3 算法生成信息摘要。输入参数:

参数名称

必选

类型

描述

msg

byte[]

原文数据

pubKey

byte[]

公钥内容,数据长度固定为64字节

id

byte[]

ID 值

返回值:接口返回一个包含生成的摘要内容的字节数组。当接口返回值正常,代表摘要生成成功。当接口返回值抛异常,代表摘要生成失败。EncryptSdk.sm2SignWithDigest功能描述:使用本地生成的消息摘要生成签名输入参数:

参数名称

必选

类型

描述

pubKey

byte[]

公钥内容,数据长度固定为64字节

priKey

byte[]

私钥内容,数据长度固定为32字节

digest

byte[]

HashForSM3WithSM2 生成的摘要信息内容

返回值:接口返回一个包含生成的签名内容的字节数组。当接口返回值正常,代表签名成功。当接口返回值抛异常,代表摘要签名失败。EncryptSdk.sm2VerifyWithDigest功能描述:通过生成的摘要内容进行验签。输入参数:

参数名称

必选

类型

描述

pubKey

byte[]

公钥内容,数据长度固定为64字节

sig

byte[]

Sm2SignWithDigest 生成的签名内容

digest

byte[]

HashForSM3WithSM2 生成的摘要信息内容

返回值:接口返回一个整数。当接口返回的整数信息为0,代表验签成功。当接口返回的整数信息为非0,代表摘要验签失败。EncryptSdk.sm3Hmac功能描述:使用 SM3 哈希运算 Hmac 计算。输入参数:

参数名称

必选

类型

描述

source

byte[]

原文数据

hmacKey

byte[]

计算 Hmac 的密钥内容

返回值:接口返回一个包含 Hmac 内容的字节数组。当接口返回值正常,代表 Hmac 计算成功。当接口返回值抛异常,代表 Hmac 计算失败。EncryptSdk.sm3Digest功能描述:使用 SM3 生成摘要。输入参数:

参数名称

必选

类型

描述

source

byte[]

原文数据

返回值:接口返回一个包含摘要内容的字节数组。当接口返回值正常,代表生成摘要成功。当接口返回值抛异常,代表生成摘要失败。EncryptSdk.sm4CbcEncrypt/EncryptSdk.sm4CtrEncrypt功能描述:方法是用于 SM4 加密算法 CBC、CTR 模式下的加密。输入参数:

参数名称

必选

类型

描述

source

byte[]

原文数据

Key

byte[]

用户自定义的SM4密钥,长度固定为128位(16字节),不能设置为空

iv

byte[]

初始化向量,固定为128位(16字节),不能设置为空

返回值:接口返回一个包含加密后的密文内容的字节数组。当接口返回值正常,代表加密成功。当接口返回值抛异常,代表加密失败。EncryptSdk.sm4CbcDecrypt/EncryptSdk.sm4CtrDecrypt功能描述:方法是用于 SM4 加密算法 CBC、CTR 模式下的解密。输入参数:

参数名称

必选

类型

描述

source

byte[]

加密后的数据

Key

byte[]

用户自定义的 SM4 密钥,长度固定为128位(16字节),不能设置为空

iv

byte[]

初始化向量,固定为128位(16字节),不能设置为空

返回值:接口返回一个包含解密后的明文内容的字节数组。当接口返回值正常,代表解密成功。当接口返回值抛异常,代表解密失败。EncryptSdk.sm4EcbEncrypt功能描述:方法是用于 SM4 加密算法 ECB 模式下的加密。输入参数:

参数名称

必选

类型

描述

source

byte[]

原文数据

Key

byte[]

用户自定义的 SM4 密钥,长度固定为128位(16字节),不能设置为空

返回值:接口返回一个包含加密后的密文内容的字节数组。当接口返回值正常,代表加密成功。当接口返回值抛异常,代表加密失败。EncryptSdk.sm4EcbDecrypt功能描述:方法是用于 SM4 加密算法 ECB 模式下的解密。输入参数:

参数名称

必选

类型

描述

source

byte[]

加密后的数据

Key

byte[]

用户自定义的 SM4 密钥,长度固定为128位(16字节),不能设置为空

返回值:接口返回一个包含解密后的明文内容的字节数组。当接口返回值正常,代表解密成功。当接口返回值抛异常,代表解密失败。EncryptSdk.sm4GcmEncrypt功能描述:方法是用于 SM4 加密算法 GCM 模式下的加密。输入参数:

参数名称

必选

类型

描述

source

byte[]

原文数据

key

byte[]

用户自定义的 SM4 密钥,长度固定为128位(16字节),不能设置为空

iv

byte[]

初始化向量,不能设置为空

aad

byte[]

附加校验信息

返回值:接口返回一个 Map 对象。当接口返回值正常,代表加密成功。当接口返回值抛异常,代表加密失败。EncryptSdk.sm4GcmDecrypt功能描述:方法是用于 SM4 加密算法 GCM 模式下的解密。输入参数:

参数名称

必选

类型

描述

source

byte[]

加密后的数据

key

byte[]

用户自定义的 SM4 密钥,长度固定为128位(16字节),不能设置为空

iv

byte[]

初始化向量,不能设置为空

aad

byte[]

附加校验信息

tag

byte[]

tag 值,即校验码

返回值:接口返回一个包含解密后的明文内容的字节数组。当接口返回值正常,代表解密成功。当接口返回值抛异常,代表解密失败。接口调用示例

说明:

接口示例适用以下加密方式:

KMS 方式加解密原生加密方式

import com.ciphergateway.sdk.EncryptSdk;import com.ciphergateway.sdk.exception.SdkException;import com.ciphergateway.sdk.exception.SdkExceptionEnum;import com.ciphergateway.sdk.vo.*;import kmsmsg.KmsSdk;import javax.xml.bind.DatatypeConverter;import java.io.DataInputStream;import java.io.FileInputStream;import java.io.UnsupportedEncodingException;import java.util.Arrays;import java.util.List;import java.util.Map;/** * @ClassName : TestSdk * @Description : ${description} * @Author : crisp * @Date: 2020-06-28 14:25 */public class DemoSdkTest {    public  static String secretId = "replace-with-real-secretId";    public static String secretKey = "replace-with-real-secretKey";    public static String keyID1_guangzhou="replace-with-realkeyid";    public static String keyID2_shanghai="replace-with-realkeyid";    public static String algorithmPath = "real-algorithm-path"; //libkms_enc_sdk_jni.so文件路径,例如:/root/user/kms_enc_sdk_java/lib/linux/libkms_enc_sdk_jni.so    private static int ret = 0;    static {        //初始化sdk,此处启动程序只需执行一次,返回0说明初始化成功        try {            ret = EncryptSdk.initSdk("ap-shanghai", secretId, secretKey, null);        } catch (SdkException e) {            e.printStackTrace();        }        System.out.println("init encrypt worker status is " + ret);        //linux 环境下加载方式        System.load(algorithmPath);        //windows环境下配置方式,需要把windows库的路径加入到系统的环境变量(path环境变量)中        //System.load("D:\\java\\tencent-kms-sdk\\src\\main\\resources\\lib\\windows\\libkms_enc_sdk_jni.dll");    }    public static void main(String[] args) throws UnsupportedEncodingException, SdkException {        if (ret != 0) {            throw new SdkException(new ErrorInfo(SdkExceptionEnum.TENCENT_DOMAIN_NAME_NULL.message, null).toString());        }        MasterKey key1 = new MasterKey();        key1.setKeyId(keyID1_guangzhou);        key1.setRegion("ap-guangzhou");        MasterKey key2 = new MasterKey();        key2.setKeyId(keyID2_shanghai);        key2.setRegion("ap-shanghai");        //构建datamanager所需要的参数        List<MasterKey> list = Arrays.asList(key1, key2, key1, key2, key1);        DataKeyManager dataKeyManager = null;        try {            dataKeyManager = EncryptSdk.createKeyManager(list, new KeyCache(2, 0, 0), secretId, secretKey);        } catch (Exception e) {            e.printStackTrace();        } finally {            //System.out.println(" error occur");        }        String cipherBlob = "test1234567890";        long start = System.currentTimeMillis();        String encryptionContext = "{\"ceshi\":\"fgdfgdfgdg\"}";        //Test_CBCEnAndDe_withEncryptionContextNotjosnformatParams();        for (int i = 0; i < 5; i++) {            // encryptionContext =  Constant.EMPTY;            //encryptionContext = "afa";            EncryptResult result = null;            try {                result = EncryptSdk.Encrypt(list, cipherBlob.getBytes(), dataKeyManager, KmsSdk.Algorithm.SM4_GCM_128, encryptionContext, 7);                // System.out.println("------------result------------"+result);            } catch (Exception e) {                e.printStackTrace();            }            try {                DecryptResult decryptResult = EncryptSdk.Decrypt(result.getCipher(), dataKeyManager);                if (new String(decryptResult.getPlainText()).equals(cipherBlob)) {                    continue;                } else {                    System.out.println("decrypt faild");                }            } catch (Exception e) {                e.printStackTrace();            }        }        long end = System.currentTimeMillis();        System.out.println("encrypt 5 times costs: "+(end-start)/1000 +"  seconds");        System.out.println("----------------------------------------------------------------------------------------------------------------------------------------------");        System.out.println("begin to en");        com.ciphergateway.encryptsdk.EncryptSdk enf = new com.ciphergateway.encryptsdk.EncryptSdk();        String data = "1234567890123456";        String key = "0123456789abcdef";        String iv = "0123456789abcdef";        String aad = "0123456789abcdef";        String region = "ap-guangzhou";        byte[] pubkey = {(byte) 0xcd, (byte) 0x70, (byte) 0x6a, (byte) 0xc4, (byte) 0xc6, (byte) 0x00, (byte) 0x7c, (byte) 0x67, (byte) 0xed, (byte) 0xa7, (byte) 0xdc, (byte) 0xa7, (byte) 0x3f, (byte) 0x8a, (byte) 0xed, (byte) 0x55, (byte) 0x2d, (byte) 0x75, (byte) 0x12, (byte) 0x21, (byte) 0xb5, (byte) 0x8a, (byte) 0x81, (byte) 0xaa, (byte) 0xbb, (byte) 0xd6, (byte) 0xe2, (byte) 0x85, (byte) 0x15, (byte) 0xa5, (byte) 0x23, (byte) 0xf3, (byte) 0x5e, (byte) 0xe5, (byte) 0x05, (byte) 0x9d, (byte) 0xf0, (byte) 0x4b, (byte) 0x1b, (byte) 0xee, (byte) 0x7e, (byte) 0x90, (byte) 0x21, (byte) 0x50, (byte) 0x58, (byte) 0x07, (byte) 0x3a, (byte) 0xd5, (byte) 0x63, (byte) 0x9f, (byte) 0x0a, (byte) 0xd0, (byte) 0x2e, (byte) 0x33, (byte) 0x67, (byte) 0xe5, (byte) 0xd9, (byte) 0x71, (byte) 0x66, (byte) 0xd9, (byte) 0x57, (byte) 0xeb, (byte) 0x1a, (byte) 0xb1};        byte[] prikey = {(byte) 0x55, (byte) 0x13, (byte) 0xa7, (byte) 0xe3, (byte) 0x18, (byte) 0x4f, (byte) 0x28, (byte) 0x55, (byte) 0xd3, (byte) 0x20, (byte) 0x9a, (byte) 0x2f, (byte) 0x5e, (byte) 0x24, (byte) 0xd3, (byte) 0x6c, (byte) 0xa9, (byte) 0xb2, (byte) 0x8e, (byte) 0x13, (byte) 0x3d, (byte) 0xa9, (byte) 0x74, (byte) 0xb8, (byte) 0xbc, (byte) 0xff, (byte) 0xfa, (byte) 0xa9, (byte) 0x7e, (byte) 0x8e, (byte) 0x0a, (byte) 0x5a};        //sm4 ctr enc        byte[] enctrdata = EncryptSdk.sm4CtrEncrypt(data.getBytes(), key.getBytes(), iv.getBytes());        ////sm4 ctr dec        byte[] dectrdata = EncryptSdk.sm4CtrDecrypt(enctrdata, key.getBytes(), iv.getBytes());        System.out.println("Sm4CtrDecrypt:" + new String(dectrdata));        //sm4 cbc enc        byte[] encbcdata = EncryptSdk.sm4CbcEncrypt(data.getBytes(), key.getBytes(), iv.getBytes());        //sm4 cbc dec        byte[] decbcdata = EncryptSdk.sm4CbcDecrypt(encbcdata, key.getBytes(), iv.getBytes());        String result = new String(decbcdata);        System.out.println("Sm4CbcDecrypt:" + result);        //sm4 ecb enc        byte[] enecbdata = EncryptSdk.sm4EcbEncrypt(data.getBytes(), key.getBytes());        //sm4 ecb dec        byte[] deecbdata = EncryptSdk.sm4EcbDecrypt(enecbdata, key.getBytes());        System.out.println("Sm4EcbEncrypt:" + new String(deecbdata));        //sm4 gcm enc        Map<String, byte[]> map = EncryptSdk.sm4GcmEncrypt(data.getBytes(), key.getBytes(), iv.getBytes(), "".getBytes());        if (!map.isEmpty()) {            byte[] realdata = map.get("data");            byte[] tagdata = map.get("tag");            //sm4 gcm dec            byte[] degcmdata = EncryptSdk.sm4GcmDecrypt(realdata, key.getBytes(), iv.getBytes(), "".getBytes(), tagdata);            System.out.println("Sm4GcmDecrypt:" + new String(degcmdata));        }        //sm3计算hmac 值        byte[] hmac = EncryptSdk.sm3Hmac(data.getBytes(), key.getBytes());        System.out.print("Sm3Hmac(len):");        System.out.println(hmac.length);        //生成公私钥对,字节数组长度是96字节,前64字节为公钥,后32字节为私钥        byte[] keyPair = EncryptSdk.genSm2KeyPair();        System.out.println("The derived key --> " + DatatypeConverter.printHexBinary(keyPair));        String plainmsg = "hello, bingo";        System.out.println("the input message " + plainmsg);        //sm2 加密        byte[] sm2encbyte = EncryptSdk.sm2Encrypt(Arrays.copyOf(keyPair, 64), plainmsg.getBytes());        System.out.println("sm2 encrypt --> " + DatatypeConverter.printHexBinary(sm2encbyte));        //sm2解密        byte[] sm2decbyte = EncryptSdk.sm2Decrypt(Arrays.copyOfRange(keyPair, keyPair.length - 32, keyPair.length), sm2encbyte);        System.out.println("sm2 decrypt --> " + new String(sm2decbyte));        //签名        byte[] sign = EncryptSdk.sm2Sign(pubkey, prikey, data.getBytes());        //验证签名        boolean isRight = EncryptSdk.sm2Verify(pubkey, sign, data.getBytes());        System.out.println(isRight);        System.out.println("=============================2021-02-24========================================");        //sm3 digest        byte[] digest_message = EncryptSdk.sm3Digest(data.getBytes());        System.out.println("digest message " + DatatypeConverter.printHexBinary(digest_message));        String smid = "1234567812345678";        byte[] sm2sm3hash = EncryptSdk.hashForSM3WithSM2(data.getBytes(), pubkey, smid.getBytes());        System.out.println("HashForSM3WithSM2  hash " + DatatypeConverter.printHexBinary(sm2sm3hash));        byte[] sm2digest = EncryptSdk.sm2SignWithDigest(pubkey, prikey, sm2sm3hash);        System.out.println("Sm2SignWithDigest " + DatatypeConverter.printHexBinary(sm2digest));        int sm2verify1 = EncryptSdk.sm2VerifyWithDigest(pubkey, sm2digest, sm2sm3hash);        System.out.println("Sm2VerifyWithDigest " + sm2verify1);        String pem = "-----BEGIN PUBLIC KEY-----\n";        pem += "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE5rwEIw9e5fX87uSN7C/vy6lyEZ2R\n";        pem += "gzLqWLnY8EPN1C+nJP2v4rLgaQCbHV38+vBVLimbLmdccLM69R83JxpxuQ==\n";        pem += "-----END PUBLIC KEY-----\n";        byte[] pk = EncryptSdk.sm2PemChangeToPubkey(pem.getBytes());        System.out.println("Sm2PemChangeToPubkey " + DatatypeConverter.printHexBinary(pk));    }}

小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。我有一些面试题、架构、设计类资料可以说是程序员面试必备!

所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【111】即可免费获取

出处:

标签: #java接口成员