轻量级加密算法 Trivium、Grain v1、Grain128-AEAD,适合级联使用。
部分代码
const GRAIN128_INIT=0;
const GRAIN128_ADDKEY=1;
const GRAIN128_NORMAL=2;
const grain128_lfsr_fb=(lfsr)=>{
return lfsr[96]^lfsr[81]^lfsr[70]^lfsr[38]^lfsr[7]^lfsr[0];
};
const grain128_nfsr_fb=(nfsr)=>{
return nfsr[96]^nfsr[91]^nfsr[56]^nfsr[26]^nfsr[0]^(nfsr[84]&nfsr[68])^(nfsr[67]&nfsr[3])^(nfsr[65]&nfsr[61])^(nfsr[59]&nfsr[27])^(nfsr[48]&nfsr[40])^(nfsr[18]&nfsr[17])^(nfsr[13]&nfsr[11])^(nfsr[82]&nfsr[78]&nfsr[70])^(nfsr[25]&nfsr[24]&nfsr[22])^(nfsr[95]&nfsr[93]&nfsr[92]&nfsr[88]);
};
const grain128_h=(lfsr,nfsr)=>{
const x0=nfsr[12];
const x1=lfsr[8];
const x2=lfsr[13];
const x3=lfsr[20];
const x4=nfsr[95];
const x5=lfsr[42];
const x6=lfsr[60];
const x7=lfsr[79];
const x8=lfsr[94];
return(x0&x1)^(x2&x3)^(x4&x5)^(x6&x7)^(x0&x4&x8);
};
const shiftRegister=(fsr,fb)=>{
const out=fsr[0];
for(let i=0;i<fsr.length-1;i++){
fsr[i]=fsr[i+1];
}
fsr[fsr.length-1]=fb;
return out;
};
const authShift64=(sr,fb)=>{
for(let i=0;i<sr.length-1;i++){
sr[i]=sr[i+1];
}
sr[sr.length-1]=fb;
};
const accumulate=(state)=>{
for(let i=0;i<64;i++){
state.auth_acc[i]^=state.auth_sr[i];
}
};
const grain128_next_z=(state,keybit=0,keybit64=0)=>{
const lfsr_fb=grain128_lfsr_fb(state.lfsr);
const nfsr_fb=grain128_nfsr_fb(state.nfsr);
const h_out=grain128_h(state.lfsr,state.nfsr);
const A=[2,15,36,45,64,73,89];
let nfsr_tmp=0;
for(let i=0;i<7;i++){
nfsr_tmp^=state.nfsr[A[i]];
}
算法规格
| 算法 |
密钥长度 |
IV长度 |
认证 |
| Trivium |
10字节 |
10字节 |
❌ |
| Grain v1 |
10字节 |
8字节 |
❌ |
| Grain128-AEAD |
16字节 |
12字节 |
✅ |
级联建议
- 虽然可以自由组合,但建议使用同为128位安全的算法,并且最后一层加密使用带验证的算法
- 明文 → Trivium → Grain128-AEAD → 密文
- 明文 → Trivium → Ascon-AEAD128 → 密文
- 明文 → Aes-128 → Grain128-AEAD → 密文
- 明文 → Aes-128 → ChaCha12 → Ascon-AEAD128 → 密文
开源地址
https://github.com/fzxx/Trivium-Grain
|