diff --git a/Project/Src/com/cscn/Method.java b/Project/Src/com/cscn/Method.java index cb4648f..e002501 100644 --- a/Project/Src/com/cscn/Method.java +++ b/Project/Src/com/cscn/Method.java @@ -25,10 +25,16 @@ public final class Method { }; // IV - private static final byte[] IV25 = {//todo 23 -> 25 - (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)0xC3,(byte)0x1C,(byte)0xB3,(byte)0xD3,(byte)0x5D,(byte)0xB7 +// private static final byte[] IV23 = { +// (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)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字节) @@ -87,7 +93,8 @@ public final class Method { short[] L2_t; short[] L2_acc; - byte[] extract_iv_src; + byte[] extract_iv_last8; + byte[] extracted_iv_23; short[] add64_tmp; @@ -152,6 +159,9 @@ public final class 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); LFSR_hi = 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_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); @@ -660,15 +670,15 @@ public final class Method { // 处理剩余8字节 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[18] = (byte) (((extract_iv_src[1] & 0x0F) << 4) | (extract_iv_src[2] >>> 2)); - output23Byte[19] = (byte) (((extract_iv_src[2] & 0x03) << 6) | extract_iv_src[3]); - output23Byte[20] = (byte) ((extract_iv_src[4] << 2) | (extract_iv_src[5] >>> 4)); - output23Byte[21] = (byte) (((extract_iv_src[5] & 0x0F) << 4) | (extract_iv_src[6] >>> 2)); - output23Byte[22] = (byte) (((extract_iv_src[6] & 0x03) << 6) | extract_iv_src[7]); + output23Byte[17] = (byte) ((extract_iv_last8[0] << 2) | (extract_iv_last8[1] >>> 4)); + output23Byte[18] = (byte) (((extract_iv_last8[1] & 0x0F) << 4) | (extract_iv_last8[2] >>> 2)); + output23Byte[19] = (byte) (((extract_iv_last8[2] & 0x03) << 6) | extract_iv_last8[3]); + output23Byte[20] = (byte) ((extract_iv_last8[4] << 2) | (extract_iv_last8[5] >>> 4)); + output23Byte[21] = (byte) (((extract_iv_last8[5] & 0x0F) << 4) | (extract_iv_last8[6] >>> 2)); + output23Byte[22] = (byte) (((extract_iv_last8[6] & 0x03) << 6) | extract_iv_last8[7]); } /** @@ -1403,13 +1413,14 @@ public final class Method { //===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); for (short i = 0; i < (short)this.ctx_buf.length; i++) { this.ctx_buf[i] = (byte)0; } this.ctx_buflen = 0; - initState(key32, iv); + initState(key32, extracted_iv_23); } // 分阶段处理加密数据