From 8e3e0c5f11d4eabd9b6e8c963de9eefef1b6726f Mon Sep 17 00:00:00 2001 From: cheney Date: Wed, 22 Jun 2022 17:37:13 +0800 Subject: [PATCH] =?UTF-8?q?cms=20decrypt=20iv=201.=20=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E4=BF=A1=E5=B0=81=E8=A7=A3=E5=B0=81=E6=97=B6=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E4=BF=A1=E5=B0=81=E4=B8=AD=E7=9A=84=20IV=202?= =?UTF-8?q?.=20=E6=95=B0=E5=AD=97=E4=BF=A1=E5=B0=81=E8=A7=A3=E5=B0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E9=94=99=E8=AF=AF=E6=97=B6=E6=8A=9B=E5=87=BA?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=20IllegalArgumentException("=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E4=BF=A1=E5=B0=81=E8=A7=A3=E5=B0=81=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E9=94=99=E8=AF=AF")?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racal/sunyard/main/SydApi4j.java | 22 +++++++++--- .../java/com/sunyard/sydapi/test/TestHT.java | 36 +++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index 748edc7..be05f1d 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -2617,6 +2617,11 @@ public class SydApi4j implements SydApi { // 密文段 ASN1Sequence seq5 = (ASN1Sequence) seq.getObjectAt( 2 ).toASN1Primitive(); + ASN1Sequence seq6 = (ASN1Sequence) seq5.getObjectAt(1).toASN1Primitive(); + + DEROctetString iv = (DEROctetString) seq6.getObjectAt(1).toASN1Primitive(); + ret.put("iv", iv.getOctets() ); + ASN1TaggedObject tag = (ASN1TaggedObject) seq5.getObjectAt(2).toASN1Primitive(); DEROctetString data = (DEROctetString) tag.getObject(); ret.put("enData", data.getOctets() ); @@ -2679,17 +2684,26 @@ public class SydApi4j implements SydApi { e.printStackTrace(); } - RetWrap ret = deCMSEnvelopedData( Util.decodeBase64( pCipherKey ) ); + RetWrap ret = null; + + try { + ret = deCMSEnvelopedData( Util.decodeBase64( pCipherKey ) ); + } catch ( Exception e) { + throw new IllegalArgumentException("数字信封解封格式错误"); + } + byte[] sessionKeyDer = (byte[]) ret.get("sessionKeyDer"); byte[] enData = (byte[]) ret.get("enData"); + // 解密原文 + byte[] iv = (byte[]) ret.get("iv"); //new byte[32]; +// Arrays.fill(iv, (byte) 0x30); + iv = Util.bytes2HexString( iv ).getBytes(); + // 解密会话密钥 ret = decryptDE(false, 1, dnBytes, Util.encodeBase64(sessionKeyDer) ); String sessionKey = new String((byte[]) ret.get("SessionKey") ); - // 解密原文 - byte[] iv = new byte[32]; - Arrays.fill(iv, (byte) 0x30); RetWrap retWrap = SYMEnDeData(false, 1, sessionKey, 1, 1, enData, iv, 0); byte[] data = (byte[]) retWrap.get("msg_all"); diff --git a/src/test/java/com/sunyard/sydapi/test/TestHT.java b/src/test/java/com/sunyard/sydapi/test/TestHT.java index 321274e..90acf88 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestHT.java +++ b/src/test/java/com/sunyard/sydapi/test/TestHT.java @@ -5,11 +5,13 @@ import com.sunyard.SydApi; import com.sunyard.cert.X509; import com.sunyard.proto.Util; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import racal.sunyard.main.SydApi4j; import java.io.UnsupportedEncodingException; +import java.util.Arrays; /** @@ -179,6 +181,7 @@ public class TestHT { byte[] sign = api.attachedSignC(orgData, dn); System.out.println("签名结果: " + sign); + RetWrap verify = api.attachedVerifyAndGetAll(sign); if (verify != null) { System.out.println("x509公钥: " + Util.bytes2HexString(((X509)verify.get("x509")).getPubKey())); @@ -186,6 +189,39 @@ public class TestHT { } } + @Test + public void testDecryptDE54k12() throws UnsupportedEncodingException { + String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; + byte[] oData = new byte[ 4 * 1024 ]; + + RetWrap retWrap = api.generateDEByDnHsm(dn, oData); + byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY); + byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY); + printRetWrap(retWrap); + + RetWrap retWrap1 = api.decryptDEByDNSoft(dn, new String(CipherKey)); + printRetWrap(retWrap1); + byte[] deData = (byte[]) retWrap1.get("oData"); + Assert.assertArrayEquals( deData, oData ); + } + + @Test + public void testDecryptDE54k21() throws UnsupportedEncodingException { + String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; + byte[] oData = new byte[ 4 * 1024 ]; + + RetWrap retWrap = api.generateDEByDnSoft(dn, oData); + byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY); + byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY); + printRetWrap(retWrap); + + RetWrap retWrap1 = api.decryptDEByDNHsm(dn, new String(CipherKey)); + printRetWrap(retWrap1); + byte[] deData = (byte[]) retWrap1.get("oData"); + Assert.assertArrayEquals( deData, oData ); + } + + @Test public void testDecryptDE54k() throws UnsupportedEncodingException { String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";