1、优化sm4_cbc加解密接口

This commit is contained in:
zhoubin 2021-10-19 15:36:24 +08:00
parent b0a1c42ff3
commit 0ae7b29514
3 changed files with 46 additions and 33 deletions

View File

@ -131,14 +131,14 @@ public class SYMEnDeLongData {
if ( this.isEn ){
// this.data = this.api.SYMEncryptData(this.key,this.keyValue,this.alg,this.roundMode,this.fullMode,this.isFirst ? 1 : 2 , data);
System.out.println("块号block:"+(this.isFirst ? 1 : 2));
RetWrap en = this.api.SM4EncryptDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, data, this.iv, this.isFirst ? 1 : 2);
// System.out.println("块号block:"+(this.isFirst ? 1 : 2));
RetWrap en = this.api.SM4EncDecDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, data, this.iv, this.isFirst ? 1 : 2);
this.data = (byte[]) en.get("msg_all");
this.iv = (byte[]) en.get("iv");
System.out.println("下一IV长度:"+this.iv.length);
System.out.println("iv---"+ Util.bytes2HexString(this.iv));
// System.out.println("下一IV长度:"+this.iv.length);
// System.out.println("iv---"+ Util.bytes2HexString(this.iv));
} else {
RetWrap de = this.api.SM4EncryptDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, data, this.iv, this.isFirst ? 1 : 2);
RetWrap de = this.api.SM4EncDecDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, data, this.iv, this.isFirst ? 1 : 2);
this.data = (byte[]) de.get("msg_all");
this.iv = (byte[]) de.get("iv");
}
@ -181,11 +181,11 @@ public class SYMEnDeLongData {
if (last.length>0){
if ( this.isEn ){
System.out.println("block:"+block);
this.data = (byte[]) this.api.SM4EncryptDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, last, this.iv, block).get("msg_all");
// System.out.println("block:"+block);
this.data = (byte[]) this.api.SM4EncDecDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, last, this.iv, block).get("msg_all");
} else {
System.out.println("block:"+block);
this.data = (byte[]) this.api.SM4EncryptDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, last, this.iv, block).get("msg_all");
// System.out.println("block:"+block);
this.data = (byte[]) this.api.SM4EncDecDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, last, this.iv, block).get("msg_all");
}
}

View File

