CBigInt RsaTrans(CBigInt& A, CBigInt& B); //反复平方算法进行幂模运算
void GetPrime(int bits); //产生指定长度的随机大素数
CBigInt Gcd(CBigInt& A);
};
2. RSA相关算法实现
RSA算法实现比较重要的是素性检测,大随机数的产生,求逆运算等,分别由下面几个函数来完成,下面给出拉宾米勒算法。
int CBigInt::Rab()
{
unsigned i,j,pass;
for(i=0;i<550;i++){if(Mod(PrimeTable[i])==0)return 0;}
CBigInt S,A,I,K;
K.Mov(*this);
K.m_ulValue[0]--;
for(i=0;i<5;i++)
{
pass=0;
A.Mov(rand()*rand());
S.Mov(K);
while((S.m_ulValue[0]&1)==0)
{
for(j=0;j<S.m_nLength;j++)
{
S.m_ulValue[j]=S.m_ulValue[j]>>1;
if(S.m_ulValue[j+1]&1)S.m_ulValue[j]=S.m_ulValue[j]|0x80000000;
}
if(S.m_ulValue[S.m_nLength-1]==0)S.m_nLength--;
I.Mov(A.RsaTrans(S,*this));
if(I.Cmp(K)==0){pass=1;break;}
}
if((I.m_nLength==1)&&(I.m_ulValue[0]==1))pass=1;
if(pass==0)return 0;
}
return 1;
}
3.3.2 签名生成模块
在签名产生模块中,户主通过管理中心发放给他的私钥,以及他刚刚通过数字证书生成模块得到的房产证文件,然后将这两个文件分别导入模块中,通过生成签名按钮及可以得到生成后的数字签名。这个签名由户主自己保存。密钥生成过程时间主要是生成随机素数的时间及计算公钥和私钥的模乘法的时间。如图7所示
图7 签名生成模块图
在数字签名过程中要对文件进行签名首先得用对要签名的文件进行数字摘要处理。在常见的生成数字摘要的方法有MD5和SHA-1,在本设计中对文件的消息摘要我们是通过SHA-1安全哈希算法来实现的。下面简要的介绍安全哈希算法的具体实现方法和代码:
SHA-1安全哈希算法的实现
typedef struct { /*SHA结构体定义*/
unsigned long state[5];
unsigned long count[2];
unsigned char buffer[64];
} SHA1_CTX;
void SHA1Transform(unsigned long state[5], unsigned char buffer[64]);/*传输函数,用于数据的转换和传、送*/
void SHA1Init(SHA1_CTX* context); /*初始化,对初始条件进行定义和说明*/
void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len); /* 中间转换函数 */
void SHA1Final(unsigned char digest[20], SHA1_CTX* context); /* 得到最后的哈希表*/
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
/* blk0() and blk() perform the initial expand. */
/* I got the idea of expanding during the round function from SSLeay */
#ifdef LITTLE_ENDIAN
#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
|(rol(block->l[i],8)&0x00FF00FF))
#else
#define blk0(i) block->l[i]
#endif
#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
^block->l[(i+2)&
首页 上一页 3 4 5 6 7 8 9 下一页 尾页 6/9/9
免费房产证信息数字签名的实现(六)由毕业论文网(www.huoyuandh.com)会员上传。