65,187
社区成员




int CheckReverse(int a)
{
int n = MODULUS;
int p = 2;
while(p*p<n)
{
if (a%p == n%p && 0 == a%p)
return 0;
p++;
}
return 1;
}
int GetReverse(int a)
{
int n = MODULUS;
int q, p, t;
int x = 0, y = 1, z;
q = n;
p = a;
z = (int)q / p;
while (1 != p && 1 != q)
{
t = p;
p = q % p;
q = t;
t = y;
y = x - y * z;
x = t;
z = (int)q / p;
}
y = y % n;
if (y < 0)
y += n;
return y;
}
void MatrixMulti(unsigned char *in1,int *in2,unsigned char *out,unsigned int matrixsize)
{
unsigned int k = 0,j = 0;
for(j=0; j<matrixsize; j++)
for(k=0; k<matrixsize; k++)
*(out + j) += (unsigned char)((*(in1 + k)) * (*(in2 + matrixsize*k + j)) & 255);
}
void MatrixTrans(int *key,unsigned int matrixsize)
{
unsigned int i = 0,j = 0;
int t = 0;
for(i=0; i<matrixsize; i++)
{
for(j=i+1; j<matrixsize/2; j++)
{
t = *(key + i*matrixsize + j);
*(key + i*matrixsize + j) = *(key + j*matrixsize + i);
*(key + j*matrixsize + i) = t;
}
}
}
int MatrixReverse(int *key,unsigned int matrixsize)
{
unsigned int i = 0,j = 0,k = 0,rev = 0;
for(i=0; i<matrixsize; i++)
{
for(j=matrixsize; j<matrixsize*2; j++)
{
if(j == i + matrixsize)
*(key + matrixsize*i*2 + j) = 1;
else
*(key + matrixsize*i*2 + j) = 0;
}
}
for (j = 0; j < matrixsize;++j)
{
for (i = j; i < matrixsize; ++i)
{
if (CheckReverse(*(key + matrixsize*i*2 + j)))
{
rev = GetReverse(*(key + matrixsize*i*2 + j));
for (k = 0; k < matrixsize * 2;++k)
{
int t = 0;
*(key + matrixsize*i*2 + k) *= rev;
*(key + matrixsize*i*2 + k) %= MODULUS;
t = *(key + matrixsize*i*2 + k);
*(key + matrixsize*i*2 + k) = *(key + matrixsize*j*2 + k);
*(key + matrixsize*j*2 + k) = t;
}
break;
}
if (matrixsize - 1 == i)
return 0;
}
for (i = 0; i < matrixsize ; ++i)
{
if (i != j)
{
int t = *(key + matrixsize*i*2 + j);
for (k = 0; k < matrixsize * 2; k++)
{
*(key + matrixsize*i*2 + k) -= t * *((int*)key + matrixsize*j*2 + k);
*(key + matrixsize*i*2 + k) %= MODULUS;
if (*(key + matrixsize*i*2 + k)<0)
*(key + matrixsize*i*2 + k) += MODULUS;
}
}
}
}
return 1;
}