对称运算类接口

This commit is contained in:
liulu
2024-12-18 09:25:41 +08:00
parent bd099ba04e
commit 9cb9b43052
39 changed files with 891 additions and 119 deletions
+5 -1
View File
@@ -20,6 +20,11 @@
<dependencies>
<dependency>
<groupId>com.sunyard.chsm</groupId>
<artifactId>chsm-params</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
@@ -66,5 +71,4 @@
</dependencies>
</project>
@@ -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);
}
}