关于JAVA实现SM4算法的一些

示例代码


import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author
 * @create
 */
public class Sm4Utils {

  private static final Logger LOGGER = LoggerFactory.getLogger(Sm4Utils.class);

  private static final String ALGORITHM_NAME = "SM4";
  private static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";

  /**
   * SM4算法目前只支持128位(即密钥16字节)
   */
  private static final int DEFAULT_KEY_SIZE = 128;

  private static Object lock = new Object();

  static {
    Security.addProvider(new BouncyCastleProvider());
  }

  /**
   * 加密
   *
   * @param data 数据
   * @param key  秘钥
   * @return 密文
   */
  public static byte[] encrypt(byte[] data, byte[] key) throws Exception {

    SecretKey secretKey = new SecretKeySpec(key, ALGORITHM_NAME);
    Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_ECB_PADDING,
        BouncyCastleProvider.PROVIDER_NAME);
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    byte[] encryptedBytes = cipher.doFinal(data);
    return encryptedBytes;
  }

  /**
   * 解密
   *
   * @param data 数据
   * @param key  秘钥
   * @return 明文
   */
  public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
    SecretKey secretKey = new SecretKeySpec(key, ALGORITHM_NAME);
    Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_ECB_PADDING,
        BouncyCastleProvider.PROVIDER_NAME);
    cipher.init(Cipher.DECRYPT_MODE, secretKey);
    byte[] decryptedBytes = cipher.doFinal(data);
    return decryptedBytes;
  }

  public static void main(String[] args) throws Exception {

    /**
     * SM4算法目前只支持128位(即密钥16字节)
     */
    String key = "nXwqj7JVe@czbD4E";
    System.out.println("key:" + key);
    String data = "正文6666666";

    /**
     * 加密
     */
    byte[] encrypt = Sm4Utils.encrypt(data.getBytes("UTF-8"), key.getBytes("UTF-8"));
    // 转换为标准的Base64字符串
    String encryptStr = Base64.encodeBase64String(encrypt);
    System.out.println("加密:" + encryptStr);

    /**
     * 解密
     */
    byte[] decryptBytes = Base64.decodeBase64(encryptStr);
    byte[] decrypt = Sm4Utils.decrypt(decryptBytes, key.getBytes("UTF-8"));
    String decryptStr = new String(decrypt);
    System.out.println("解密:" + decryptStr);

  }

}

下载所需要的jar包

bcprov-jdk15to18-1.72.jar

commons-codec-1.15.jar

slf4j-api-1.7.36.jar

这三个jar包

然后放到和SM4Utils.java文件同一路径

打开cmd

在当前文件目录下输入命令:
javac  -encoding UTF-8 -cp .;bcprov-jdk15to18-1.72.jar;slf4j-api-1.7.36.jar;commons-codec-1.15.jar Sm4Utils.java

生成文件后执行命令:
java -Dfile.encoding=UTF-8 -cp .;bcprov-jdk15to18-1.72.jar;slf4j-api-1.7.36.jar;commons-codec-1.15.jar Sm4Utils

你可能感兴趣的:(密码学,java,算法)