位置加密applet基本实现,目录下包含c java参考代码、打包工具、说明文档、 #2
@@ -31,10 +31,10 @@ public final class Method {
|
|||||||
// (byte)0x67,(byte)0xC3,(byte)0x1C,(byte)0xB3,(byte)0xD3,(byte)0x5D,(byte)0xB7
|
// (byte)0x67,(byte)0xC3,(byte)0x1C,(byte)0xB3,(byte)0xD3,(byte)0x5D,(byte)0xB7
|
||||||
// };
|
// };
|
||||||
private static final byte[] IV25 = {
|
private static final byte[] IV25 = {
|
||||||
(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)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)0x67,(byte)0x30,(byte)0x31,(byte)0x32,(byte)0x33,(byte)0x34,(byte)0x35,(byte)0x36,
|
||||||
(byte)0x37
|
(byte)0x37
|
||||||
};
|
};
|
||||||
|
|
||||||
// Input: 明文(38字节)
|
// Input: 明文(38字节)
|
||||||
@@ -159,12 +159,14 @@ public final class Method {
|
|||||||
|
|
||||||
|
|
||||||
public 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
|
// 算法内部使用23Byte IV
|
||||||
extracted_iv_23 = JCSystem.makeTransientByteArray((short)23, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
extracted_iv_23 = JCSystem.makeTransientByteArray((short)23, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||||
|
|
||||||
ctx_buf = JCSystem.makeTransientByteArray((short)4, 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_hi = JCSystem.makeTransientShortArray((short)16, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||||
LFSR_lo = 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
|
// todo buf1 if not use, delete please
|
||||||
buf1 = JCSystem.makeTransientByteArray(MAX_DATA_BLOCK_SIZE, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
buf1 = JCSystem.makeTransientByteArray(MAX_DATA_BLOCK_SIZE, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||||
// todo buf2 if not use, delete please
|
// 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_data = JCSystem.makeTransientByteArray((short)5, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||||
location_res_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_bits = JCSystem.makeTransientShortArray((short)31, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||||
rot31_resBits = 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,
|
public void zuc256GenerateKeystream(short nwords,
|
||||||
short[] keystream_hi,
|
short[] keystream_hi,
|
||||||
short[] keystream_lo) {
|
short[] keystream_lo) {
|
||||||
for (short i = 0; i < nwords; i++) {
|
for (short i = 0; i < nwords; i++) {
|
||||||
// 生成一个关键字 -> tmp[0]=lo, tmp[1]=hi
|
// 生成一个关键字 -> tmp[0]=lo, tmp[1]=hi
|
||||||
zuc256GenerateKeyword(zuc256GenerateKeystream_tmp);
|
zuc256GenerateKeyword(zuc256GenerateKeystream_tmp);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public class XwSecurity extends Applet {
|
|||||||
// TODO Auto-generated constructor stub
|
// TODO Auto-generated constructor stub
|
||||||
method = new Method(); //todo new?
|
method = new Method(); //todo new?
|
||||||
// key store -> flash
|
// key store -> flash
|
||||||
key_store_byte = new byte[80];
|
key_store_byte = new byte[120];
|
||||||
|
|
||||||
register(bArray, (short)(bOffset + 1), bArray[bOffset]);
|
register(bArray, (short)(bOffset + 1), bArray[bOffset]);
|
||||||
}
|
}
|
||||||
|
|||||||
135
README.md
135
README.md
@@ -11,6 +11,141 @@ sudo apt-get install scons
|
|||||||
sudo apt-get install build-essential
|
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
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user