8 : 23 楕円曲線暗号(ECC)

← 8‒22 p↑ もくじ i 8‒24 n →

楕円曲線の点の群の例

2003年11月28日
記事ID d31128


RSAp RSA 使 使RSA



y2 = x3 + 2x - 1 
7mod 7 
y2  x3 + 2x - 1 (mod 7) 
 (x, y) 

 (1, 3) 
: 32 = 9  2 (mod 7)
: 13 + 2×1 - 1 = 2 (mod 7)


mod 7 xy49使調
(1, 3)

(1, 4)

(2, 2)

(2, 5)

(3, 2)

(3, 5)

(4, 1)

(4, 6)

(5, 1)

(5, 6)


(x1, y1)   (x2, y2)  (x3, y3)   
x3= λ2 - x1 - x2
y3 = λ(x1 - x3) - y1
λ
λ = (y2 - y1) × (x2 - x1)-1 

λ = ( 3x12 + a ) × (2y1)-1
a12 x1 = x2 y1 = -y2  -171

2012-05-14  (2y1)-1 

7 姿

1011
(1, 3) あるる

(1, 4) あれれ

(2, 2) きりり

(2, 5) きろろ

(3, 2) さりり

(3, 5) さろろ

(4, 1) たらら

(4, 6) たわわ

(5, 1) ならら

(5, 6) なわわ

(∞, ∞) 無限遠点



(3, 2) (4, 6) 
λ = (y2 - y1) / (x2 - x1) 
= ( 6 - 2 ) × ( 4 - 3 ) -1 = 4 × 1-1 = 4


x3 = λ2 - x1 - x2
 = 42 - 3 - 4 = 9  2 (mod 7)
y3 = λ(x1 - x3) - y1
 = 4( 3 - 2 ) - 2 = 2

 (2, 2) 

11使

 +  = ,  +  = ,  +  = ,  +  = ,  +  = ,  +  = ,  +  = ,  +  = ,  +  = ,  +  = ,  +  = ,  +  = , ...

退
あるる×1 = あるる
あるる×2 = あるる + あるる = きりり
あるる×3 = きりり + あるる = ならら
あるる×4 = ならら + あるる = さろろ
あるる×5 = さろろ + あるる = たらら
あるる×6 = たらら + あるる = たわわ
あるる×7 = たわわ + あるる = さりり
...
あるる×11 = あれれ + あるる = 無限遠点

RSA
log   = 7

7


×7 = 

÷ = 7


RSA RSA

Windows Media Player DRM


Freeme.zip  Microsoft Digital Rights Management (MS-DRM) V.2 


p7
89abcdef012345672718281831415926141424f7

xa2
37a5abccd277bce87632ff3d4780c009ebe41497

b -1
0dd8dabf725e2f3228e85f1ad78fdedf9328239e

x  x = 1
8723947fd6a3a1e53510c07dba38daf0109fa120

y  y = 3
445744911075522d8c3c5856d4ed7acda379936f

 : 11
89abcdef012345672716b26eec14904428c2a675

URL



https://yosei.fi/articles/8/23/#d31128


2003123
IDd31203



楕円曲線上の位数331の群


307 307:
y2 = x3 + 19x + 77
331 331調

(x ,y)  (x, -y) 12 y = 0 y -y x 0  mod-1 y 0  mod/2  ±mod/2  -mod/2  +mod/2  0  mod 

331Point[ 0 ], Point[1], ... Point[ index ] ( index = 0...330 )  1
var mod = 307;
var a = 19;
var b = 77;
var Point = new Array();
var index = 0;
Point[ index ] = "(0, 0)";


for(var x = 0; x < mod; x++ ) {
    for(var y = 0; y < mod/2; y++ ) {
        var L = ( y*y ) % mod;
        var R = ( x*x*x + a*x + b ) % mod;
        if( L === R ) {
            var sPoint = "(" + x + ", " + y + ")";
            Point[ ++index ] = sPoint;
            if( y !== 0 ) {
                sPoint = "(" + x + ", " + (mod-y) + ")";
                Point[ ++index ] = sPoint;
            }
            break;
        }
    }
}

_debug("Point.lenght = " + Point.length);

document.write( "<p>" );
for(var i=0; i<Point.length; i++) {
    document.write( "<strong>P<sub>" + i + "<\/sub><\/strong> = " + Point[i] );
    if(i < Point.length-1 ) document.write( ", " );
}
document.write( "<\/p>" );