@ -4250,7 +4250,7 @@ public class SydApi4j implements SydApi {
*/
// 测试通过
// @Override
public boolean SM4EncryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath) {
private boolean _SM4EncryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath) {
byte[] msg = FileUtil.getDataFromFile(inFilePath);
@ -4267,8 +4267,8 @@ public class SydApi4j implements SydApi {
return true;
}
// @Override
public boolean _SM4EncryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath) {
@Override
public boolean SM4EncryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath) {
byte[] iv = new byte[32];
Arrays.fill(iv, (byte) 0x30);
@ -4279,13 +4279,13 @@ public class SydApi4j implements SydApi {
File in = new File(inFilePath);
if ( !in.exists() ){
System.out.println("要加密的文件不存在");
throw new SydApiException("要加密的文件不存在", -27);
}
long length = in.length();
int l = new Long(length).intValue();
int n = l / ( 2 * 1024);
System.out.println("n 个 2k:"+n);
println("n 个 2k:"+n);
if (l % ( 2 * 1024) != 0) {
n++;
@ -4300,12 +4300,12 @@ public class SydApi4j implements SydApi {
} catch (IOException e) {
e.printStackTrace();
}
FileInputStream fis =null;
FileOutputStream fos=null;
BufferedInputStream fis =null;
BufferedOutputStream fos=null;
try {
fis = new FileInputStream(in);
fos = new FileOutputStream(out);
fis = new BufferedInputStream(new FileInputStream(in));
fos = new BufferedOutputStream(new FileOutputStream(out));
byte[] buff = new byte[2 * 1024];
for (int i = 0; i < n-1; i++) {
@ -4316,7 +4316,6 @@ public class SydApi4j implements SydApi {
println("len长度_update:"+len);
byte[] en = sym.update( buff );
println("en长度:"+en.length);
// String str = Util.bytes2HexString(en);
fos.write( en );
}
}
@ -4328,7 +4327,6 @@ public class SydApi4j implements SydApi {
println("len长度_calc:" + len);
byte[] en = sym.calc(buff, len);
println("en长度:" + en.length);
// String str = Util.bytes2HexString(en);
fos.write( en );
}
} catch (IOException e) {
@ -4358,8 +4356,23 @@ public class SydApi4j implements SydApi {
return new SYMEnDeLongData(this, Alg.SM4, RoundMode.CBC, FullMode.PKCS);
}
/**
* 使用SM4算法进行加密其中加密模式为CBC,
* 使用缺省值0X 00000000000000000000000000000000,
* 补位模式为 PKCS5 PADDING
* @param isEn 是否加密
* @param keyType 密钥类型 0: ZEK,1: TEK
* @param key 密钥
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
* @param outType 输出消息类型 0:二进制 1:扩展十六进制
* @param msg 消息数据
* @param iv iv
* @param block 消息块号
* @return
*/
// @Override
public RetWrap SM4EncryptDataCBC(Boolean isEn, int keyType, String key, int inType, int outType, byte[] msg, byte[] iv, int block) {
public RetWrap SM4EncDecDataCBC(Boolean isEn, int keyType, String key, int inType, int outType, byte[] msg, byte[] iv, int block) {
// 填充数据
HashMap<String, Object> packet = new HashMap<String, Object>();
@ -4450,7 +4463,7 @@ public class SydApi4j implements SydApi {
*/
// 测试通过
// @Override
public boolean SM4DecryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath) throws UnsupportedEncodingException {
private boolean _SM4DecryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath) throws UnsupportedEncodingException {
byte[] msg = FileUtil.getDataFromFile(inFilePath);
@ -4466,8 +4479,8 @@ public class SydApi4j implements SydApi {
return true;
}
// @Override
public boolean _SM4DecryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath) {
@Override
public boolean SM4DecryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath) {
println("解密============================");
byte[] iv = new byte[32];
@ -4479,13 +4492,13 @@ public class SydApi4j implements SydApi {
File in = new File(inFilePath);
if ( !in.exists() ){
System.out.println("要解密的文件不存在");
throw new SydApiException("要解密的文件不存在", -27);
}
long length = in.length();
int l = new Long(length).intValue();
int n = l / ( 2 * 1024);
System.out.println("n 个 2k:"+n);
println("n 个 2k:"+n);
if (l % ( 2 * 1024) != 0) {
n++;
@ -4500,12 +4513,12 @@ public class SydApi4j implements SydApi {
} catch (IOException e) {
e.printStackTrace();
}
FileInputStream fis =null;
FileOutputStream fos=null;
BufferedInputStream fis =null;
BufferedOutputStream fos=null;
try {
fis = new FileInputStream(in);
fos = new FileOutputStream(out);
fis = new BufferedInputStream(new FileInputStream(in));
fos = new BufferedOutputStream(new FileOutputStream(out));
byte[] buff = new byte[2 * 1024];
byte[] buff1 = new byte[2 * 1024 + 16];

View File

@ -23,7 +23,7 @@ public class TestAllMethods {
@Before
public void before() {
System.setProperty("com.sunyard.sydapi4j.debug", "true");
System.setProperty("com.sunyard.sydapi4j.debug", "false");
// api = (SydApi4j) new SydApi4j().connect("172.16.17.163", 8889, null, 1000);
api = (SydApi4j) new SydApi4j().connect("192.168.1.7", 8889, null, 5000);
// api = (SydApi4j) new SydApi4j().connect("192.168.0.66", 8889, null, 1000);
@ -678,9 +678,9 @@ public class TestAllMethods {
String outFilePath = "C:\\Users\\edgar\\Desktop\\fsdownload\\test\\in2.txt";
String outFilePath2 = "C:\\Users\\edgar\\Desktop\\fsdownload\\test\\out1.txt";
boolean b = api._SM4EncryptFileDataCBC(0, key, 0, 0, inFilePath, outFilePath);
boolean b = api.SM4EncryptFileDataCBC(0, key, 0, 0, inFilePath, outFilePath);
System.out.println(b);
boolean c = api._SM4DecryptFileDataCBC(0, key, 0, 0, outFilePath, outFilePath2);
boolean c = api.SM4DecryptFileDataCBC(0, key, 0, 0, outFilePath, outFilePath2);
System.out.println(c);
}