Пример #1
0
 //функция вычисления квадратоного корня по модулю простого числа q
 public BInteger ModSqrt(BInteger a, BInteger q)
 {
     BInteger b = new BInteger();
     do
     {
         b.genRandomBits(255, new Random());
     } while (Legendre(b, q) == 1);
     BInteger s = 0;
     BInteger t = q - 1;
     while ((t & 1) != 1)
     {
         s++;
         t = t >> 1;
     }
     BInteger InvA = a.modInverse(q);
     BInteger c = b.modPow(t, q);
     BInteger r = a.modPow(((t + 1) / 2), q);
     BInteger d = new BInteger();
     for (int i = 1; i < s; i++)
     {
         BInteger temp = 2;
         temp = temp.modPow((s - i - 1), q);
         d = (r.modPow(2, q) * InvA).modPow(temp, q);
         if (d == (q - 1))
             r = (r * c) % q;
         c = c.modPow(2, q);
     }
     return r;
 }
Пример #2
0
 private void btnTest_Click(object sender, EventArgs e)
 {
     BInteger p = new BInteger("3623986102229003635907788753683874306021320925534678605086546150450856166624002482588482022271496854025090823603058735163734263822371964987228582907372403", 10);
     BInteger x = new BInteger("1928356944067022849399309401243137598997786635459507974357075491307766592685835441065557681003184874819658004903212332884252335830250729527632383493573274", 10);
     BInteger y = new BInteger("2288728693371972859970012155529478416353562327329506180314497425931102860301572814141997072271708807066593850650334152381857347798885864807605098724013854", 10);
     BInteger a = new BInteger(7);
     BInteger b = new BInteger("1518655069210828534508950034714043154928747527740206436194018823352809982443793732829756914785974674866041605397883677596626326413990136959047435811826396", 10);
     BInteger k = new BInteger("175516356025850499540628279921125280333451031747737791650208144243182057075034446102986750962508909227235866126872473516807810541747529710309879958632945", 10);
     ECPoint P1 = new ECPoint();
     P1.a = a;
     P1.b = b;
     P1.FieldChar = p;
     P1.x = x;
     P1.y = y;
     ECPoint P3 = ECPoint.multiply(k, P1);
     BInteger r = P3.x % p;
     /////// DS forming
     BInteger q = new BInteger("3623986102229003635907788753683874306021320925534678605086546150450856166623969164898305032863068499961404079437936585455865192212970734808812618120619743", 10);
     BInteger d = new BInteger("610081804136373098219538153239847583006845519069531562982388135354890606301782255383608393423372379057665527595116827307025046458837440766121180466875860", 10);
     BInteger E = new BInteger("2897963881682868575562827278553865049173745197871825199562947419041388950970536661109553499954248733088719748844538964641281654463513296973827706272045964", 10);
     BInteger s = ((r * d) + (k * E)) % q;
     //////// DS verification
     BInteger v = E.modInverse(q);
     BInteger z = (s * v) % q;
     BInteger z2 = q + ((-(r * v)) % q);
     BInteger x1 = new BInteger("909546853002536596556690768669830310006929272546556281596372965370312498563182320436892870052842808608262832456858223580713780290717986855863433431150561", 10);
     BInteger y1 = new BInteger(" 2921457203374425620632449734248415455640700823559488705164895837509539134297327397380287741428246088626609329139441895016863758984106326600572476822372076", 10);
     ECPoint Q = new ECPoint();
     Q.a = a;
     Q.b = b;
     Q.x = x1;
     Q.y = y1;
     Q.FieldChar = p;
     ECPoint A = ECPoint.multiply(z, P1);
     ECPoint B = ECPoint.multiply(z2, Q);
     ECPoint C = A + B;
 }