能力值:
( LV9,RANK:200 )
|
-
-
|
能力值:
( LV9,RANK:200 )
|
-
-
|
能力值:
( LV9,RANK:200 )
|
-
-
[求助]此算法是否存在逆算法
楼主把 lpDataTable 和 “软件中的一个数据表( N 个 dd 大小的表)” 传上来看看?
另外,软件对RegCode是否有什么限制,如长度限制?
或者楼主直接把软件放上来吧
|
能力值:
( LV9,RANK:200 )
|
-
-
[原创][求助]请教一个数学问题
客户注册:
客户输入用户名(UserName)和密码(PassWord),点击“注册”,客户端发送用户名(UserName)和密码的散列值(hash(PassWord))到服务器;
(为了保证数据的保密性,服务器需要有X.509证书。客户端把密码的散列值用服务器的公钥加密后再发送给服务器)
服务器保存用户名和密码的散列值到数据库中。
客户登录:
客户端发送用户名;
服务器收到用户名,发送一个随机数(RandNum),并保存这个随机数;
客户输入密码,客户端以密码的散列值作为密钥,使用对称加密算法加密接收到的随机数(RandNum),把加密结果EncData发送给服务器;
服务器使用数据库中保存的密码散列值作为密钥,解密EncData,如果解密结果等于先前发送的随机数,则认证成功。
|
能力值:
( LV9,RANK:200 )
|
-
-
|
能力值:
( LV9,RANK:200 )
|
-
-
[求助]RSA加密算法
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
typedef struct RSA_PARAM_Tag
{
unsigned __int64 p,q;
unsigned __int64 f;
unsigned __int64 n,e;
unsigned __int64 d;
unsigned __int64 s;
} RSA_PARAM;
const static long g_PrimeTable[]=
{ 3,5,7,11,13,17,19,23,29,31,
37,41,43,47,53,59,61,67,71,
73,79,83,89,97
};
const static long g_PrimeCount=sizeof(g_PrimeTable)/sizeof(long);
class RandNumber
{
private:
unsigned __int64 m_randSeed;
static unsigned __int64 s_multiplier;
static unsigned __int64 s_adder;
public:
RandNumber(unsigned __int64 s = 0);
unsigned __int64 Random(unsigned __int64 n);
};
unsigned __int64 RandNumber::s_multiplier = 12747293821;
unsigned __int64 RandNumber::s_adder = 1343545677842234541;
RandNumber::RandNumber(unsigned __int64 s)
{
if(!s)
{
m_randSeed = (unsigned __int64)time(NULL);
}
else
{
m_randSeed = s;
}
}
unsigned __int64 RandNumber::Random(unsigned __int64 n)
{
m_randSeed = s_multiplier * m_randSeed + s_adder;
return m_randSeed % n;
}
RandNumber g_Rnd;
unsigned __int64 MulMod(unsigned __int64 a,unsigned __int64 b,unsigned __int64 n)
{
return (a*b)%n;
}
unsigned __int64 PowMod(unsigned __int64 &base,unsigned __int64 &pow,unsigned __int64 &n)
{
unsigned __int64 a=base,b=pow,c=1;
while(b)
{
while(!(b&1))
{
b>>=1;
a=MulMod(a,a,n);
}
b--;
c=MulMod(a,c,n);
}
return c;
}
long MillerRabinKnl(unsigned __int64 &n)
{
unsigned __int64 b,m,j,v,i;
m=n-1;
j=0;
while(!(m&1))
{
++j;
m>>=1;
}
b=2+g_Rnd.Random(n-3);
v=PowMod(b,m,n);
if(v==1)
{
return 1;
}
i=1;
while(v!=n-1)
{
if(i==j)
{
return 0;
}
v=(v*v)%n;
++i;
}
return 1;
}
long MillerRabin(unsigned __int64 &n,long loop)
{
long i;
for (i=0;i<g_PrimeCount;i++)
{
if(n%g_PrimeTable[i]==0)
{
return 0;
}
}
for(i=0;i<loop;i++)
{
if(!MillerRabinKnl(n))
{
return 0;
}
}
return 1;
}
unsigned __int64 RandomPrime(char bits)
{
unsigned __int64 base;
do
{
base=(unsigned long)1<<(bits-1);
base+=g_Rnd.Random(base);
base|=1;
}while(!MillerRabin(base,30));
return base;
}
unsigned __int64 EuclidGcd(unsigned __int64 &p,unsigned __int64 &q)
{
unsigned __int64 a=p>q?p:q;
unsigned __int64 b=p<q?p:q;
unsigned __int64 t;
if(p==q)
{
return p;
}
while(b)
{
a=a%b;
t=a;
a=b;
b=t;
}
return a;
}
unsigned __int64 SteinGcd(unsigned __int64 &p,unsigned __int64 &q)
{
unsigned __int64 a=p>q?p:q;
unsigned __int64 b=p<q?p:q;
unsigned __int64 t,r=1;
if(p==q)
{
return p;
}
while((!(a&1))&&(!(b&1)))
{
r<<=1;
a>>=1;
b>>=1;
}
if(!(a&1))
{
t=a;
a=b;
b=t;
}
do
{
while(!(b&1))
{
b>>=1;
}
if(b<a)
{
t=a;
a=b;
b=t;
}
b=(b-a)>>1;
}while(b);
return r*a;
}
unsigned __int64 ModReverse(unsigned __int64 &a,unsigned __int64 &b)
{
unsigned __int64 m,e,i,j,x,y;
long xx,yy;
m=b;
e=a;
x=0;
y=1;
xx=1;
yy=1;
while(e)
{
i=m/e;
j=m%e;
m=e;
e=j;
j=y;
y*=i;
if(xx==yy)
{
if(x>y)
{
y=x-y;
}
else
{
y-=x;
yy=0;
}
}
else
{
y+=x;
xx=1-xx;
yy=1-yy;
}
x=j;
}
if(xx==0)
{
x=b-x;
}
return x;
}
RSA_PARAM RsaGetParam(void)
{
RSA_PARAM Rsa={0};
unsigned __int64 t;
Rsa.p=RandomPrime(16);
Rsa.q=RandomPrime(16);
Rsa.n=Rsa.p*Rsa.q;
Rsa.f=(Rsa.p-1)*(Rsa.q-1);
do
{
Rsa.e=g_Rnd.Random(65536);
Rsa.e|=1;
}while(SteinGcd(Rsa.e,Rsa.f)!=1);
Rsa.d=ModReverse(Rsa.e, Rsa.f);
Rsa.s=0;
t=Rsa.n>>1;
while(t)
{
Rsa.s++;
t>>=1;
}
return Rsa;
}
void TestRSA(void)
{
RSA_PARAM r;
char pSrc[]= {"abcdefghijklmnopqrstuvwxyz"};
const unsigned long n=sizeof(pSrc);
unsigned char *q;
unsigned __int64 pEnc[n],pDec[n];
unsigned long i;
r=RsaGetParam();
printf("p = %I64u\n", r.p);
printf("q = %I64u\n", r.q);
printf("f=(p-1)*(q-1)= %I64u\n", r.f);
printf("n=p*q= %I64u\n", r.n);
printf("e = %I64u\n", r.e);
printf("d = %I64u\n", r.d);
printf("s = %I64u\n", r.s);
printf("Source: %s\n", pSrc);
q=(unsigned char *)pSrc;
printf("Encode:");
for(i=0;i<n;i++)
{
unsigned __int64 base;
base = (unsigned __int64)q[i];
pEnc[i]=PowMod(base, r.e, r.n);
}
printf("\n");
printf("Decode: ");
for(i=0;i<n;i++)
{
pDec[i]=PowMod(pEnc[i], r.d, r.n);
printf("%c", pDec[i]);
}
printf("\n");
}
int main(void)
{
TestRSA();
return 0;
}
|
能力值:
( LV9,RANK:200 )
|
-
-
|
能力值:
( LV9,RANK:200 )
|
-
-
|
能力值:
( LV9,RANK:200 )
|
-
-
[讨论]用汇编开发看雪自己的Crypto算法库如何?
同意楼主的建议。
看雪密码学小组也成立一段时间了,可以说什么也没有做。
大家一起努力,合作开发一个看雪自己的密码学库。
我的建议是:大家可能都有各自的工作,业余时间也不多。大家可以一人负责一个模块,制定统一的接口。最后再合在一起讨论修改。
另外,我的想法是开源,注重效率,使用C语言和嵌入汇编,可以参考各种开源的密码学库。
不知道大家是个什么意见?
|