}
-void scprng(uint64_t *plain, uint64_t* cipher, int bufsize, int nb_bloc, uint64_t *Val, uchar *Sbox1, uchar *Sbox2, int *Pbox, int *Pbox2, uchar *DK, int delta) {
+void scprng(uint64_t *plain, uint64_t* cipher, int bufsize, int nb_bloc, uint64_t *Val, uchar *Sbox1, uchar *Sbox2, uchar * Sbox3, uchar *Sbox4, int *Pbox, int *Pbox2, int *Pbox3, int *Pbox4, uchar *DK, int delta) {
int update=0;
for(int j=0;j<bufsize;j++) {
//Val[j]=splitmix64_stateless(Val[j])^Val[Pbox[j]];
//Val[j]=xorshift64(Val[j])^Val[Pbox[j]]; //fail
- Val[j]=xorshift64(Val[j])^Val[Pbox[j]]^Val[Pbox2[j]];
+// Val[j]=xorshift64(Val[j])^Val[Pbox[j]]^Val[Pbox2[j]];
+ Val[j]=xorshift64(Val[j]);
+
//Val[j]=xoroshiro128plus(&xoro[j])^Val[Pbox[j]];
//Val[j]=jsf(&ctx[j])^Val[Pbox[j]]; //good
//Val[j]=sfc(&sfcd[j])^Val[Pbox[j]]; //good
}
+ for(int j=0;j<bufsize;j++) {
+ Val[j]=Val[j]^Val[Pbox[j]]^Val[Pbox2[j]];
+ }
+
for(int j=0;j<bufsize;j++) {
cipher[nb*bufsize+j]=Val[j]^plain[nb*bufsize+j];
uchar *ptr=(uchar*)Val;
for(int j=0;j<bufsize*8;j++)
ptr[j]^=Sbox2[Sbox1[ptr[j]+DK[j&63]]];
- rc4keyperm(ptr, bufsize, 1, Pbox, 64);
- //only for xorshift
- rc4keyperm(&ptr[32], bufsize, 1, Pbox2, 64);
-
+
+ for(int j=0;j<256;j++)
+ Sbox1[j]=Sbox3[Sbox1[j]];
+
+ for(int j=0;j<256;j++)
+ Sbox2[j]=Sbox4[Sbox2[j]];
+
+ for(int j=0;j<256;j++)
+ Sbox3[j]=Sbox4[Sbox3[j]];
+
+
+ for(int j=0;j<bufsize;j++)
+ Pbox[j]=Pbox3[Pbox[j]];
+
+ for(int j=0;j<bufsize;j++)
+ Pbox2[j]=Pbox4[Pbox2[j]];
+
+ for(int j=0;j<bufsize;j++)
+ Pbox3[j]=Pbox4[Pbox3[j]];
+
+
- rc4key(ptr, Sbox1, 64);
- rc4key(&ptr[64], Sbox2, 64);
}
else
update++;
uchar Sbox1[256];
uchar Sbox2[256];
+ uchar Sbox3[256];
+ uchar Sbox4[256];
rc4key(DK, Sbox1, 8);
rc4key(&DK[8], Sbox2, 8);
+ rc4key(&DK[16], Sbox3, 8);
+ rc4key(&DK[24], Sbox4, 8);
int Pbox[h];
int Pbox2[h];
+ int Pbox3[h];
+ int Pbox4[h];
rc4keyperm(&DK[16], h, 1, Pbox, 16);
rc4keyperm(&DK[32], h, 1, Pbox2, 16);
+ rc4keyperm(&DK[8], h, 1, Pbox3, 16);
+ rc4keyperm(&DK[48], h, 1, Pbox4, 16);
// uint64_t plain[bufsize];
for(uint iter=0;iter<nb_test;iter++) {
- scprng(SEQ, SEQ2, h, nb_bloc, Val,Sbox1, Sbox2, Pbox, Pbox2, DK, delta);
+ scprng(SEQ, SEQ2, h, nb_bloc, Val,Sbox1, Sbox2, Sbox3, Sbox4, Pbox, Pbox2, Pbox3, Pbox4, DK, delta);
}
double time=TimeStop(t);
for(uint iter=0;iter<nb_test;iter++) {
- scprng(SEQ2, SEQ, h, nb_bloc, Val,Sbox1, Sbox2, Pbox, Pbox2, DK, delta);
+ scprng(SEQ2, SEQ, h, nb_bloc, Val,Sbox1, Sbox2, Sbox3, Sbox4, Pbox, Pbox2, Pbox3, Pbox4, DK, delta);
}