位置加密applet基本实现,目录下包含c java参考代码、打包工具、说明文档、 #2

Merged
zcy merged 20 commits from zcy_dev_cap into main 2025-09-09 02:39:35 +00:00
738 changed files with 17533 additions and 1862 deletions
Showing only changes of commit 57b385aaa2 - Show all commits

View File

@@ -1,141 +1,129 @@
package com.zuc.zuc256; package com.cscn.zuc256;
import com.cscn.Zuc256Core;
import com.cscn.Zuc256State;
import java.util.Arrays;
import javacard.framework.JCSystem;
import javacard.framework.Util;
/** /**
* 加密上下文类Java Card兼容版本 * 加密上下文类
*/ */
public final class Zuc256EncryptCtx { public final class Zuc256EncryptCtx {
Zuc256State state; Zuc256State state;
byte[] buf; byte[] buf;
short buflen; int buflen;
// 构造函数 - 使用已分配的缓冲区
public Zuc256EncryptCtx(Zuc256State state, byte[] buf){ public Zuc256EncryptCtx(Zuc256State state, byte[] buf){
this.state = state; this.state = state;
this.buf = buf; this.buf = buf;
this.buflen = 0;
} }
// 构造函数 - 自动分配缓冲区
public Zuc256EncryptCtx(Zuc256State state){ public Zuc256EncryptCtx(Zuc256State state){
this.state = state; this.state = state;
this.buf = JCSystem.makeTransientByteArray((short)4, JCSystem.CLEAR_ON_DESELECT); this.buf = new byte[4];
this.buflen = 0;
} }
// 构造函数 - 完整初始化
public Zuc256EncryptCtx(){ public Zuc256EncryptCtx(){
this.state = new Zuc256State(); this.state = new Zuc256State();
this.buf = JCSystem.makeTransientByteArray((short)4, JCSystem.CLEAR_ON_DESELECT); this.buf = new byte[4];
this.buflen = 0;
} }
// 初始化加密上下文 // 初始化加密上下文
public void init(byte[] key32, short keyOff, short keyLen, byte[] iv, short ivOff, short ivLen) { public void init(byte[] key32, byte[] iv) {
// 清空缓冲区 Arrays.fill(this.buf, (byte) 0);
Util.arrayFillNonAtomic(buf, (short)0, (short)buf.length, (byte)0);
this.buflen = 0; this.buflen = 0;
// 初始化状态 Zuc256Core.initState(this.state, key32, iv);
Zuc256Core.initState(this.state, key32, keyOff, keyLen, iv, ivOff, ivLen);
} }
// 分阶段处理加密数据 // 分阶段处理加密数据
public void update(byte[] in, short inOff, short inlen, byte[] out, short outOff) { public void update(byte[] in, int inlen, byte[] out) {
if (in == null || out == null || inlen == 0) return; if (in == null || out == null || inlen == 0) return;
short currentInOff = inOff;
short currentOutOff = outOff;
// 处理缓冲区中剩余的非4字节数据 // 处理缓冲区中剩余的非4字节数据
if (this.buflen > 0) { if (this.buflen > 0) {
short need = (short)(4 - this.buflen); int need = 4 - this.buflen;
short copy = (short)Math.min(inlen, need); int copy = Math.min(inlen, need);
// 复制数据到缓冲区 System.arraycopy(in, 0, this.buf, this.buflen, copy);
Util.arrayCopyNonAtomic(in, currentInOff, this.buf, this.buflen, copy);
this.buflen += copy; this.buflen += copy;
// 调整输入指针和长度 // 调整输入指针和长度
currentInOff += copy; byte[] newIn = new byte[inlen - copy];
if (inlen - copy > 0) {
System.arraycopy(in, copy, newIn, 0, inlen - copy);
}
in = newIn;
inlen -= copy; inlen -= copy;
// 缓冲区已满处理一个完整的4字节块 // 缓冲区已满处理一个完整的4字节块
if (this.buflen == 4) { if (this.buflen == 4) {
short keystream = zuc256GenerateKeyword(this.state); int keystream = zuc256GenerateKeyword(this.state);
short plain = getU16(this.buf, (short)0); // 改为16位操作 int plain = getU32(this.buf, 0);
putU16(out, currentOutOff, (short)(plain ^ keystream)); putU32(out, 0, plain ^ keystream);
// 重置缓冲区
this.buflen = 0; this.buflen = 0;
Util.arrayFillNonAtomic(this.buf, (short)0, (short)this.buf.length, (byte)0); Arrays.fill(this.buf, (byte) 0);
// 调整输出指针 // 调整输出指针
currentOutOff += 2; // 16位数据占2字节 byte[] newOut = new byte[out.length - 4];
if (out.length - 4 > 0) {
System.arraycopy(out, 4, newOut, 0, out.length - 4);
}
out = newOut;
} }
} }
// 处理完整的2字节块Java Card 16位操作 // 处理完整的4字节块
if (inlen > 0) { int fullBlocks = inlen / 4;
short fullBlocks = (short)(inlen / 2); // 16位块
if (fullBlocks > 0) { if (fullBlocks > 0) {
short[] keystream = JCSystem.makeTransientShortArray(fullBlocks, JCSystem.CLEAR_ON_DESELECT); int[] keystream = new int[fullBlocks];
zuc256GenerateKeystream(this.state, fullBlocks, keystream); zuc256GenerateKeystream(this.state, fullBlocks, keystream);
// 逐块异或加密 // 逐块异或加密
for (short i = 0; i < fullBlocks; i++) { for (int i = 0; i < fullBlocks; i++) {
short plain = getU16(in, (short)(currentInOff + (short)(i * 2))); int plain = getU32(in, i * 4);
putU16(out, (short)(currentOutOff + (short)(i * 2)), (short)(plain ^ keystream[i])); putU32(out, i * 4, plain ^ keystream[i]);
} }
// 调整输入指针和长度 // 调整输入指针和长度
short processed = (short)(fullBlocks * 2); int processed = fullBlocks * 4;
currentInOff += processed; byte[] newIn = new byte[inlen - processed];
if (inlen - processed > 0) {
System.arraycopy(in, processed, newIn, 0, inlen - processed);
}
in = newIn;
inlen -= processed; inlen -= processed;
} }
// 缓存剩余不足2字节的数据 // 缓存剩余不足4字节的数据
if (inlen > 0) { if (inlen > 0) {
Util.arrayCopyNonAtomic(in, currentInOff, this.buf, (short)0, inlen); System.arraycopy(in, 0, this.buf, 0, inlen);
this.buflen = inlen; this.buflen = inlen;
} }
} }
}
// 完成加密处理 // 完成加密处理
public void finish(byte[] out, short outOff) { public void finish(byte[] out) {
if (out == null) return; if (this == null || out == null) return;
// 处理缓冲区中剩余的不足2字节数据 // 处理缓冲区中剩余的不足4字节数据
if (this.buflen > 0) { if (this.buflen > 0) {
short keystream = zuc256GenerateKeyword(this.state); int keystream = zuc256GenerateKeyword(this.state);
byte[] keystreamBytes = JCSystem.makeTransientByteArray((short)2, JCSystem.CLEAR_ON_DESELECT); byte[] keystreamBytes = new byte[4];
putU16(keystreamBytes, (short)0, keystream); putU32(keystreamBytes, 0, keystream);
// 逐字节异或 // 逐字节异或
for (short i = 0; i < this.buflen; i++) { for (int i = 0; i < this.buflen; i++) {
out[(short)(outOff + i)] = (byte)(this.buf[i] ^ keystreamBytes[i]); out[i] = (byte) (this.buf[i] ^ keystreamBytes[i]);
} }
} }
// 清理上下文 // 清理上下文
Util.arrayFillNonAtomic(this.buf, (short)0, (short)this.buf.length, (byte)0); Arrays.fill(this.buf, (byte) 0);
this.buflen = 0; this.buflen = 0;
// 清理状态 Arrays.fill(this.state.LFSR, 0);
Util.arrayFillNonAtomic(this.state.LFSR, (short)0, (short)this.state.LFSR.length, (short)0);
this.state.R1 = 0; this.state.R1 = 0;
this.state.R2 = 0; this.state.R2 = 0;
} }
// 16位数据读取替代原32位实现
private short getU16(byte[] buf, short off) {
return (short)(((buf[off] & 0xFF) << 8) | (buf[(short)(off + 1)] & 0xFF));
}
// 16位数据写入替代原32位实现
private void putU16(byte[] buf, short off, short value) {
buf[off] = (byte)((value >>> 8) & 0xFF);
buf[(short)(off + 1)] = (byte)(value & 0xFF);
}
} }