function _debug( str ) {
    document.write( "<p>Debug: " + str + "<\/p>");
}

P0 = (0, 0), P1= (0, 153), P2= (0, 154), P3= (1, 149), P4= (1, 158),
P5 = (6, 10), P6= (6, 297), P7= (7, 89), P8= (7, 218),
...
P329 = (302, 85), P330 = (302, 222)

(0, 0) 便

331  Point 331
var Order = 331;
var Point = [ "(0, 0)", "(0, 153)", "(0, 154)", "(1, 149)", "(1, 158)", "(6, 10)", "(6, 297)", 
 ... , "(302, 85)", "(302, 222)" ];

var ECCPoint = new Object();
for(var i=0; i<Order; i++ ) {
    ECCPoint[ Point[i] ] = i;

    ECCPoint[i] = new Object();
    ECCPoint[i].index = i;
    ECCPoint[i].coord = Point[i];
    if( Point[i].match(/^\((\d+), (\d+)\)$/) ) {
        ECCPoint[i].x = parseInt( RegExp.$1 );
        ECCPoint[i].y = parseInt( RegExp.$2 );
    } else {
        _debug("ECCPoint: Init Error: " + Point[i] );
        break;
    }
}

function fairy_add( index1, index2 ) {
    index1 = reduce( index1, Order );
    index2 = reduce( index2, Order );

    if(index1 === 0 ) return index2;
    else if(index2 === 0 ) return index1;

    var x1 = ECCPoint[index1].x;
    var y1 = ECCPoint[index1].y;
    var x2 = ECCPoint[index2].x;
    var y2 = ECCPoint[index2].y;
    if( x1 === x2 && y1 !== y2 ) {
        if( (y1+y2) % mod === 0 ) return 0;
        _debug("fairy_add: Something is wrong:"
         + ECCPoint[index1].coord + " : " + ECCPoint[index2].coord );
        return void 0;
    }
    
    var lambda;
    if( x1 === x2 && y1 === y2 ) {
        if( ( 2 * y1 ) % mod === 0 ) return 0;
         else lambda = ( 3*x1*x1 + a ) * rev( 2 * y1 );
    } else {
        lambda = ( y2 - y1 ) * rev( x2 - x1 );
    }
    
    lambda %= mod;

    var x3 = lambda*lambda - x1 - x2;
    var y3 = lambda * (x1-x3) - y1;
    x3 = reduce( x3, mod );
    y3 = reduce( y3, mod );
    var sPoint = "(" + x3 + ", " + y3 + ")";
    
    if( ECCPoint[ sPoint ] === void 0 ) {
        _debug( "fairy_add failed. Dump:"
         + x1 + "," + y1 + "; " + x2 + "," + y2 + "; " +x3 + ", " + y3 + " : lambda=" + lambda );
    }
    return ECCPoint[ sPoint ];
}

function reduce( N , Mod ) {
    if( typeof N !== "number" ) {
        _debug("reduce: " + N + " is " + typeof N );
        return void 0;
    }
    if( N >= 0 ) return N % Mod;
    var k = Math.floor( Math.abs(N) / Mod );
    return ( N + Mod*(k+1) ) % Mod;
}

function rev(N) {
    if( typeof N !== "number" ) {
        _debug("rev: " + N + " is " + typeof N );
        return void 0;
    }

    if( N % mod === 0 ) {
        _debug("rev: Bad input:" + N );
        return void 0;
    }
    
    N = reduce( N, mod );
    
    for( var i = 1; i < mod; i++ ) {
        if( N * i % mod === 1 ) return i;
    }

    _debug( "rev: failed for: " + N );
    return void 0;
}


 fairy_add  100100
function fairy_mul( index, N ) {
    if( N === 0 ) return 0;
    else if( N === 1 ) return index;
    var result = index;
    for( var i=2; i<=N; i++ ) {
        result = fairy_add( result, index );
    }
    return result;
}



調




Point[8] :
P8 = (7, 218)
8

  Diffie-Hellman  

75 8 87526

234 8 8234178

17875 26234
P217 = (199, 151) 

 α  β 
α (7, 218)

β (7, 218)

α β (7, 218) = (199, 151)


α (7, 218) β  β (7, 218) α  α (7, 218) (7, 218)  使 α 
var PubPointIndex = 8;

_debug("PubPoint: P" + PubPointIndex + " = " + Point[PubPointIndex]);

var SecKeyAlice = 75;
var MaskedKeyAlice = fairy_mul( PubPointIndex, SecKeyAlice );

