金融行业国内通用标准为SM4,对应国际标准SM4
有两种模式ECB和CBC
区别是前者只需要一个key,而后者不仅需要一个key还需要一个iv值
工具类代码如下:
package com.ebao.frontsys.batch.config;
import java.io.IOException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class SM4Utils {
private static String secretKey = "EbaoHealthyCiitc";
private static String iv = "CiitcEbaoHealthy";
private static boolean hexString = false;
private static final Scanner scan=new Scanner(System.in);
public SM4Utils()
{
}
public String encryptData_ECB(String plainText)
{
try
{
SM4_Context ctx = new SM4_Context();
ctx.isPadding = true;
ctx.mode = SM4.SM4_ENCRYPT;
byte[] keyBytes;
if (hexString)
{
keyBytes = SM4ConvertUtil.hexStringToBytes(secretKey);
}
else
{
keyBytes = secretKey.getBytes();
}
SM4 sm4 = new SM4();
sm4.sm4_setkey_enc(ctx, keyBytes);
byte[] encrypted = sm4.sm4_crypt_ecb(ctx, plainText.getBytes("GBK"));
String cipherText = new BASE64Encoder().encode(encrypted);
if (cipherText != null && cipherText.trim().length() > 0)
{
Pattern p = Pattern.compile("\\s*|\t|\r|\n");
Matcher m = p.matcher(cipherText);
cipherText = m.replaceAll("");
}
return cipherText;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
public String decryptData_ECB(String cipherText)
{
try
{
SM4_Context ctx = new SM4_Context();
ctx.isPadding = true;
ctx.mode = SM4.SM4_DECRYPT;
byte[] keyBytes;
if (hexString)
{
keyBytes = SM4ConvertUtil.hexStringToBytes(secretKey);
}
else
{
keyBytes = secretKey.getBytes();
}
SM4 sm4 = new SM4();
sm4.sm4_setkey_dec(ctx, keyBytes);
byte[] decrypted = sm4.sm4_crypt_ecb(ctx, new BASE64Decoder().decodeBuffer(cipherText));
return new String(decrypted, "GBK");
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
public static String encryptData_CBC(String plainText)
{
try
{
SM4_Context ctx = new SM4_Context();
ctx.isPadding = true;
ctx.mode = SM4.SM4_ENCRYPT;
byte[] keyBytes;
byte[] ivBytes;
if (hexString)
{
keyBytes = SM4ConvertUtil.hexStringToBytes(secretKey);
ivBytes = SM4ConvertUtil.hexStringToBytes(iv);
}
else
{
keyBytes = secretKey.getBytes();
ivBytes = iv.getBytes();
}
SM4 sm4 = new SM4();
sm4.sm4_setkey_enc(ctx, keyBytes);
byte[] encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, plainText.getBytes("GBK"));
String cipherText = new BASE64Encoder().encode(encrypted);
if (cipherText != null && cipherText.trim().length() > 0)
{
Pattern p = Pattern.compile("\\s*|\t|\r|\n");
Matcher m = p.matcher(cipherText);
cipherText = m.replaceAll("");
}
return cipherText;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
public static String decryptData_CBC(String cipherText)
{
try
{
SM4_Context ctx = new SM4_Context();
ctx.isPadding = true;
ctx.mode = SM4.SM4_DECRYPT;
byte[] keyBytes;
byte[] ivBytes;
if (hexString)
{
keyBytes = SM4ConvertUtil.hexStringToBytes(secretKey);
ivBytes = SM4ConvertUtil.hexStringToBytes(iv);
}
else
{
keyBytes = secretKey.getBytes();
ivBytes = iv.getBytes();
}
SM4 sm4 = new SM4();
sm4.sm4_setkey_dec(ctx, keyBytes);
byte[] decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, new BASE64Decoder().decodeBuffer(cipherText));
return new String(decrypted, "GBK");
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
public static void main(String[] args) throws IOException
{
String[] strArr=null;
boolean succInput=false;
while(!succInput){
System.out.println("Please input username and password:(EX:root,123456):");
String str=scan.next();
if(null!=str&&!"".equals(str)){
String[] tmpArr=str.split(",");
if(tmpArr.length==2){
strArr=tmpArr;
succInput=true;
}else{
System.out.println("Username and password parse error.");
}
}else{
System.out.println("Username and password parse error.");
}
}
String encryName=encryptData_CBC(strArr[0]);
String encryPassword=encryptData_CBC(strArr[1]);
System.out.println("Entrypt username and password:");
System.out.println(encryName+","+encryPassword);
System.out.println(decryptData_CBC(encryName)+","+decryptData_CBC(encryPassword));
}
}
需要依赖其他三个类,具体可以查看附件