RSA算法流程图zl031125.docx
《RSA算法流程图zl031125.docx》由会员分享,可在线阅读,更多相关《RSA算法流程图zl031125.docx(19页珍藏版)》请在冰点文库上搜索。
RSA算法流程图zl031125
流程图中用到的符号说明如下:
m未加密的原始数据(明文)
c加密后数据(密文)
e随机选取的加密密钥,与(p-1)(q-1)互素。
(p、q是两个大素数)
nn=p*q
dPp的指数
dQq的指数
qInv系数数据
流程图引用到源程序中的类型定义如下:
typedefunsignedlongintUINT4;
typedefunsignedshortintUINT2;
typedefUINT4NN_DIGIT;
typedefUINT2NN_HALF_DIGIT;
typedefstruct{
unsignedintbits;/*lengthinbitsofmodulus*/
unsignedcharmodulus[MAX_RSA_MODULUS_LEN];/*modulus*/
unsignedcharexponent[MAX_RSA_MODULUS_LEN];/*publicexponent*/
}R_RSA_PUBLIC_KEY;//公钥
typedefstruct{
unsignedintbits;/*lengthinbitsofmodulus*/
unsignedcharmodulus[MAX_RSA_MODULUS_LEN];/*modulus*/
unsignedcharpublicExponent[MAX_RSA_MODULUS_LEN];/*publicexponent*/
unsignedcharexponent[MAX_RSA_MODULUS_LEN];/*privateexponent*/
unsignedcharprime[2][MAX_RSA_PRIME_LEN];/*primefactors*/
unsignedcharprimeExponent[2][MAX_RSA_PRIME_LEN];/*exponentsforCRT*/
unsignedcharcoefficient[MAX_RSA_PRIME_LEN];/*CRTcoefficient*/
}R_RSA_PRIVATE_KEY;//私钥
引用到的宏定义说明如下:
#defineNN_DIGIT_BITS32
#defineNN_HALF_DIGIT_BITS16
#defineNN_DIGIT_LEN(NN_DIGIT_BITS/8)
#defineMAX_NN_DIGITS\
((MAX_RSA_MODULUS_LEN+NN_DIGIT_LEN-1)/NN_DIGIT_LEN+1)
#defineMAX_NN_DIGIT0xffffffff
#defineMAX_NN_HALF_DIGIT0xffff
#defineMAX_RSA_MODULUS_BITS2048
#defineMAX_RSA_MODULUS_LEN((MAX_RSA_MODULUS_BITS+7)/8)
RSA公钥加密算法流程图:
RSA私钥解密算法流程图:
赋值算法流程图:
/*
Assignsa=b.
Lengths:
a[digits],b[digits].
*/
函数名:
voidNN_Assign(NN_DIGIT*a,NN_DIGIT*b,unsignedintdigits)
赋0值算法流程图:
/*
Assignsa=0.
Lengths:
a[digits].
*/
函数名:
voidNN_AssignZero(NN_DIGIT*a,unsignedintdigits)
返回数组有效长度的算法流程图:
/*
Lengths:
a[digits].
*/
函数名:
unsignedintNN_Digits(NN_DIGIT*a,unsignedintdigits)
计算两个阿拉伯数字相乘的算法流程图:
/*
Computesa=b*c,wherebandcaredigits.
Lengths:
a[2].
*/
函数名:
voidNN_DigitMult(NN_DIGITa[2],NN_DIGITb,NN_DIGITc)
C
C
B
B
——————————
C
B
C
B
C
B
C
B
———————————
C
XYB
计算a=b+c*d的算法流程图:
/*
Computesa=b+c*d,wherecisadigit.Returnscarry.
Lengths:
a[digits],b[digits],d[digits].
*/
函数名:
staticNN_DIGITNN_AddDigitMult(NN_DIGIT*a,NN_DIGIT*b,NN_DIGITc,NN_DIGIT*d,unsignedintdigits)
计算a=b*c的算法流程图:
/*
Computesa=b*c.
Lengths:
a[2*digits],b[digits],c[digits].
Assumesdigits*/
函数名:
voidNN_Mult(NN_DIGIT*a,NN_DIGIT*b,NN_DIGIT*c,unsignedintdigits)
计算a=b*2^c的算法流程图:
/*
Computesa=b*2^c(i.e.,shiftsleftcbits),returningcarry.
Lengths:
a[digits],b[digits].
Requiresc*/
函数名:
NN_DIGITNN_LShift(NN_DIGIT*a,NN_DIGIT*b,unsignedintc,unsignedintdigits)
返回NN_DIGIT类型变量有效位数的算法流程图:
函数名:
staticunsignedintNN_DigitBits(NN_DIGITa)
计算a=b/c的算法流程图:
/*
Setsa=b/c,whereaandcaredigits.
Lengths:
b[2].
Assumesb[1]0.Forefficiency,cshouldbe
normalized.
*/
函数名:
voidNN_DigitDiv(NN_DIGIT*a,NN_DIGITb[2],NN_DIGITc)
C
C
A
A
——————————
C
A
C
A
C
A
C
A
———————————
C
XYA
计算a=b-c*d的算法流程图:
/*
Computesa=b-c*d,wherecisadigit.Returnsborrow.
Lengths:
a[digits],b[digits],d[digits].
*/
函数名:
staticNN_DIGITNN_SubDigitMult(NN_DIGIT*a,NN_DIGIT*b,NN_DIGITc,NN_DIGIT*d,unsignedintdigits)
比较两个NN_DIGIT类型数组的算法流程图:
/*
Returnssignofa-b.
Lengths:
a[digits],b[digits].
*/
函数名:
intNN_Cmp(NN_DIGIT*a,NN_DIGIT*b,unsignedintdigits)
计算a=b–c的算法流程图:
/*
Computesa=b-c.Returnsborrow.
Lengths:
a[digits],b[digits],c[digits].
*/
函数名:
NN_DIGITNN_Sub(NN_DIGIT*a,NN_DIGIT*b,NN_DIGIT*c,unsignedintdigits)
计算a=cdiv2^c的算法流程图:
/*
Computesa=cdiv2^c(i.e.,shiftsrightcbits),returningcarry.
Lengths:
a[digits],b[digits].
Requires:
c*/
函数名:
NN_DIGITNN_RShift(NN_DIGIT*a,NN_DIGIT*b,unsignedintc,unsignedintdigits)
计算a=cdivdandb=cmodd的算法流程图:
/*
Computesa=cdivdandb=cmodd.
Lengths:
a[cDigits],b[dDigits],c[cDigits],d[dDigits].
Assumesd>0,cDigits<2*MAX_NN_DIGITS,
dDigits*/
函数名:
voidNN_Div(a,b,c,cDigits,d,dDigits)
计算a=bmodc的算法流程图:
/*
Computesa=bmodc.
Lengths:
a[cDigits],b[bDigits],c[cDigits].
Assumesc>0,bDigits<2*MAX_NN_DIGITS,cDigits*/
函数名:
voidNN_Mod(NN_DIGIT*a,NN_DIGIT*b,unsignedintbDigits,NN_DIGIT*c,unsignedintcDigits)
计算a=b*cmodd的算法流程图:
/*
Computesa=b*cmodd.
Lengths:
a[digits],b[digits],c[digits],d[digits].
Assumesd>0,digits*/
函数名:
voidNN_ModMult(NN_DIGIT*a,NN_DIGIT*b,NN_DIGIT*c,NN_DIGIT*d,unsignedintdigits)
计算a=b^cmodd的算法流程图:
/*
Computesa=b^cmodd.
Lengths:
a[dDigits],b[dDigits],c[cDigits],d[dDigits].
Assumesd>0,cDigits>0,dDigits*/
函数名:
voidNN_ModExp(NN_DIGIT*a,NN_DIGIT*b,NN_DIGIT*c,unsignedintcDigits,NN_DIGIT*d,unsignedintdDigits)