var SecKeyBob = 234;
var MaskedKeyBob = fairy_mul( PubPointIndex, SecKeyBob );

_debug("MaskedKeyAlice: P" + MaskedKeyAlice + " = " + Point[MaskedKeyAlice]);
_debug("MaskedKeyBob: P" + MaskedKeyBob + " = " + Point[MaskedKeyBob]);

var KeyByAlice = fairy_mul( MaskedKeyBob, SecKeyAlice );
var KeyByBob = fairy_mul( MaskedKeyAlice, SecKeyBob );

_debug("KeyByAlice: P" + KeyByAlice + " = " + Point[KeyByAlice]);
_debug("KeyByBob: P" + KeyByBob + " = " + Point[KeyByBob]);

/*
Debug: PubPoint: P8 = (7, 218)
Debug: MaskedKeyAlice: P26 = (20, 274)
Debug: MaskedKeyBob: P178 = (162, 225)
Debug: KeyByAlice: P217 = (199, 151)
Debug: KeyByBob: P217 = (199, 151)
*/



使 8261783 fairy_mul 
MaskedKeyAlice = fairy_mul( PubPointIndex, SecKeyAlice )

26 = fairy_mul( 8, SecKeyAlice )
826 23426 757554
var test = 8;
for( var i=2; i<Order; i++ ) {
    test = fairy_add( test , 8 );
    if( 26 === test ) {
        _debug("Cracked: SecKeyAlice = " + i );
        break;
    }
}

// Debug: Cracked: SecKeyAlice = 75

使 fairy_mul  fairy_add  10100調 fairy_mul 

使ElGamel

RSA


p p  RSA 使CPU 100

使 RSA

  10

URL



https://yosei.fi/articles/8/23/#d31203


2003124
IDd31204


JavaScript
処理コストの例 (ミリ秒)
鍵の長さ(10進) 正規ユーザ二人分の計算量 ハッカーの計算量
2桁 10 10
3桁 20 100
4桁 20 380
5桁 (~10000) 30 9995
5桁 (~50000) 40 20900
6桁 (~100000) 40 44194
7桁 (~1000000) 61 502573
7桁 (~5000000) 70 推定値 1000000

概要


331使 1033使

使 1000 brute使






mod 1049



y2 = x3 + 5x + 109



1033



( 775, 359 )


 (0, 0) 
function ECCPoint( x , y ) {
    this.x = reduce( x , modulus );
    this.y = reduce( y , modulus );
    this.coord = "(" + this.x + ", " + this.y + ")";
}
var _O_ = new ECCPoint(0, 0);

ECCPoint.prototype.isO = function() {
    return (this.x === 0 && this.y === 0)? true : false;
}

ECCPoint.prototype.toString = function() {
    return this.coord;
}

ECCPoint.prototype.multiplied = function(k) {
    k = reduce( k , order );
    var bin_str = k.toString(2);
    var rev_str = "";
    for(var n= bin_str.length - 1; n >= 0; n-- ) {
        rev_str += bin_str.charAt(n);
    }
    var Result = ( rev_str.charAt(0) === "1" )? this : _O_;
    var Work = new Array();
    Work[0] = this;
    for(var i=1; i<rev_str.length; i++) {
        Work[i] = _add( Work[i-1] , Work[i-1] );
        if( rev_str.charAt(i) === "1" ) {
            Result = _add( Result, Work[i] );
        }
    }
    return Result;
}

reduce  0  (-1)  _add 2
function _add( P1, P2 ) {
    if( P1.isO() ) return P2;
    else if( P2.isO() ) return P1;
    var x1 = P1.x;
    var y1 = P1.y;
    var x2 = P2.x;
    var y2 = P2.y;
    if( x1 === x2 && y1 !== y2 ) {
        if( (y1+y2) % modulus === 0 ) return _O_;
        _debug("_add: Something is wrong:"
         + P1 + " : " + P2 );
        return void 0;
    }
    
    var lambda;
    if( x1 === x2 && y1 === y2 ) {
        if( ( 2 * y1 ) % modulus === 0 ) return _O_;
         else lambda = ( 3*x1*x1 + a ) * reverse( 2 * y1 );
    } else {
        lambda = ( y2 - y1 ) * reverse( x2 - x1 );
    }
    
    lambda %= modulus;

    var x3 = lambda*lambda - x1 - x2;
    var y3 = lambda * (x1-x3) - y1;
    x3 = reduce( x3, modulus );
    y3 = reduce( y3, modulus );
    
    var P3 = new ECCPoint( x3 , y3 );
    return P3;
}

 reverse 使
