• Java SDK性能测试代码1.1.0_2.3.4.8修改_20220824


    本次修改:

    1、各算法的调用接口修改后,测试代码(runnable任务)都需要修改

    2、algorithm入参和出参

    Common.java调用,入参明文是String,以及算法AlgorithmEnum.valueOf(algorithm);

    3、SM2 web接口获取KeyIdSm2

    1、Runnable任务修改

    1.1、EncTask.java,其他加密任务EncTask_FPE.java,NumberEncTask.java类似

    1. 原有:
    2. private byte[] plain;
    3. public EncTask(CyclicBarrier barrier, int loopNum, int index, String algorithm, byte[] plain, ThreadData threadData){}
    4. // 2.3.1版本的加密方法调用//byte[] cipherData = CipherSuiteUtils.encrypt(plain, algorithm, keyId, metadata, iv);
    5. 修改成:
    6. private String plain;
    7. public EncTask(CyclicBarrier barrier, int loopNum, int index, String algorithm, String plain, ThreadData threadData){}
    8. // 2.3.1版本的加密方法调用
    9. //byte[] cipherData = CipherSuiteUtils.encrypt(plain, algorithm, keyId, metadata, iv);
    10. // 2.3.4.8版本的加密方法调用
    11. String cipherData = CryptoUtil.encrypt(plain, AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv);

    1.2、DecTask,其他解密任务DecTask_FPE.java,NumberDecTask.java类似

    1. 原有:
    2. private byte[] cipher;
    3. public DecTask(CyclicBarrier barrier, int loopNum, int index, String algorithm, byte[] cipher, ThreadData threadData){}
    4. // 2.3.1版本的加密方法调用
    5. CipherSuiteUtils.decrypt(cipher, algorithm, keyId, metadata, iv);
    6. 修改成:
    7. private String cipher;
    8. public DecTask(CyclicBarrier barrier, int loopNum, int index, String algorithm, String cipher, ThreadData threadData){}
    9. // 2.3.1版本的加密方法调用
    10. //CipherSuiteUtils.decrypt(cipher, algorithm, keyId, metadata, iv);
    11. //2.3.4.8版本的加密方法调用
    12. String decryptData = CryptoUtil.decrypt(cipher, AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv);

    1.3、增加sm2加密解密,签名验签任务类

    2、algorithm入参和出参

    2.1、ThreadData.java

    1. public class ThreadData {
    2. private int id; //编号
    3. private String algorithm; //算法名称
    4. }

    2.2、data.csv

    编号 算法 算法类型 数据大小 线程数量 循环次数 运行时间

    2.3、Common.java

    2.3.1、变量

    1. //public static byte[] iv = null; //2.3.1版本
    2. public static String iv=null;
    3. public static String keyId_SM2 = null;

    2.3.2、execute方法

    1. 修改:
    2. public static ThreadData execute(ThreadData data){
    3. //明文数据
    4. int length=data.getDataSize();
    5. log.info("数据(大小)长度:"+length);
    6. byte[] plainByte= new byte[length];
    7. for (int i=0; i
    8. plainByte[i] = (byte) 0x61; //length长度的a字节数组
    9. }
    10. String plainData=new String(plainByte, StandardCharsets.UTF_8);
    11. //CipherSuiteUtils.encrypt(plainData, "SM4_GCM", keyId, metadata, iv); //2.3.1版本
    12. CryptoUtil.encrypt(plainData, AlgorithmEnum.valueOf("SM4_GCM"), keyId, metadata, iv); //2.3.4.8版本
    13. switch部分全部修改,例如:
    14. //开始执行
    15. switch (algorithm) {
    16. case "SM4_ECB":
    17. case "SM4_CBC":
    18. case "SM4_CTR":
    19. case "SM4_GCM":
    20. case "AES_ECB":
    21. case "AES_CBC":
    22. case "AES_CTR":
    23. case "AES_GCM":
    24. if (cryptoId == 1) {
    25. for (int i = 0; i < threadCount; i++) {
    26. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    27. exs.execute(new EncTask(barrier, loopNum, i, algorithm, plainData, data));
    28. }
    29. } else {
    30. //cipherData = CipherSuiteUtils.encrypt(plainData, "SM4_ECB", keyId, metadata, iv); //2.3.1版本
    31. cipherData = CryptoUtil.encrypt(plainData, AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv);//2.3.4.8版本
    32. for (int i = 0; i < threadCount; i++) {
    33. exs.execute(new DecTask(barrier, loopNum, i, algorithm, cipherData, data));
    34. }
    35. }
    36. break;
    37. case "FPE_EMAIL":
    38. plain = "sdktest@163.com";
    39. data.setDataSize(plain.length()); //1个字符等于1个字节B
    40. if(cryptoId == 1) {
    41. for (int i = 0; i < threadCount; i++) {
    42. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    43. exs.execute(new EncTask_FPE(barrier, loopNum, i, algorithm, plain, data));
    44. }
    45. }else {
    46. //2.3.1版本
    47. //cipher = CipherSuiteUtils.encrypt(plain, AlgorithmEnum.valueOf("FPE_EMAIL"), keyId, metadata, iv);
    48. //2.3.4.8版本
    49. cipher = CryptoUtil.encrypt(plain, AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv);
    50. for (int i = 0; i < threadCount; i++) {
    51. exs.execute(new DecTask_FPE(barrier, loopNum, i, algorithm, cipher, data));
    52. }
    53. }
    54. break;
    55. case "FPE_ID_CARD":
    56. plain = "123456789123456789";
    57. data.setDataSize(plain.length()); //1个字符等于1个字节B
    58. if(cryptoId == 1) {
    59. for (int i = 0; i < threadCount; i++) {
    60. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    61. exs.execute(new EncTask_FPE(barrier, loopNum, i, algorithm, plain, data));
    62. }
    63. }else {
    64. //2.3.1版本
    65. //cipher = CipherSuiteUtils.encrypt(plain, AlgorithmEnum.valueOf("FPE_ID_CARD"), keyId, metadata, iv);
    66. //2.3.4.8版本
    67. cipher = CryptoUtil.encrypt(plain, AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv);
    68. for (int i = 0; i < threadCount; i++) {
    69. exs.execute(new DecTask_FPE(barrier, loopNum, i, algorithm, cipher, data));
    70. }
    71. }
    72. break;
    73. case "FPE_PHONE_NUM":
    74. plain = "15387936109";
    75. data.setDataSize(plain.length()); //1个字符等于1个字节B
    76. if(cryptoId == 1) {
    77. for (int i = 0; i < threadCount; i++) {
    78. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    79. exs.execute(new EncTask_FPE(barrier, loopNum, i, algorithm, plain, data));
    80. }
    81. }else {
    82. //2.3.1版本
    83. //cipher = CipherSuiteUtils.encrypt(plain, AlgorithmEnum.valueOf("FPE_PHONE_NUM"), keyId, metadata, iv);
    84. //2.3.4.8版本
    85. cipher = CryptoUtil.encrypt(plain, AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv);
    86. for (int i = 0; i < threadCount; i++) {
    87. exs.execute(new DecTask_FPE(barrier, loopNum, i, algorithm, cipher, data));
    88. }
    89. }
    90. break;
    91. case "FPE_OFFICER_CARD":
    92. plain = "军字第00111206号";
    93. data.setDataSize(plain.length()); //1个字符等于1个字节B
    94. if(cryptoId == 1) {
    95. for (int i = 0; i < threadCount; i++) {
    96. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    97. exs.execute(new EncTask_FPE(barrier, loopNum, i, algorithm, plain, data));
    98. }
    99. }else {
    100. //2.3.1版本
    101. //cipher = CipherSuiteUtils.encrypt(plain, AlgorithmEnum.valueOf("FPE_OFFICER_CARD"), keyId, metadata, iv);
    102. //2.3.4.8版本
    103. cipher = CryptoUtil.encrypt(plain, AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv);
    104. for (int i = 0; i < threadCount; i++) {
    105. exs.execute(new DecTask_FPE(barrier, loopNum, i, algorithm, cipher, data));
    106. }
    107. }
    108. break;
    109. case "FPE_PASSPORT":
    110. plain = "G12345678";
    111. data.setDataSize(plain.length()); //1个字符等于1个字节B
    112. if(cryptoId == 1) {
    113. for (int i = 0; i < threadCount; i++) {
    114. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    115. exs.execute(new EncTask_FPE(barrier, loopNum, i, algorithm, plain, data));
    116. }
    117. }else {
    118. //2.3.1版本
    119. //cipher = CipherSuiteUtils.encrypt(plain, AlgorithmEnum.valueOf("FPE_PASSPORT"), keyId, metadata, iv);
    120. //2.3.4.8版本
    121. cipher = CryptoUtil.encrypt(plain, AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv);
    122. for (int i = 0; i < threadCount; i++) {
    123. exs.execute(new DecTask_FPE(barrier, loopNum, i, algorithm, cipher, data));
    124. }
    125. }
    126. break;
    127. case "FPE_CREDIT_CARD":
    128. plain = "6212262201023557228";
    129. data.setDataSize(plain.length()); //1个字符等于1个字节B
    130. if(cryptoId == 1) {
    131. for (int i = 0; i < threadCount; i++) {
    132. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    133. exs.execute(new EncTask_FPE(barrier, loopNum, i, algorithm, plain, data));
    134. }
    135. }else {
    136. //2.3.1版本
    137. //cipher = CipherSuiteUtils.encrypt(plain, AlgorithmEnum.valueOf("FPE_CREDIT_CARD"), keyId, metadata, iv);
    138. //2.3.4.8版本
    139. cipher = CryptoUtil.encrypt(plain, AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv);
    140. for (int i = 0; i < threadCount; i++) {
    141. exs.execute(new DecTask_FPE(barrier, loopNum, i, algorithm, cipher, data));
    142. }
    143. }
    144. break;
    145. case "FPE_IDENTIFICATION":
    146. plain = "0299233902";
    147. data.setDataSize(plain.length()); //1个字符等于1个字节B
    148. if(cryptoId == 1) {
    149. for (int i = 0; i < threadCount; i++) {
    150. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    151. exs.execute(new EncTask_FPE(barrier, loopNum, i, algorithm, plain, data));
    152. }
    153. }else {
    154. //2.3.1版本
    155. //cipher = CipherSuiteUtils.encrypt(plain, AlgorithmEnum.valueOf("FPE_IDENTIFICATION"), keyId, metadata, iv);
    156. //2.3.4.8版本
    157. cipher = CryptoUtil.encrypt(plain, AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv);
    158. for (int i = 0; i < threadCount; i++) {
    159. exs.execute(new DecTask_FPE(barrier, loopNum, i, algorithm, cipher, data));
    160. }
    161. }
    162. break;
    163. case "FPE_CHINESE":
    164. plain = "中文算法炼石测试";
    165. data.setDataSize(plain.length() * 2); //1个中午字符unicode编码等于2个字节B
    166. if(cryptoId == 1) {
    167. for (int i = 0; i < threadCount; i++) {
    168. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    169. exs.execute(new EncTask_FPE(barrier, loopNum, i,algorithm , plain, data));
    170. }
    171. }else {
    172. //2.3.1版本
    173. //cipher = CipherSuiteUtils.encrypt(plain, AlgorithmEnum.valueOf("FPE_CHINESE"), keyId, metadata, iv);
    174. //2.3.4.8版本
    175. cipher = CryptoUtil.encrypt(plain, AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv);
    176. for (int i = 0; i < threadCount; i++) {
    177. exs.execute(new DecTask_FPE(barrier, loopNum, i, algorithm, cipher, data));
    178. }
    179. }
    180. break;
    181. case "FPE_NUMBER":
    182. //byte[] plainData_fpe = "243.57".getBytes();
    183. String plainData_fpe = "243.57";
    184. data.setDataSize("243.57".length()); //1个字符等于1个字节B
    185. if(cryptoId == 1) {
    186. for (int i = 0; i < threadCount; i++) {
    187. exs.execute(new NumberEncTask(barrier, loopNum, i,algorithm , plainData_fpe, 5, 2, data));
    188. }
    189. }else {
    190. //2.3.1版本先加密取得密文再执行解密任务
    191. //byte[] cipherData_fpe = CipherSuiteUtils.fpeNumberEncrypt(plainData_fpe, "FPE_NUMBER", keyId, metadata, iv, 5, 2);
    192. BigDecimal cipherData_fpe = CryptoUtil.encryptNumber(new BigDecimal(plainData_fpe), AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv, 5 + 1, 2);
    193. for (int i = 0; i < threadCount; i++) {
    194. exs.execute(new NumberDecTask(barrier, loopNum, i, algorithm, cipherData_fpe, 5, 2, data));
    195. }
    196. }
    197. break;
    198. case "FPE_NUMBER_TWEAK":
    199. //byte[] plainData_fpe = "243.57".getBytes();
    200. plainData_fpe="243.57";
    201. data.setDataSize("243.57".length()); //1个字符等于1个字节B
    202. if(cryptoId == 1) {
    203. for (int i = 0; i < threadCount; i++) {
    204. exs.execute(new NumberEncTask(barrier, loopNum, i, algorithm, plainData_fpe, 5, 2, data));
    205. }
    206. }else {
    207. //2.3.1版本先加密取得密文再执行解密任务
    208. //cipherData_fpe = CipherSuiteUtils.fpeNumberEncrypt(plainData_fpe, "FPE_NUMBER_TWEAK", keyId, metadata, iv, 5, 2);
    209. BigDecimal cipherData_fpe = CryptoUtil.encryptNumber(new BigDecimal(plainData_fpe), AlgorithmEnum.valueOf(algorithm), keyId, metadata, iv, 5 + 1, 2);
    210. for (int i = 0; i < threadCount; i++) {
    211. exs.execute(new NumberDecTask(barrier, loopNum, i, algorithm, cipherData_fpe, 5, 2, data));
    212. }
    213. }
    214. break;
    215. case "SM3":
    216. //SM3摘要
    217. for (int i = 0; i < threadCount; i++) {
    218. //exs.execute(new DigestTask(barrier, loopNum, i, "SM3", plainData, data)); //2.3.1版本调用
    219. exs.execute(new DigestTask(barrier, loopNum, i, algorithm, plainByte, data)); //2.3.4.8版本调用
    220. }
    221. break;
    222. case "Sm2EncDec":
    223. if(cryptoId == 1) {
    224. for (int i = 0; i < threadCount; i++) {
    225. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    226. exs.execute(new Sm2EncSign(barrier, loopNum, i, "Sm2Enc", plainByte, data));
    227. }
    228. }else {
    229. byte[] cipher_sm2 = CryptoUtil.sm2Encrypt(keyId_SM2, plainByte);
    230. for (int i = 0; i < threadCount; i++) {
    231. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    232. exs.execute(new Sm2DecVerify(barrier, loopNum, i, "Sm2Dec", plainByte, cipher_sm2, data));
    233. }
    234. }
    235. break;
    236. case "Sm2SignVerify":
    237. if(cryptoId == 1) {
    238. for (int i = 0; i < threadCount; i++) {
    239. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    240. exs.execute(new Sm2EncSign(barrier, loopNum, i, "Sm2Sign", plainByte, data));
    241. }
    242. }else {
    243. byte[] sign = CryptoUtil.sm2Signature(keyId_SM2, plainByte);
    244. for (int i = 0; i < threadCount; i++) {
    245. //通过 ExecutorService 对象的 execute 方法将任务添加到线程去执行(获取到运行时间)
    246. exs.execute(new Sm2DecVerify(barrier, loopNum, i, "Sm2Verify", plainByte, sign, data));
    247. }
    248. }
    249. break;
    250. default:
    251. System.err.println("input crypto type error");
    252. break;
    253. }

    2.3.3、readData添加算法入参

    1. case 1:
    2. threadData.setAlgorithm(buf);
    3. break;

    2.3.4、writeCSVFileData添加算法入参

    + "," + "算法"
     + "," + data.getAlgorithm()

    2.3.5、SDKTest.java

    1. public class SDKTest extends Common{
    2. //执行性能测试
    3. for (ThreadData data:dataList) {
    4. log.info("id = "+ data.getId() +", algorithm = "+data.getAlgorithm()+", cryptoId = "+ data.getCryptoId() +", dataSize = "
    5. + data.getDataSize() +", threadCount = "+ data.getThreadCount() + ", loopNum = " + data.getLoopNum()
    6. +", setTime = " + data.getSetTime());
    7. ThreadData outData=Common.execute(data);
    8. //写入result.csv
    9. Common.writeCSVFileData("./result.csv",outData);
    10. }
    11. }

    3、web接口修改

    3.1、SDKWeb增加selectSm2Key方法和addSm2Key方法

    1. private String sm2KeyAlias="sm2KeyTest"; //sm2KeyAlias
    2. /**
    3. *查询SM2公私钥对
    4. */
    5. public String selectSm2Key(){
    6. //创建对象
    7. HttpsClientUtils httpUtils = new HttpsClientUtils();
    8. String url = host+"/kms/v1/jmj/sm2/list";
    9. String jsonStr = "{\"page\":1,\"limit\":10}";
    10. //请求头
    11. Map headers=new HashMap<>();
    12. headers.put("Content-Type","application/json;charset=UTF-8");
    13. headers.put("Authorization","Bearer "+token);
    14. HttpClientResult httpResult=httpUtils.doPost(url,headers,jsonStr);
    15. String resultContent=httpResult.getContent();
    16. String sm2KeyId=JsonUtil.getTargetValue(resultContent,sm2KeyAlias,"description","keyPairId");
    17. if(sm2KeyId!=null){
    18. log.info("selectSm2Key方法,sm2KeyId:"+sm2KeyId);
    19. }
    20. return sm2KeyId;
    21. }
    22. /**
    23. *新增Sm2公私钥对
    24. */
    25. public String addSm2Key(){
    26. //创建对象
    27. HttpsClientUtils httpUtils = new HttpsClientUtils();
    28. String url = host+"/kms/v1/jmj/sm2/gen-key-pair";
    29. String jsonStr = "{\"description\":\""+sm2KeyAlias+"\"}";
    30. //请求头
    31. Map headers=new HashMap<>();
    32. headers.put("Content-Type","application/json;charset=UTF-8");
    33. headers.put("Authorization","Bearer "+token);
    34. HttpClientResult httpResult=httpUtils.doPost(url,headers,jsonStr);
    35. String resultContent=httpResult.getContent();
    36. String sm2KeyId=JsonPath.read(resultContent, "$.data");
    37. if(sm2KeyId!=null){
    38. log.info("addSm2Key方法,sm2KeyId:"+sm2KeyId);
    39. }
    40. return sm2KeyId;
    41. }

    3.2、SDKTest.java增加获取keyId_SM2

    1. //从管理平台获取数据密钥
    2. List casbKeyId = getCasbKeyId();
    3. log.info("casbKeyId:" + casbKeyId);
    4. keyId = casbKeyId.get(0).toString();
    5. // SM2 密钥ID:请从密管平台获取
    6. keyId_SM2 = casbKeyId.get(1).toString();
    7. /**
    8. *CASB管理平台,查询keyId
    9. * @return List
    10. */
    11. public static List getCasbKeyId() {
    12. Login lo = new Login();
    13. String token = lo.getToken();
    14. String host = Common.readProperty("./config.properties", "HOST");
    15. SDKWeb sdkWeb = new SDKWeb(host, token);
    16. List casbKeyId=new ArrayList<>();
    17. //查询数据密钥(如没有,则新增)
    18. String moduleKeyId = sdkWeb.selectModuleKey();
    19. if (moduleKeyId == "") {
    20. moduleKeyId = sdkWeb.addModuleKey();
    21. }
    22. casbKeyId.add(moduleKeyId);
    23. //查询SM2密钥(如没有,则新增)
    24. String sm2KeyId=sdkWeb.selectSm2Key();
    25. if(sm2KeyId==null){
    26. log.info("查询接口,查询不到sm2KeyId,进行新增操作");
    27. sdkWeb.addSm2Key();
    28. }
    29. casbKeyId.add(sm2KeyId);
    30. return casbKeyId;
    31. }

    4、执行

    4.1、sdkPerfTest-1.1.0_2.3.4.8_algorithm.jar执行

    $source /etc/profile

    $java -Djava.ext.dirs=/opt/casb/lib/:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/ext -jar sdkPerfTest-1.1.0_2.3.4.8_algorithm.jar

    4.2、sdkPerfTest-1.0.8_2.3.4.8_algorithm.jar执行

    $source /etc/profile

    #Linux如果用脚本安装,那么默认安装目录为:/opt/casb/lib/

    $java -Djava.ext.dirs=/opt/casb/lib/:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/ext -jar sdkPerfTest-1.0.8_2.3.4.8_algorithm.jar

  • 相关阅读:
    vue中页面跳转白屏的解决方式,同一路由地址,参数不同跳转白屏的解决方式
    互联网公司都怎么实现分页的,拿 MySQL 使劲Limit?
    牛客竞赛每日俩题 - 动态规划2
    【监督学习】基于合取子句进化算法(CCEA)和析取范式进化算法(DNFEA)解决分类问题(Matlab代码实现)
    Linux课程四课---Linux开发环境的使用(gcc/g++编译器的相关)
    2024免费的硬盘数据恢复软件有哪些?
    奇舞周刊第 459 期 精读《web reflow》
    17-Spring AOP源码分析-AnnotationAwareAspectJAutoProxyCreator
    自定义函数
    在keil中debug分析单片机数据和函数调用过程(c51为例),使用寄存器组导致错误原因分析
  • 原文地址:https://blog.csdn.net/fen_fen/article/details/126501573