/**
* data 3DRS加密
* @param src(请求参数)
* @param key(秘钥)
* @return
* @throws Exception
*/
public static String encryptThreeDESECB(String src, String key) throws Exception {
DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(1, securekey);
byte[] b = cipher.doFinal(src.getBytes("UTF-8"));
return Base64.encodeBase64String(b);
}
/**
* data 3DRS解密
*
* @param src
* @param key
* @return
* @throws Exception
*/
public static String decryptThreeDESECB(String src, String key) throws Exception {
BASE64Decoder decoder = new BASE64Decoder();
byte[] bytesrc = decoder.decodeBuffer(src);
DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(2, securekey);
byte[] retByte = cipher.doFinal(bytesrc);
return new String(retByte);
}
/**
* 签名
* @param str(sign)
* @return
*/
public static String getSHA256Str(String str) {
String encdeStr = "";
try {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] hash = messageDigest.digest(str.getBytes("UTF-8"));
encdeStr = Hex.encodeHexString(hash);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return encdeStr;
}
private static final String ENCODING = "UTF-8";
public static final String ALGORITHM_NAME = "SM4";
// 加密算法/分组加密模式/分组填充方式
// PKCS5Padding-以8个字节为一组进行分组加密
// 定义分组加密模式使用:PKCS5Padding
public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";
// 128-32位16进制;256-64位16进制
public static final int DEFAULT_KEY_SIZE = 128;
/**
* sm4加密
*
* @explain 加密模式:ECB 密文长度不固定,会随着被加密字符串长度的变化而变化
* @param hexKey 16进制密钥(忽略大小写)
* @param paramStr 待加密字符串
* @return 返回16进制的加密字符串
* @throws Exception
*/
public String encryptEcb(String hexKey, String paramStr) throws Exception {
// 16进制字符串-->byte[]
byte[] keyData = new String(hexKey).getBytes();
// String-->byte[]
byte[] srcData = paramStr.getBytes(ENCODING);
// 加密后的数组
byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData);
// byte[]-->hexString
String data = Base64.encodeBase64String(cipherArray).replaceAll("\r|\n", "");
return data;
}
/**
* 加密模式之Ecb
*
* @explain
* @param key
* @param data
* @return
* @throws Exception
*/
public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception {
Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(data);
}
/**
* 生成ECB暗号
*
* @explain ECB模式(电子密码本模式:Electronic codebook)
* @param algorithmName 算法名称
* @param mode 模式
* @param key
* @return
* @throws Exception
*/
private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception {
Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);
Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);
cipher.init(mode, sm4Key);
return cipher;
}
提示:generateEcbCipher方法 适用于 JDK1.7 (bcprov-jdk15on-1.54.jar )
SM4 SHA256 3DRS加密
猜你喜欢
转载自blog.csdn.net/qq501569325/article/details/106194732
今日推荐
周排行