Blame view

src/main/java/com/jfinal/weixin/sdk/encrypt/PKCS7Encoder.java 1.75 KB
e80df919   atao   init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  /**
   * 对公众平台发送给公众账号的消息加解密示例代码.
   *
   * @copyright Copyright (c) 1998-2014 Tencent Inc.
   */
  
  // ------------------------------------------------------------------------
  
  package com.jfinal.weixin.sdk.encrypt;
  
  import com.jfinal.weixin.sdk.utils.Charsets;
  
  import java.util.Arrays;
  
  /**
   * 提供基于PKCS7算法的加解密接口.
   */
  class PKCS7Encoder {
      static int BLOCK_SIZE = 32;
  
      /**
       * 获得对明文进行补位填充的字节.
       *
       * @param count 需要进行填充补位操作的明文字节个数
       * @return 补齐用的字节数组
       */
      static byte[] encode(int count) {
          // 计算需要填充的位数
          int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
          if (amountToPad == 0) {
              amountToPad = BLOCK_SIZE;
          }
          // 获得补位所用的字符
          char padChr = chr(amountToPad);
          String tmp = new String();
          for (int index = 0; index < amountToPad; index++) {
              tmp += padChr;
          }
          return tmp.getBytes(Charsets.UTF_8);
      }
  
      /**
       * 删除解密后明文的补位字符
       *
       * @param decrypted 解密后的明文
       * @return 删除补位字符后的明文
       */
      static byte[] decode(byte[] decrypted) {
          int pad = (int) decrypted[decrypted.length - 1];
          if (pad < 1 || pad > 32) {
              pad = 0;
          }
          return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
      }
  
      /**
       * 将数字转化成ASCII码对应的字符,用于对明文进行补码
       *
       * @param a 需要转化的数字
       * @return 转化得到的字符
       */
      static char chr(int a) {
          byte target = (byte) (a & 0xFF);
          return (char) target;
      }
  
  }