From 2549f565b49c4cd69a4876192561c4a3f36dbd85 Mon Sep 17 00:00:00 2001 From: zcy Date: Tue, 9 Sep 2025 09:49:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=86=E9=92=A5=E5=AD=98=E5=82=A8flash?= =?UTF-8?q?=E7=A9=BA=E9=97=B480->120=EF=BC=8C=E5=86=99=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project/Src/com/cscn/Method.java | 20 ++-- Project/Src/com/cscn/XwSecurity.java | 2 +- README.md | 135 +++++++++++++++++++++++++++ 3 files changed, 146 insertions(+), 11 deletions(-) diff --git a/Project/Src/com/cscn/Method.java b/Project/Src/com/cscn/Method.java index e002501..8c8dacf 100644 --- a/Project/Src/com/cscn/Method.java +++ b/Project/Src/com/cscn/Method.java @@ -31,10 +31,10 @@ public final class Method { // (byte)0x67,(byte)0xC3,(byte)0x1C,(byte)0xB3,(byte)0xD3,(byte)0x5D,(byte)0xB7 // }; private static final byte[] IV25 = { - (byte)0x30,(byte)0x31,(byte)0x32,(byte)0x33,(byte)0x34,(byte)0x35,(byte)0x36,(byte)0x37, - (byte)0x38,(byte)0x39,(byte)0x61,(byte)0x62,(byte)0x63,(byte)0x64,(byte)0x65,(byte)0x66, - (byte)0x67,(byte)0x30,(byte)0x31,(byte)0x32,(byte)0x33,(byte)0x34,(byte)0x35,(byte)0x36, - (byte)0x37 + (byte)0x30,(byte)0x31,(byte)0x32,(byte)0x33,(byte)0x34,(byte)0x35,(byte)0x36,(byte)0x37, + (byte)0x38,(byte)0x39,(byte)0x61,(byte)0x62,(byte)0x63,(byte)0x64,(byte)0x65,(byte)0x66, + (byte)0x67,(byte)0x30,(byte)0x31,(byte)0x32,(byte)0x33,(byte)0x34,(byte)0x35,(byte)0x36, + (byte)0x37 }; // Input: 明文(38字节) @@ -159,12 +159,14 @@ public final class Method { public Method() { + // key list tmp buffer, lenth must equal with key_store(flash)! + update_key_buf = JCSystem.makeTransientByteArray((short)120, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); // 算法内部使用23Byte IV extracted_iv_23 = JCSystem.makeTransientByteArray((short)23, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); ctx_buf = JCSystem.makeTransientByteArray((short)4, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); - LFSR_hi = JCSystem.makeTransientShortArray((short)16, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); - LFSR_lo = JCSystem.makeTransientShortArray((short)16, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); + LFSR_hi = JCSystem.makeTransientShortArray((short)16, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); + LFSR_lo = JCSystem.makeTransientShortArray((short)16, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); // todo buf1 if not use, delete please buf1 = JCSystem.makeTransientByteArray(MAX_DATA_BLOCK_SIZE, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); // todo buf2 if not use, delete please @@ -174,8 +176,6 @@ public final class Method { location_data = JCSystem.makeTransientByteArray((short)5, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); location_res_data = JCSystem.makeTransientByteArray((short)5, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); - update_key_buf = JCSystem.makeTransientByteArray((short)80, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); - rot31_bits = JCSystem.makeTransientShortArray((short)31, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); rot31_resBits = JCSystem.makeTransientShortArray((short)31, JCSystem.MEMORY_TYPE_TRANSIENT_RESET); @@ -1057,8 +1057,8 @@ public final class Method { // 生成指定长度的密钥流 public void zuc256GenerateKeystream(short nwords, - short[] keystream_hi, - short[] keystream_lo) { + short[] keystream_hi, + short[] keystream_lo) { for (short i = 0; i < nwords; i++) { // 生成一个关键字 -> tmp[0]=lo, tmp[1]=hi zuc256GenerateKeyword(zuc256GenerateKeystream_tmp); diff --git a/Project/Src/com/cscn/XwSecurity.java b/Project/Src/com/cscn/XwSecurity.java index e4d2b20..4bc3d5b 100644 --- a/Project/Src/com/cscn/XwSecurity.java +++ b/Project/Src/com/cscn/XwSecurity.java @@ -32,7 +32,7 @@ public class XwSecurity extends Applet { // TODO Auto-generated constructor stub method = new Method(); //todo new? // key store -> flash - key_store_byte = new byte[80]; + key_store_byte = new byte[120]; register(bArray, (short)(bOffset + 1), bArray[bOffset]); } diff --git a/README.md b/README.md index f1d647d..292d950 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,141 @@ sudo apt-get install scons sudo apt-get install build-essential ``` +--- +0909 位置加密applet调用说明 + +1. E2 密钥存储接口 + 说明: + 密钥长度为16或32B,加上密钥信息(4B)最多36B,按每个密钥40B存储在flash中。目前共分配了120B空间。(可存3个密钥) + 遇相同(算法类型, 密钥ID, 密钥版本)密钥,覆盖存储; + 新密钥存储在新空间; + 密钥长度超长会报错,空间满会报错。 + 返回A1+5字节密文+9000 + +样例1 +存储一个长度16,算法A1,id01,version02的Key[1122..FF00] +80 E2 00 01 14 +13 A1 01 02 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00 + +/send 80E200011413A10102112233445566778899AABBCCDDEEFF00 +-> +90 00 + + +样例2 +存储一个长度32,算法A2,id02,version02的Key[0102..1F20] +80 E2 00 02 24 +23 A2 02 02 +01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 +11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 + +/send 80E200022423A202020102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 +-> +90 00 + + +样例3 +存储一个长度FF,算法A2,id02,version02的Key[0102..1F20] +80 E2 00 02 24 +FF A2 02 02 +01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 +11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 +/send 80E2000224FFA202020102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 +-> +69 84 (超长 FF) + + +样例4 +存储一个长度32,算法A2,id01,version02的Key[0102..1F20] +80 E2 00 02 24 +23 A2 01 02 +01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 +11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 + +/send 80E200022423A202020102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 +-> +90 00 + +样例4 +存储一个长度16,算法A3,id02,version02的Key[0102..0F10],执行后空间满 120B +80 E2 00 02 14 +13 A3 02 02 +01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 + +/send 80E200021413A302020102030405060708090A0B0C0D0E0F10 +-> +90 00 + +样例5 +存储一个长度16,算法A3,id09,version02的Key[0102..0F10] +80 E2 00 02 14 +13 A3 09 02 +01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 + +/send 80E200021413A309020102030405060708090A0B0C0D0E0F10 +-> +6A 84 空间满 + + +样例6 +存储一个长度16,算法A2,id02,version02的Key[0102..0F10](覆盖样例3空间) +80 E2 00 02 14 +13 A2 02 02 +01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 + +/send 80E200021413A202020102030405060708090A0B0C0D0E0F10 +-> +90 00 + +-------- + + +2. CA 位置加密 + 数据为1字节随机数,6字节STMSI,5字节数据 + 目前随机数和STMSI未使用,此接口用固定Key IV,对数据进行Zuc256加密,返回加密后数据。 + +// Key: 32字节 +private static final byte[] KEY32 = { +(byte)0x30,(byte)0x31,(byte)0x32,(byte)0x33,(byte)0x34,(byte)0x35,(byte)0x36,(byte)0x37, +(byte)0x38,(byte)0x39,(byte)0x61,(byte)0x62,(byte)0x63,(byte)0x64,(byte)0x65,(byte)0x66, +(byte)0x30,(byte)0x31,(byte)0x32,(byte)0x33,(byte)0x34,(byte)0x35,(byte)0x36,(byte)0x37, +(byte)0x38,(byte)0x39,(byte)0x61,(byte)0x62,(byte)0x63,(byte)0x64,(byte)0x65,(byte)0x66 +}; +// IV: 25字节 +private static final byte[] IV25 = { +(byte)0x30,(byte)0x31,(byte)0x32,(byte)0x33,(byte)0x34,(byte)0x35,(byte)0x36,(byte)0x37, +(byte)0x38,(byte)0x39,(byte)0x61,(byte)0x62,(byte)0x63,(byte)0x64,(byte)0x65,(byte)0x66, +(byte)0x67,(byte)0x30,(byte)0x31,(byte)0x32,(byte)0x33,(byte)0x34,(byte)0x35,(byte)0x36, +(byte)0x37 +}; + +样例1 +80 CA 00 00 0E +A1 0C 00 11 22 33 44 55 66 AA BB CC DD EE + +/send 80CA00000EA10C00112233445566AABBCCDDEE + +-> +A1 06 01 9C 00 B3 15 05 90 00 + + +样例2 +80 CA 00 00 0E +A1 0C 00 11 22 33 44 55 66 FF 00 FF 00 FF + +/send 80CA00000EA10C00112233445566FF00FF00FF + +-> +A1 06 01 C9 BB 80 C8 14 90 00 + +样例3 +80 CA 00 00 0E +A1 0C 00 11 22 33 44 55 66 31 32 33 34 35 + +/send 80CA00000EA10C001122334455663132333435 + +-> +A1 06 01 07 89 4C FC DE 90 00 ---