function reverse(N) {
    var r = [ modulus, reduce( N, modulus ) ];
    var q = [ 0, 0 ];
    var x = [ 1, 0 ];
    var y = [ 0, 1 ];
    for(var i=2; i<100; i++) {
        r[i] = r[i-2] % r[i-1];
        if( r[i] === 0 ) {
            return reduce( y[i-1] , modulus );
        } else {
            q[i] = ( r[i-2] - r[i] ) / r[i-1];
            x[i] = x[i-2] - q[i] * x[i-1];
            y[i] = y[i-2] - q[i] * y[i-1];
        }
    }
}

使 12 1000


http://www.faireal.net/demo/ecc2


JavaScript使RSA JavaScript RSA

RSA 使

使 1041 1044調 調1000 1000×1000100 11調 1

2

調100

Hassse-Weil pi (i=1, 2, ..., n)  調 ipi  ipi  10JavaScript 

URL



https://yosei.fi/articles/8/23/#d31204


 (2)

2003126
IDd31206


JavaScript 

105 10007   10091  Mozilla : Mozilla  JavaScript 10 brute attack 10000

106 100493  100673  brute attack 1

234 101020 RSA JavaScript RSAJavaScript


105

10007105

C : y2 = x3 + 9973x + B (mod 10007)
1 9973  C Hasse(-Weil)
(10007 + 1) ± 2(10007)1/2
9807.9310208.07

C :
var MyPrimes = [
    9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883,
    9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973,
    10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093,
    10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169,
    10177, 10181, 10193
];

 C i MyPrimes[i]   MyPrimes  9807.9310208.07 Lagrange

 C80008100使

findPoint 使 test   C50%x11002-99  test  MyPrimes[i] i iC 
function ECC( a, b, modulus ) {
    this.a = a;
    this.b = b;
    this.modulus = modulus;
}

ECC.prototype.findPoint = function( _x ) {
    if( _x === void 0 ) {
        for( var x = 1; x < 100 && x < this.modulus; x++ ) {
            var oPoint = this.findPointAt(x);
            if( oPoint !== void 0 ) return oPoint;
        }
    } else {
        return this.findPointAt( _x );
    }
}

ECC.prototype.findPointAt = function( _x ) {
    var x = reduce( _x , this.modulus );
    var X3 = ( x * x % this.modulus ) * x % this.modulus;
    var AX = this.a * x % this.modulus;
    var R = reduce( ( X3 + AX + this.b ), this.modulus );
    for( var y=0; y < this.modulus / 2; y++ ) {
        var L = reduce( y * y,  this.modulus );
        if( L === R ) {
            return new ECCPoint( x , y );
        }
    }
    return void 0;
}

ECC.prototype.getPrimeOrder = function() {
    var test = this.findPoint();
    for( var i=0; i<MyPrimes.length; i++ ) {
        var Result = this.multiply( test, MyPrimes[i] );
        if( Result.isO() ) {
            return MyPrimes[i];
        }
    }
    return void 0;
}

for(var B=8000; B<8100; B++ ) {
    var objECC = new ECC( 9973, B, modulus );
    var order = objECC.getPrimeOrder();
    if( order === void 0 ) {
        _debug( objECC + " is bad." );
    } else {
        _debug( objECC + " is good: order = " + order + " (prime)" );
        break;
    }
}

5011 80008200
y^2 = x^3 + 9973 * x + 8044 (mod 10007) is good: order = 10141 (prime)
y^2 = x^3 + 9973 * x + 8070 (mod 10007) is good: order = 10169 (prime)
y^2 = x^3 + 9973 * x + 8100 (mod 10007) is good: order = 9887 (prime)
y^2 = x^3 + 9973 * x + 8108 (mod 10007) is good: order = 10091 (prime)
y^2 = x^3 + 9973 * x + 8142 (mod 10007) is good: order = 10111 (prime)
y^2 = x^3 + 9973 * x + 8148 (mod 10007) is good: order = 9941 (prime)
y^2 = x^3 + 9973 * x + 8179 (mod 10007) is good: order = 10093 (prime)
y^2 = x^3 + 9973 * x + 8180 (mod 10007) is good: order = 9887 (prime)
y^2 = x^3 + 9973 * x + 8191 (mod 10007) is good: order = 9941 (prime)


y2 = x3 + 9973x + 8108 (mod 10007)


使 (5755, 4233) 


: 

