docs: private byte[] encrypt(byte[] in, int inOff, int inLen) {
  		// 加密数据
  		byte[] c2 = new byte[inLen];
  		System.arraycopy(in, inOff, c2, 0, c2.length);
  
  		final ECMultiplier multiplier = createBasePointMultiplier();
  
  		byte[] c1;
  		ECPoint kPB;
  		BigInteger k;
  		do {
  			k = nextK();
  			// 产生随机数计算出曲线点C1
  			c1 = multiplier.multiply(ecParams.getG(), k).normalize().getEncoded(false);
  			kPB = ((ECPublicKeyParameters) ecKey).getQ().multiply(k).normalize();
  			kdf(kPB, c2);
  		} while (notEncrypted(c2, in, inOff));
  
  		// 杂凑值，效验数据
  		byte[] c3 = new byte[digest.getDigestSize()];
  
  		addFieldElement(kPB.getAffineXCoord());
  		this.digest.update(in, inOff, inLen);
  		addFieldElement(kPB.getAffineYCoord());
  
  		this.digest.doFinal(c3, 0);
  
  		// 按照对应模式输出结果
  		switch (mode) {
  		case C1C3C2:
  			return Arrays.concatenate(c1, c3, c2);
  		default:
  			return Arrays.concatenate(c1, c2, c3);
  		}
  	}