From 7f529c4bd28ecee657c3d693aebc64a7706385d0 Mon Sep 17 00:00:00 2001 From: zcy Date: Tue, 9 Sep 2025 02:49:59 +0800 Subject: [PATCH] =?UTF-8?q?Zuc256=E7=AE=97=E6=B3=95=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E5=AE=8C=E6=AF=95=EF=BC=8Capplet=E4=B8=AD=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=8A=A0=E8=A7=A3=E5=AF=8638=E5=AD=97=E8=8A=82=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E6=88=90=E5=8A=9F=EF=BC=9B=E4=BD=8D=E7=BD=AE=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E8=B0=83=E7=94=A8zuc256=E7=AE=97=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC=E7=AC=A6=E5=90=88=E9=A2=84=E6=9C=9F?= =?UTF-8?q?=EF=BC=8C=E4=B8=8E=E6=A0=B7=E4=BE=8B=E7=A8=8B=E5=BA=8F=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project/Src/com/cscn/Method.java | 23 +++++++++++++---------- Project/Src/com/cscn/XwSecurity.java | 10 ++++++---- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Project/Src/com/cscn/Method.java b/Project/Src/com/cscn/Method.java index 30243b9..cb4648f 100644 --- a/Project/Src/com/cscn/Method.java +++ b/Project/Src/com/cscn/Method.java @@ -56,7 +56,10 @@ public final class Method { // 运行时缓冲:放RAM,避免写EEPROM byte[] ctx_buf; short ctx_buflen; + + //todo test byte[] buf1; // Enc(Input) + //todo test byte[] buf2; // Enc(Enc(Input)) -> 应为 Input // LFSR: 原 int[16] -> hi/lo 各 16 @@ -242,7 +245,8 @@ public final class Method { } - public void processData(APDU apdu) { + //todo test + public void testZuc256(APDU apdu) { byte[] apduBuf = apdu.getBuffer(); @@ -270,21 +274,20 @@ public final class Method { } /** - * fake数据生成函数 + * encryptLocationZuc256 * 输入: stmsi[6], data[5] - * 输出: fakedata[5] + * 输出: out[5] */ - private void makeFakeData(byte[] stmsi, byte[] data, byte[] fakedata) { - // 示例:逐字节异或 stmsi 前5字节 - for (short i = 0; i < (short)5; i++) { - fakedata[i] = (byte)(data[i]); - } + private void encryptLocationZuc256(byte[] stmsi, byte[] data, byte[] out) { + initZuc256EncryptCtx(KEY32, IV25); + updateZuc256EncryptCtx(data, (short) 5, out); + finishZuc256EncryptCtx(out, (short) 5); // 若 Input 长度为 4 的倍数则通常无副作用,留着更稳妥 } /** * APDU处理函数 */ - public short processDataFake(byte[] buffer, short off, short len, byte[] key_store) { + public short locationEncryptZuc(byte[] buffer, short off, short len, byte[] key_store) { // 至少要有 12 个字节:1+1+1+6+5 if (len < (short)12) { ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); @@ -302,7 +305,7 @@ public final class Method { Util.arrayCopyNonAtomic(buffer, (short)(off + 9), location_data, (short)0, (short)5); // === 生成 fakedata === - makeFakeData(stmsi, location_data, location_res_data); + encryptLocationZuc256(stmsi, location_data, location_res_data); // === 出参组装 === buffer[(short)(off + 0)] = (byte)0xA1; // 类型 diff --git a/Project/Src/com/cscn/XwSecurity.java b/Project/Src/com/cscn/XwSecurity.java index 1d58a1b..e4d2b20 100644 --- a/Project/Src/com/cscn/XwSecurity.java +++ b/Project/Src/com/cscn/XwSecurity.java @@ -13,7 +13,8 @@ import org.globalplatform.SecureChannel; */ public class XwSecurity extends Applet { - public static final byte INS_PROCESS_DATA = (byte)0xE3; + //todo test + public static final byte INS_PROCESS_DATA_TEST = (byte)0xE3; public static final byte INS_LOCATION_ENCRYPT = (byte)0xCA; @@ -72,13 +73,14 @@ public class XwSecurity extends Applet { // break; - case INS_PROCESS_DATA: - method.processData(apdu); + //todo test + case INS_PROCESS_DATA_TEST: + method.testZuc256(apdu); break; case INS_LOCATION_ENCRYPT: - len = method.processDataFake(buf, off, len, key_store_byte); + len = method.locationEncryptZuc(buf, off, len, key_store_byte); apdu.setOutgoingAndSend(off, len); break;