对称运算类接口
This commit is contained in:
@@ -1,36 +0,0 @@
|
||||
package com.sunyard.chsm.enums;
|
||||
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
|
||||
/**
|
||||
* 算法的轮模式
|
||||
* @author Cheney
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum AlgMode {
|
||||
ECB("ECB", "ECB"),
|
||||
CBC( "CBC", "CBC"),
|
||||
;
|
||||
|
||||
private final String code;
|
||||
private final String desc;
|
||||
|
||||
|
||||
public static AlgMode of(String code) {
|
||||
if (code == null || code.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Arrays.stream(AlgMode.values())
|
||||
.filter(it -> Objects.equals(it.getCode(), code))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
package com.sunyard.chsm.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author liulu
|
||||
* @since 2024/10/22
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum KeyAlg {
|
||||
|
||||
SM1(KeyCategory.SYM_KEY, "SM1", "SM1"),
|
||||
SM4(KeyCategory.SYM_KEY, "SM4", "SM4"),
|
||||
SM2(KeyCategory.ASYM_KEY, "SM2", "SM2"),
|
||||
RSA(KeyCategory.ASYM_KEY, "RSA", "RSA"),
|
||||
;
|
||||
private final KeyCategory category;
|
||||
private final String code;
|
||||
private final String desc;
|
||||
|
||||
|
||||
public static KeyAlg of(String code) {
|
||||
if (code == null || code.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Arrays.stream(KeyAlg.values())
|
||||
.filter(it -> Objects.equals(it.code, code))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
package com.sunyard.chsm.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author liulu
|
||||
* @since 2024/10/22
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum KeyCategory {
|
||||
|
||||
// 对称密钥
|
||||
SYM_KEY("sym_key", "对称密钥"),
|
||||
// 非对称密钥
|
||||
ASYM_KEY("asym_key", "非对称密钥"),
|
||||
;
|
||||
|
||||
private final String code;
|
||||
private final String desc;
|
||||
|
||||
public static KeyCategory of(String code) {
|
||||
if (code == null || code.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Arrays.stream(KeyCategory.values())
|
||||
.filter(it -> Objects.equals(it.code, code))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
package com.sunyard.chsm.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author liulu
|
||||
* @since 2024/10/23
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum KeyStatus {
|
||||
|
||||
WAIT_ENABLED("wait_enabled", "待生效"),
|
||||
ENABLED("enabled", "已启用"),
|
||||
DISABLED("disabled", "已停用"),
|
||||
ARCHIVED("archived", "已归档"),
|
||||
EXPIRED("expired", "已过期"),
|
||||
DESTROY("destroy", "已销毁"),
|
||||
;
|
||||
private final String code;
|
||||
private final String desc;
|
||||
|
||||
public static KeyStatus of(String code) {
|
||||
if (code == null || code.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Arrays.stream(KeyStatus.values())
|
||||
.filter(it -> Objects.equals(it.code, code))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
package com.sunyard.chsm.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* 数据的填充模式
|
||||
*
|
||||
* @author Cheney
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum Padding {
|
||||
NOPadding("NoPadding", "NoPadding"),
|
||||
PCKS5Padding("PKCS5Padding", "PKCS5Padding"),
|
||||
PCKS7Padding("PKCS7Padding", "PKCS7Padding"),
|
||||
;
|
||||
|
||||
private final String code;
|
||||
private final String desc;
|
||||
|
||||
|
||||
public static Padding of(String code) {
|
||||
if (code == null || code.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Arrays.stream(Padding.values())
|
||||
.filter(it -> Objects.equals(it.getCode(), code))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.sunyard.chsm.sdf;
|
||||
|
||||
|
||||
import com.sunyard.chsm.enums.Padding;
|
||||
import com.sunyard.chsm.sdf.context.AlgId;
|
||||
import com.sunyard.chsm.sdf.model.EccCipher;
|
||||
import com.sunyard.chsm.sdf.model.EccKey;
|
||||
@@ -40,6 +41,7 @@ public interface SdfApiService {
|
||||
* 对称加密
|
||||
*
|
||||
* @param alg 算法,只支持对称算法
|
||||
* @param padding
|
||||
* @param key 密钥值,明文
|
||||
* @param data 原始数据
|
||||
*/
|
||||
@@ -47,22 +49,22 @@ public interface SdfApiService {
|
||||
//
|
||||
// byte[] symEncrypt(KeyAlg alg, byte[] key, byte[] data);
|
||||
|
||||
byte[] symEncrypt(AlgId alg, byte[] key, byte[] iv, byte[] data);
|
||||
byte[] symEncrypt(AlgId alg, Padding padding, byte[] key, byte[] iv, byte[] data);
|
||||
|
||||
/**
|
||||
* 对称解密
|
||||
*
|
||||
* @param alg 算法,只支持对称算法
|
||||
* @param key 密钥值,明文
|
||||
* @param mode 轮模式
|
||||
* @param alg 算法,只支持对称算法
|
||||
* @param padding 填充模式
|
||||
* @param key 密钥值,明文
|
||||
* @param data 密文数据
|
||||
*/
|
||||
// byte[] symDecrypt(KeyAlg alg, AlgMode mode, Padding padding, byte[] key, byte[] data);
|
||||
//
|
||||
// byte[] symDecrypt(KeyAlg alg, byte[] key, byte[] data);
|
||||
|
||||
byte[] symDecrypt(AlgId alg, byte[] key, byte[] iv, byte[] data);
|
||||
byte[] symDecrypt(AlgId alg, Padding padding, byte[] key, byte[] iv, byte[] data);
|
||||
|
||||
|
||||
/**
|
||||
@@ -119,12 +121,14 @@ public interface SdfApiService {
|
||||
/**
|
||||
* 计算MAC
|
||||
*
|
||||
* @param algId algId
|
||||
* @param padding padding
|
||||
* @param symKey 用户指定的密钥
|
||||
* @param pucIv 缓冲区指针,用于存放输入和返回的IV数据
|
||||
* @param pucData 缓冲区指针,用于存放输入的数据明文
|
||||
* @return pucEncData 返回MAC值 | puiLength 返回MAC值长度
|
||||
*/
|
||||
byte[] calculateMAC(byte[] symKey, byte[] pucIv, byte[] pucData);
|
||||
byte[] calculateMAC(AlgId algId, Padding padding, byte[] symKey, byte[] pucIv, byte[] pucData);
|
||||
|
||||
byte[] hmac(byte[] key, byte[] srcData);
|
||||
|
||||
|
||||
@@ -1,10 +1,38 @@
|
||||
package com.sunyard.chsm.sdf.util;
|
||||
|
||||
import com.sunyard.chsm.enums.Padding;
|
||||
|
||||
/**
|
||||
* @author liulu
|
||||
*/
|
||||
public abstract class PaddingUtil {
|
||||
|
||||
|
||||
public static byte[] padding(Padding padding, byte[] data) {
|
||||
switch (padding) {
|
||||
case NOPadding:
|
||||
return data;
|
||||
case PCKS5Padding:
|
||||
return PKCS5Padding(data);
|
||||
case PCKS7Padding:
|
||||
return PKCS7Padding(data);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static byte[] unpadding(Padding padding, byte[] data) {
|
||||
switch (padding) {
|
||||
case NOPadding:
|
||||
return data;
|
||||
case PCKS5Padding:
|
||||
return PKCS5Unpadding(data);
|
||||
case PCKS7Padding:
|
||||
return PKCS7Unpadding(data);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static byte[] PKCS7Padding(byte[] content, int blockSize) {
|
||||
if (content == null || blockSize < 8)
|
||||
throw new IllegalStateException("parameter error");
|
||||
@@ -22,7 +50,7 @@ public abstract class PaddingUtil {
|
||||
return padded;
|
||||
}
|
||||
|
||||
public static byte[] PKCS7Padding(byte[] content) {
|
||||
public static byte[] PKCS7Padding(byte[] content) {
|
||||
try {
|
||||
return PKCS7Padding(content, 16);
|
||||
} catch (Exception e) {
|
||||
@@ -34,10 +62,9 @@ public abstract class PaddingUtil {
|
||||
return PKCS7Padding(content, 8);
|
||||
}
|
||||
|
||||
public static byte[] PKCS7Unpadding(byte[] content, int blockSize)
|
||||
throws Exception {
|
||||
public static byte[] PKCS7Unpadding(byte[] content, int blockSize) {
|
||||
if (blockSize < 8 || content == null || content.length % blockSize != 0)
|
||||
throw new Exception("parameter error");
|
||||
throw new IllegalStateException("parameter error");
|
||||
return PKCS7Unpadding(content);
|
||||
}
|
||||
|
||||
@@ -57,9 +84,8 @@ public abstract class PaddingUtil {
|
||||
return unpadded;
|
||||
}
|
||||
|
||||
public static byte[] PKCS5Unpadding(byte[] content) throws Exception {
|
||||
public static byte[] PKCS5Unpadding(byte[] content) {
|
||||
return PKCS7Unpadding(content, 8);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user