Trivium (密码)

Trivium密码是一种对称密钥同步序列密码算法。它的设计目的是在计算能力有限的硬件上高效实现安全加密，同时兼顾软件实现效率。

结构

Trivium的标准输入为一个80位的密码和一个80位的起始向量（IV）。和大部分同步序列密码算法一样，Trivium的核心组件是一个密码学安全的伪随机数生成器（CSPRNG）。通过将密码和起始向量加载到该伪随机数生成器中，Trivium算法将计算出所需的密钥流。然后，通过将明文位依次与密文位进行异或操作，计算并输出密文。
Trivium伪随机数生成器可以看作由三个线性反馈移位寄存器组成。它们的长度分别是93、84和111位。寄存器和寄存器之间通过非线性逻辑连接。通过Trivium加密共分为2个阶段。

实现

下面是Trivium使用的CSPRNG的javascript实现（这是CSPRNG部分，而不是整个密码）:
function GetKeyStream(p,iv,l)//p为一长为80的数组,每个元素为0或1. iv也是同样的格式.参数l是一个数字,表示希望函数生成的密钥流的长度,由使用者定义.
{

var RightShift=function(arr,zeroth){var l,loop;l=arr.length-1;if(l<0){return arr;}for(loop=l;loop>0;loop--){arr[loop]=arr[loop-1];}arr[0]=zeroth;return arr;}
var SubArray=function(arr_i,a){var l,loop,arr_ii;arr_ii=new Array();l=arr_i.length;for(loop=a;loop<l;loop++){arr_ii[loop-a]=arr_i[loop];}return arr_ii;}
//以上是支持函數。

var a,b,c,i,ra,rb,rc,ia,ib,ic,k;a=new Array();b=new Array();c=new Array();k=new Array();l=l+1152;
for(i=0;i<80;i++){a[i]=p[i];}
for(i=80;i<93;i++){a[i]=0;}
for(i=0;i<80;i++){b[i]=iv[i];}
for(i=80;i<84;i++){b[i]=0;}
for(i=0;i<108;i++){c[i]=0;}
for(i=108;i<111;i++){c[i]=1;}
for(i=0;i<l;i++)
{
ra=((a[90]&a[91])+a[92]+a[65])%2;
rb=((b[81]&b[82])+b[83]+b[68])%2;
rc=((c[108]&c[109])+c[110]+c[65])%2;
k[i]=(ra+ra+rc)%2;
ia=(a[68]+rc)%2;
ib=(b[77]+ra)%2;
ic=(c[86]+rb)%2;
a=RightShift(a,ia);
b=RightShift(b,ib);
c=RightShift(c,ic);
}
k=SubArray(k,1152);
return k;
}
使用全零的密钥和一全零向量的输入后，其生成的前100位密码学安全的伪随机数是：
 0111100110110010011100101111001000011111101011101100011000010000011000110010010001011010010010101010

性能

Trivium算法在设计之初就是完全出于硬件效率考虑。由于采用了线性反馈移位寄存器和简单的AND函数，其硬件实现效率很高。然而，针对位的密集操作导致其软件实现效率低下。

地位

欧洲eSTREAM计划的获胜算法共7个，其中3个针对硬件优化，4个针对软件优化。Trivium是3个针对硬件优化的获胜算法之一。