Unit FGIntRSA; Interface Uses Windows, SysUtils, Controls, FGInt; Procedure RSAEncrypt(P : String; Var exp, modb : TFGInt; Var E : String); Procedure RSADecrypt(E : String; Var exp, modb, d_p, d_q, p, q : TFGInt; Var D : String); Implementation {$H+} // Шифрование Procedure RSAEncrypt(P : String; Var exp, modb : TFGInt; Var E : String); Var i, j, modbits : longint; PGInt, temp, zero : TFGInt; tempstr1, tempstr2, tempstr3 : String; Begin Base2StringToFGInt('0', zero); FGIntToBase2String(modb, tempstr1); modbits := length(tempstr1); convertBase256to2(P, tempstr1); tempstr1 := '111' + tempstr1; j := modbits - 1; While (length(tempstr1) Mod j) <> 0 Do tempstr1 := '0' + tempstr1; j := length(tempstr1) Div (modbits - 1); tempstr2 := ''; For i := 1 To j Do Begin tempstr3 := copy(tempstr1, 1, modbits - 1); While (copy(tempstr3, 1, 1) = '0') And (length(tempstr3) > 1) Do delete(tempstr3, 1, 1); Base2StringToFGInt(tempstr3, PGInt); delete(tempstr1, 1, modbits - 1); If tempstr3 = '0' Then FGIntCopy(zero, temp) Else FGIntMontgomeryModExp(PGInt, exp, modb, temp); FGIntDestroy(PGInt); tempstr3 := ''; FGIntToBase2String(temp, tempstr3); While (length(tempstr3) Mod modbits) <> 0 Do tempstr3 := '0' + tempstr3; tempstr2 := tempstr2 + tempstr3; FGIntdestroy(temp); End; While (tempstr2[1] = '0') And (length(tempstr2) > 1) Do delete(tempstr2, 1, 1); ConvertBase2To256(tempstr2, E); FGIntDestroy(zero); End; // Расшифрование Procedure RSADecrypt(E : String; Var exp, modb, d_p, d_q, p, q : TFGInt; Var D : String); Var i, j, modbits : longint; EGInt, temp, temp1, temp2, temp3, ppinvq, qqinvp, zero : TFGInt; tempstr1, tempstr2, tempstr3 : String; Begin Base2StringToFGInt('0', zero); FGIntToBase2String(modb, tempstr1); modbits := length(tempstr1); convertBase256to2(E, tempstr1); While copy(tempstr1, 1, 1) = '0' Do delete(tempstr1, 1, 1); While (length(tempstr1) Mod modbits) <> 0 Do tempstr1 := '0' + tempstr1; If exp.Number = Nil Then Begin FGIntModInv(q, p, temp1); FGIntMul(q, temp1, qqinvp); FGIntDestroy(temp1); FGIntModInv(p, q, temp1); FGIntMul(p, temp1, ppinvq); FGIntDestroy(temp1); End; j := length(tempstr1) Div modbits; tempstr2 := ''; For i := 1 To j Do Begin tempstr3 := copy(tempstr1, 1, modbits); While (copy(tempstr3, 1, 1) = '0') And (length(tempstr3) > 1) Do delete(tempstr3, 1, 1); Base2StringToFGInt(tempstr3, EGInt); delete(tempstr1, 1, modbits); If tempstr3 = '0' Then FGIntCopy(zero, temp) Else Begin If exp.Number <> Nil Then FGIntMontgomeryModExp(EGInt, exp, modb, temp) Else Begin FGIntMontgomeryModExp(EGInt, d_p, p, temp1); FGIntMul(temp1, qqinvp, temp3); FGIntCopy(temp3, temp1); FGIntMontgomeryModExp(EGInt, d_q, q, temp2); FGIntMul(temp2, ppinvq, temp3); FGIntCopy(temp3, temp2); FGIntAddMod(temp1, temp2, modb, temp); FGIntDestroy(temp1); FGIntDestroy(temp2); End; End; FGIntDestroy(EGInt); tempstr3 := ''; FGIntToBase2String(temp, tempstr3); While (length(tempstr3) Mod (modbits - 1)) <> 0 Do tempstr3 := '0' + tempstr3; tempstr2 := tempstr2 + tempstr3; FGIntdestroy(temp); End; If exp.Number = Nil Then Begin FGIntDestroy(ppinvq); FGIntDestroy(qqinvp); End; While (Not (copy(tempstr2, 1, 3) = '111')) And (length(tempstr2) > 3) Do delete(tempstr2, 1, 1); delete(tempstr2, 1, 3); ConvertBase2To256(tempstr2, D); FGIntDestroy(zero); End; End.