位置加密applet基本实现,目录下包含c java参考代码、打包工具、说明文档、 #2
@@ -25,10 +25,16 @@ public final class Method {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// IV
|
// IV
|
||||||
private static final byte[] IV25 = {//todo 23 -> 25
|
// private static final byte[] IV23 = {
|
||||||
(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)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 = {
|
||||||
|
(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字节)
|
// Input: 明文(38字节)
|
||||||
@@ -87,7 +93,8 @@ public final class Method {
|
|||||||
short[] L2_t;
|
short[] L2_t;
|
||||||
short[] L2_acc;
|
short[] L2_acc;
|
||||||
|
|
||||||
byte[] extract_iv_src;
|
byte[] extract_iv_last8;
|
||||||
|
byte[] extracted_iv_23;
|
||||||
|
|
||||||
short[] add64_tmp;
|
short[] add64_tmp;
|
||||||
|
|
||||||
@@ -152,6 +159,9 @@ public final class Method {
|
|||||||
|
|
||||||
|
|
||||||
public Method() {
|
public Method() {
|
||||||
|
// 算法内部使用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);
|
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);
|
||||||
@@ -175,7 +185,7 @@ public final class Method {
|
|||||||
L2_t = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
L2_t = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||||
L2_acc = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
L2_acc = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||||
|
|
||||||
extract_iv_src = JCSystem.makeTransientByteArray((short)8, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
extract_iv_last8 = JCSystem.makeTransientByteArray((short)8, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||||
|
|
||||||
add64_tmp = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
add64_tmp = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||||
|
|
||||||
@@ -660,15 +670,15 @@ public final class Method {
|
|||||||
|
|
||||||
// 处理剩余8字节
|
// 处理剩余8字节
|
||||||
for (short i = 0; i < 8; i++) {
|
for (short i = 0; i < 8; i++) {
|
||||||
extract_iv_src[i] = (byte) (input25Byte[(short)(17 + i)] & 0x3F);
|
extract_iv_last8[i] = (byte) (input25Byte[(short)(17 + i)] & 0x3F);
|
||||||
}
|
}
|
||||||
|
|
||||||
output23Byte[17] = (byte) ((extract_iv_src[0] << 2) | (extract_iv_src[1] >>> 4));
|
output23Byte[17] = (byte) ((extract_iv_last8[0] << 2) | (extract_iv_last8[1] >>> 4));
|
||||||
output23Byte[18] = (byte) (((extract_iv_src[1] & 0x0F) << 4) | (extract_iv_src[2] >>> 2));
|
output23Byte[18] = (byte) (((extract_iv_last8[1] & 0x0F) << 4) | (extract_iv_last8[2] >>> 2));
|
||||||
output23Byte[19] = (byte) (((extract_iv_src[2] & 0x03) << 6) | extract_iv_src[3]);
|
output23Byte[19] = (byte) (((extract_iv_last8[2] & 0x03) << 6) | extract_iv_last8[3]);
|
||||||
output23Byte[20] = (byte) ((extract_iv_src[4] << 2) | (extract_iv_src[5] >>> 4));
|
output23Byte[20] = (byte) ((extract_iv_last8[4] << 2) | (extract_iv_last8[5] >>> 4));
|
||||||
output23Byte[21] = (byte) (((extract_iv_src[5] & 0x0F) << 4) | (extract_iv_src[6] >>> 2));
|
output23Byte[21] = (byte) (((extract_iv_last8[5] & 0x0F) << 4) | (extract_iv_last8[6] >>> 2));
|
||||||
output23Byte[22] = (byte) (((extract_iv_src[6] & 0x03) << 6) | extract_iv_src[7]);
|
output23Byte[22] = (byte) (((extract_iv_last8[6] & 0x03) << 6) | extract_iv_last8[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1403,13 +1413,14 @@ public final class Method {
|
|||||||
//===zuc256Encryptctx
|
//===zuc256Encryptctx
|
||||||
|
|
||||||
// 初始化加密上下文
|
// 初始化加密上下文
|
||||||
public void initZuc256EncryptCtx(byte[] key32, byte[] iv) {
|
public void initZuc256EncryptCtx(byte[] key32, byte[] iv_in_25) {
|
||||||
|
extractIv(iv_in_25, extracted_iv_23);
|
||||||
// Arrays.fill(this.buf, (byte) 0);
|
// Arrays.fill(this.buf, (byte) 0);
|
||||||
for (short i = 0; i < (short)this.ctx_buf.length; i++) {
|
for (short i = 0; i < (short)this.ctx_buf.length; i++) {
|
||||||
this.ctx_buf[i] = (byte)0;
|
this.ctx_buf[i] = (byte)0;
|
||||||
}
|
}
|
||||||
this.ctx_buflen = 0;
|
this.ctx_buflen = 0;
|
||||||
initState(key32, iv);
|
initState(key32, extracted_iv_23);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 分阶段处理加密数据
|
// 分阶段处理加密数据
|
||||||
|
|||||||
Reference in New Issue
Block a user