http://www.faireal.net/demo/libecc_0.1.js

http://www.faireal.net/demo/ecc3  10000

http://www.faireal.net/demo/ecc3a  50000

http://www.faireal.net/demo/ecc3b_users  100000

http://www.faireal.net/demo/ecc3b  100000


103104 1 1×1141調調 使107 1 Work[i] 調使


URL



https://yosei.fi/articles/8/23/#d31206


JavaScript

2003128
IDd31208


ECCRSA ECCRSA RSA JavaScript ECC


JavaScript253 26107 RSA100RSA1024ECC160 JavaScript  Mozilla 700.1

ECCRSAJavaScript ECC

ECC

ECC使

100100 使

C使 JavaScript 107 JavaScript 

107ECCJavaScript


調ECC ECC JavaScript 

SchoofSEAHasse 107105

JavaScript 使

 JavaScript   MyPrimes  Hasse0  myECC 

 g_multiplyS_Work  MyPrimes 
使

g_multiplyS_Work  Work  g_multiplyS_Work 使 使 multiply _multiplyS  _multiplyS 使 g_multiplyS_Work.length = 0 1 使 MyPrimes 
: 



57 MyPrimes[i]   findPoint 使 使 x=0 
y2 = b (mod modulus)
b β (0, β)   findPoint b 使 21 findPoint 

modulus  3 (mod 4) 14bβ
β = ± b(modulus+1)/4
β
b(modulus+1)/2  b(modulus-1)/2 × b  b
bb(modulus-1)/2 = +1 

7b7 (modulus+1)/4 7  JavaScript RSA Bigint 使 Bigint 使

b
function isQR(A, B) {
    var sign = 1;
    while(1) {

        // (2/B)をくくりだす
        var power = 0;
        while( A % 2 === 0 ) {
            A = A / 2;
            power++;
        }

        if( power % 2 === 1 ) {
            var test = B % 8;
            if( test === 3 || test === 5) sign *= (-1);
        }

        if( A === 1 ) return (sign===1)? true : false;

        // Aは奇数なので、ひっくり返す
        old_A = A;
        A = B;
        B = old_A;
        if( A % 4 === 3 && B % 4 === 3 ) sign *= (-1);
        A %= B;
    }
}

使 2003 Pentium III 850MHz 10724 JavaScript


(一)14 modulus 

(二) order  modulus  modulus 2 調MyPrimes 

(三)1a

(四)b

(五)b調b4

(六)bβ 2 1 Point0 = (0, β) y

(七)Point0  MyPrimes[i] (i=0, 1, ...) i:  MyPrimes[i] 8 MyPrimes4

(八) findPointAt 使 : Point0 


ab 105ab b 調





JavaScript23

: y2 = x3 + 1234577x + 3213242

: 7654319 ()

: 7654873 ()

: (5234568, 2287747)


1067510 1612010 231 RSA23JavaScript ECC ECC23



http://www.faireal.net/demo/ecc4_2


HTML

http://www.faireal.net/demo/libecc_0.1a.js

 Bigint.powmod 使

http://www.faireal.net/demo/bigint_0_4c.js

:  bigint.js v0.5 

http://www.faireal.net/demo/bigint0.5/

JavaScript  v0.4 


ECC JavaScriptECC

23710 1010200 8253 JavaScript 10101 IEEE 253 cast

JavaScript JavaScript使 使JavaScript

 JavaScript  JavaScript  JavaScript 

JavaScript 5326.5108 
226.5 = 94906265
23 3 JavaScript ECCJavaScript

URL



https://yosei.fi/articles/8/23/#d31208


48

200491
IDd40901


JavaScript使 1548


JavaScript53 26.5 26.59490: 8

libecc_0.2.js  ECC.prototype.multi2 2 a, b 74 14228

2^49 = 56294995 3421312
3421312,  56294995 
3169126462050025 253:
9007199254740992
49 5048

 strNumber 14 Bigint._mod_typeN 使  Bigint._mod_typeF 使 15 Bigint._mod_typeN_15 16 253:
9007199254740992
JavaScript 使 10%Bigint 302
var bigDivisor = new Bigint( nDivisor );
使1%使80%  new 


3
使

MSIE b調

0 0 0
1使

1 0 0 0
使


11101101001110110000001
11101101011111000010101
40%
11101101000000000000000
使 Point( 0, y ) q ComPoint qPoint ComPoint q 


: 32


2^32 4n+3
p = 4294967311
0:
100000000000000000000000000001111


Fp 
C: y2 = x3 + ax + b

 p + 1 - 2p  #C(Fp )  p + 1 + 2p
1
p  q  p + κp (0<κ1.0)
qκ=1  2960   κ=0.1 302
 4294967311
 4294973843

100000000000000000000000000001111
100000000000000000001100110010011
20+130
100000000000000000000000000000000
13
0000000001111
1100110010011
1307136
 0000000001111
 1100100010101
136 1

modulus = p, a = 1234567891  b = 0 b  Point( 0, y )   ComPoint 

b = 8597 18

10b34521 130 1011
y^2 = x^3 + 1234567891*x +  8597
y^2 = x^3 + 1234567891*x + 11903
y^2 = x^3 + 1234567891*x + 23974
y^2 = x^3 + 1234567891*x + 31053
y^2 = x^3 + 1234567891*x + 35026
y^2 = x^3 + 1234567891*x + 37486
y^2 = x^3 + 1234567891*x + 42492
y^2 = x^3 + 1234567891*x + 44270
y^2 = x^3 + 1234567891*x + 44953
y^2 = x^3 + 1234567891*x + 45287
y^2 = x^3 + 1234567891*x + 47245
y^2 = x^3 + 1234567891*x + 52523
y^2 = x^3 + 1234567891*x + 59224
y^2 = x^3 + 1234567891*x + 65031
y^2 = x^3 + 1234567891*x + 66005
y^2 = x^3 + 1234567891*x + 67177
y^2 = x^3 + 1234567891*x + 67624
y^2 = x^3 + 1234567891*x + 81887
y^2 = x^3 + 1234567891*x + 89594
y^2 = x^3 + 1234567891*x + 94354
y^2 = x^3 + 1234567891*x + 95490

: 48


48 48
**** Prime Order ***
y^2 = x^3 + 172358387239013*x + 200408220063094 (mod 281474976710731)
Order = 281474976716851




bigint.js v0.5 beta 27

: 3210%

2004923

a, b  (0,y)  a (1, y)  b

x1y 0  50000  10b調

3221711.91933 10%
y^2 = x^3 + 1234567891*x + 3083410628 (mod 4294967311)
y = 4797
Order = 4294970761
y^2 = x^3 + 1234567891*x + 3086338068 (mod 4294967311)
y = 5093
Order = 4294968329
y^2 = x^3 + 1234567891*x + 3087180044 (mod 4294967311)
y = 5175
Order = 4294967563
y^2 = x^3 + 1234567891*x + 3196845180 (mod 4294967311)
y = 11681
Order = 4294967857
y^2 = x^3 + 1234567891*x + 3244625748 (mod 4294967311)
y = 13573
Order = 4294968257
y^2 = x^3 + 1234567891*x + 3261103308 (mod 4294967311)
y = 14167
Order = 4294969897
y^2 = x^3 + 1234567891*x + 3304383819 (mod 4294967311)
y = 15620
Order = 4294971937
y^2 = x^3 + 1234567891*x + 3361907915 (mod 4294967311)
y = 17364
Order = 4294968371
y^2 = x^3 + 1234567891*x + 3380201108 (mod 4294967311)
y = 17883
Order = 4294969153
y^2 = x^3 + 1234567891*x + 3634385183 (mod 4294967311)
y = 23958
Order = 4294969099
y^2 = x^3 + 1234567891*x + 3685499423 (mod 4294967311)
y = 25002
Order = 4294973713
y^2 = x^3 + 1234567891*x + 3717193803 (mod 4294967311)
y = 25628
Order = 4294968101
y^2 = x^3 + 1234567891*x + 3760478100 (mod 4294967311)
y = 26459
Order = 4294968347
y^2 = x^3 + 1234567891*x + 4254862140 (mod 4294967311)
y = 34561
Order = 4294972049
y^2 = x^3 + 1234567891*x + 4273458660 (mod 4294967311)
y = 34829
Order = 4294971431
y^2 = x^3 + 1234567891*x + 295650032 (mod 4294967311)
y = 39118
Order = 4294968583
y^2 = x^3 + 1234567891*x + 823596797 (mod 4294967311)
y = 45367
Order = 4294968199
2004926: 48

: 3210%使482.5%32 48

2.5%401 165000調 41
**** Prime Order ***
C: y^2 = x^3 + 172358387239013*x + 109143813811721 (mod 281474976710731)
A point on C: (1, 164998)
Order = 281474976719683

この記事のURL







使

 


 <メールアドレス>