ãã®è¨äºã¯CTF Advent Calender 2024ã®4æ¥ç®ã®è¨äºã§ãã
æ¨æ¥ã®è¨äºã¯n01e0ããã®SECCON 13 Quals - Jumpã§ãããä½åãã¹ã£ã¦æãã§ãããã«ãã«ãã¹ã±ã¸ã¥ã¼ã«ã«ãªã£ã¦ãã¾ãã®ãä½åãã¹ãä»äººäºã§ã¯ãªãã®ã§ãè¥ãæ£ãã¦ã¬ãã¥ã¼çããããã¨æãã¾ãã
ãã®è¨äºã¯å ã ã¯Cryptoã¯ã¶ããã¨é¡ãã¦ã400-bitç¨åº¦ã®åææ°ã¾ã§ãªããã¼ãPCã§ç´ å æ°å解ã§ãã¾ãããã512-bitç¨åº¦ã®åææ°ãªãã°5000åã¨æ°æéãããã§ç´ å æ°å解ã§ãã¾ããããã¿ãããªãã¨ãæ¸ããã¨ãã¦ããè¨äºã§ããããããããã®ä¸ç°ã§æ¥åæ²ç·æ³ã«ã¤ãã¦èª¿ã¹åºãããRabbit Holeã«è½ã¡ã¦ãã¾ã£ãã®ã§ãæ¥åæ²ç·æ³ã«éå®ããè¨äºã¨ãã¦å ¬éãããã¨ã«ãã¾ããã
æ¬è¨äºã§ã¯ãæ¥åæ²ç·æ³ã®ã¢ã«ã´ãªãºã ã解説ããå¾ãæ¥åæ²ç·æ³ã«é©ç¨ãããé«éåã®ãã¯ããã¯ãç´¹ä»ãã¾ããå®è£ ãã½ããã¦ã§ã¢ã®ä½¿ç¨æ¹æ³ãªã©ã«ã¯è§¦ãã¾ããã
è¨å·ã»ç¨èª:
- : ç´ å æ°å解ããæ°
- : æ±ãããç´ å æ°
- : ä¸ã®æ¥åæ²ç·
- : æ¥åæ²ç·ä¸ã®ç¹ã®ã¢ãã£ã³åº§æ¨ã«ãããxï¼ãåæ§ï¼
- : æ¥åæ²ç·ä¸ã®ç¹ã®å°å½±åº§æ¨ï¼å¾è¿°ï¼ã«ãããZ
- : æ¥åæ²ç·ã®ç¡éé ç¹
æ¥åæ²ç·æ³ã®æ¦è¦
ã¾ãã¯ãç°¡åã«æ¥åæ²ç·æ³ã®ã¢ã«ã´ãªãºã ã«ã¤ãã¦ç´¹ä»ãã¾ããæ¥åæ²ç·æ³ã¯p-1æ³ãp+1æ³ã®åçãå¿ç¨ããã¢ã«ã´ãªãºã ã§ãããããã®ã¢ã«ã´ãªãºã ã¯ãè¨ç®éã«å¤§ããªå½±é¿ãä¸ããã¨ããç¹æ§ãããã¾ããããã¯ãè¨ç®éãã«å¤§ããå½±é¿ãããäºæ¬¡ãµããæ³ãæ°ä½ãµããæ³ã¨ã¯å¯¾ç §çã§ããããã¦ãæ¥åæ²ç·æ³ã¯ãããã®ã¢ã«ã´ãªãºã ã®ãªãã§ãæãé«ãæ§è½ãæã¤ã¢ã«ã´ãªãºã ã§ãããã®ãããæ¥åæ²ç·æ³ã¯ã®å¤§ããã«ä¾åããç´ å æ°å解ã¢ã«ã´ãªãºã ã§ããæ°ä½ãµããæ³ãªã©ãé©ç¨ããåå¦çã¨ãã¦ç¨ãããã¾ããä»ã«ããæ°ä½ãµããæ³ãé©ç¨ã§ããªããããªé常ã«å¤§ããªæ°ãç´ å æ°å解ããã®ã«ç¨ãããããããã¾ãã2024å¹´ç¾å¨ãæ¥åæ²ç·æ³ã§è¦ã¤ãã£ãæ大ã®ç´ å æ°ã¯7^337+1ã®ç´ å æ°ã§ãã274-bitã®æ°ã§ã(ECMNET)ã
p-1æ³ãp+1æ³ãæ¥åæ²ç·æ³ã®ã¢ã«ã´ãªãºã ã«ã¤ãã¦ã¯ã以ä¸ã®è¨äºã«åãããããã¾ã¨ã¾ã£ã¦ãã¾ãã
æ¬è¨äºã§ããç°¡åã«ã§ããæ¥åæ²ç·æ³èªä½ã«ã¤ãã¦èª¬æããã¾ãã
æ¥åæ²ç·æ³ã¯ãã®éèªæãªç´æ°ãã©ã³ãã ã«çºè¦ããä¹±æã¢ã«ã´ãªãºã ã§ããçºè¦ã§ããç´æ°ã®å¤§ãããç´æ°ãçºè¦ã§ãã確çã¯ãã¢ã«ã´ãªãºã ã«ä¸ãããã©ã¡ã¼ã¿ã«ãã£ã¦å¤åãã¾ãã以éã§ã¯ã説æã®ç°¡ç¥åã®ããã«ã¢ã«ã´ãªãºã ãæåããå ´åã¯ç´ å æ°ãçºè¦ãããã®ã¨ãã¾ã*1ã
以ä¸ã¯ãé«éåãè¡ããã¦ããªãæç§æ¸çãªæ¥åæ²ç·æ³ã®å¤§ã¾ããªå®è£ ã§ãã
def get_M(n, bound): m = 1 # equivalent to: for i in range(1, bound): m = LCM(m, i) for p in primes(bound+1): # primes in [0, bound] k = floor(log(bound) / log(p)) # k such that p^{k} <= bound < p^{k+1} m *= p**k return m def ecm(n, bound): E, P0 = get_random_elliptic_curve_and_point(N) m = get_M(n, bound) try: Q = m * P0 except ModInvException as e: return gcd(e.value, n) return None
æ¥åæ²ç·æ³ã§ã¯ãã¾ãä¸ã®æ¥åæ²ç·ï¼ã®ãããªãã®*2ï¼ãã©ã³ãã ã«çæãã¾ããã¢ã«ã´ãªãºã ãç´ å æ°ã®çºè¦ã«æåã§ããã¨ãã¦ãã¨åããã©ã¡ã¼ã¿ã®ä¸ã®æ¥åæ²ç·ãèãã¦ã¿ã¾ã*3ãããã§ããã¤ã¾ãã«ãªããããªç¹ãè¦ã¤ããããã¨ãã¾ãããã®ã¨ããå ã®ã§ã¯ã©ããªãã§ããããï¼æ¥åæ²ç·ã®æ§è³ªããã ãæç«ãã¾ãããã£ã¦ãã§ããä¸æ¹ã§ãæ¥åæ²ç·ã®å æ³å ¬å¼ã«ã¯ã®å ´åã«ãä¿æ°ã¨ãã¦ç»å ´ãã¾ããã»ã¨ãã©ã®å ´åãªã®ã§ããã®ã¯è¨ç®ãããã¨ãã§ãã¾ããããã£ã¦ããæºããå¤ã¯ä¸ã«åå¨ããªããã¨ãåããã¾ãããåæã«ããè¨ç®ããéç¨ã§ç´ å æ°ãçºè¦ã§ãã¦ãããã¨ãåãããã¨æãã¾ãã
ããã¾ã§ã®è°è«ã§ãã§ã¨ãªããããªã¨ãçºè¦ã§ããã°ãç´ å æ°ãçºè¦ãããã¨ãã§ããã¨åããã¾ãããããã¯ãå ç®ã§ã¯ãªãã¹ã«ã©ã¼åã§ãåæ§ã®çµè«ã«ãªãã¾ã*4ãã¤ã¾ãããæºãããããªæ£æ´æ°ã¨ãçºè¦ãããã¨ã§ããç´ å æ°ãçºè¦ãããã¨ãã§ããã¨ãããã¨ã§ããã¯ããã®ä½æ°ã®åæ°ã§ããã¨ããã¤ãã®ã¨ãã«éãæç«ãã¾ããããã§ããã¾ããã¨ãã¨ãã°ãã®ä¸å®å²åã¯ãå²ãåã£ã¦ãããã®ã§ã¯ãªããã¨ããã®ãæ¥åæ²ç·æ³ã®ã¢ã¤ãã¢ã§ãã
ã®å®ãæ¹ã¯ããããã©ã¡ã¼ã¿ãç¨ãã¦ãã¨ãã¾ããããããã¨ãã-power-smoothãªå ´åãã¤ã¾ãåç´ å æ°æ¯ã®ç©ãå ¨ã¦ä»¥ä¸ã®å ´åã«ã¢ã«ã´ãªãºã ãæåããã¨è¨ãã¾ãã
ã¯ã«ã»ã¼ä¸æ§ã«åå¸ãã¾ãããã®ãã¨ãç¨ãã¦ãæ±ãããã®å¤§ããæ¯ã«ãã©ã¡ã¼ã¿ããã¾ãå®ãã¦ç´ å æ°å解ãè¡ãã¾ãã
è¨ç®éã®è§£æ
ã-bitã®æ´æ°ã®ä¹ç®ã«ãããè¨ç®éã¨ãã¾ããããã¨ãæ¥åæ²ç·æ³ã®å
·ä½çãªè¨ç®éã¯ã¨ãªãã¾ããæ¬é
ã§ã¯ããããå°åºãã¾ãããã®è¨ç®éã¯ãå
ç¨ã®ecm
ã«ã¼ãã³ä¸åº¦ã®å®è¡ã«ãããè¨ç®éã§ã¯ãªãã以ä¸ã®ç´ å æ°ãè¦éã確çããä¸åãããã«å¿
è¦ãªè¨ç®éã§ãããã¨ã«æ³¨æãã¦ãã ããã
ã¾ããå
ç¨ã®ecm
ã«ã¼ãã³ã«å¿
è¦ãªè¨ç®éãè¦ç©ããã¾ããbound
ãã¨ããã¨ããæç«ãã¾ãããã®ããããè¨ç®ããããã«å¿
è¦ãªè¨ç®éã¯素数定理ãç¨ãããã¨ã§
ã¨åããã¾ããããã¯ecm
ã«ã¼ãã³ã§æãæ¯é
çãªé¨åã§ããããããããã«ã¼ãã³ã®è¨ç®éã¨ãªãã¾ãã
次ã«ãecm
ã«ã¼ãã³ãå®è¡ããåæ°ã¨ã®æé©ãªå¤ãè¦ç©ããã¾ãã
ã¾ããé¢æ°ã以ä¸ã®ããã«å®ç¾©ãã¾ãã
以ä¸ã®æ´æ°ã-smooth*5ã§ãã確çã¯ãã§ã§ãããã¨ãç¥ããã¦ãã¾ã(Canfield-ErdÅs-Pomerance theorem)ãããã¯æ´æ°ãããé¸ãã ã¨ãã«ããçµé¨çã«åããã¨ãè¨ãã¾ãã
ãã«ãã¦åã«ã¼ãã³ãå®è¡ãããã¨ãèãã¾ããããã®æå確çã¯ãã§ãããã¨ããã§ã«æ¼¸è¿ãã¾ãããªã®ã§ããã®ãã©ã¡ã¼ã¿ã§ã¨å®è¡åæ°ã§è¦æ±ããæå確çãéæã§ãã¦ãã¾ããæå¾ã«ãå ¨ä½ã®è¨ç®éãèãã¾ããããã¯ãã¨ãªãã¾ãããã®å¼ãæé©åããã¯ã§ããããããããä»£å ¥ãã¦ãå¾ããã¨ãã§ãã¾ãã
æ¥åæ²ç·æ³ã®é«éå
æç§æ¸çãªå®è£ ãåæ²ãã¾ã:
def get_m(n, bound): m = 1 # equivalent to: for i in range(1, bound): m = LCM(m, i) for p in primes(bound+1): # primes in [0, bound] k = floor(log(bound) / log(p)) # k such that p^{k} <= bound < p^{k+1} m *= p**k return m def ecm(n, bound): E, P0 = get_random_elliptic_curve_and_point(n) m = get_m(n, bound) try: Q = m * P0 except ModInvException as e: return gcd(e.value, n) return None
ãã®å®è£ ãé«éåãã¦ããã¾ãã
é«éåææ³1: å°å½±åº§æ¨ã¨Lucas Chainãåºç¤ç®è¡ã®é«éå
ã¾ããæ¥åæ²ç·ä¸ã®ç¹ãå°å½±åº§æ¨ã§æã¤ãã¨ã§ãæ¥åæ²ç·ä¸ã®å æ¸ç®ã§é¤ç®ãè¡ããªãããã«ã§ãã¾ããå°å½±åº§æ¨ãç¨ãããã¨ã¯åèè«æ(Lenstra 1985)ã®æç¹ããææããã¦ãã¾ãããå°å½±åº§æ¨ã«ã¤ãã¦ã¯ã以ä¸ã§è©³ãã解説ããã¦ãã¾ãã
次ã«ããé½ã«è¨ç®ããªãããã«ãããã®ä»£ããã«ã«ã¼ããã¨ã«ãk度è¨ç®ãããã¨ã¨ãã¾ããæ¥åæ²ç·ä¸ã®ã¹ã«ã©ã¼åã¯ãæ¢ç¥ã®ç¹ã®å ç®ãäºåç®ãç¹°ãè¿ãã¦è¡ããã¾ããå°å½±åº§æ¨ã¯ä»ã®åº§æ¨ã®æã¡æ¹ã¨æ¯ã¹ã¦å ç®ã«å¤ãã®ã¹ãããæ°ããããã¨ããæ¬ ç¹ãããã¾ããããåãã£ã¦ãããªãã°é«éã«è¨ç®ãããã¨ãã§ãã¾ãï¼è©³ç´°ã¯20 years of ECMã®2ç¯ãåç §ï¼ããã®ãããå ç®ã¯å·®ãæ¢ç¥ã®ç¹å士ã®ã¿ã§è¡ãããã§ãããã®ãããªæ¡ä»¶ä¸ã§ãæå°ã¹ãããæ°ã§ãè¨ç®ããããã®å æ³é£éã¯Lucas Chainã¨ãã¦ç¥ããã¦ãã¾ããLucas Chainã®é·ãã¯ã¨ãªãã®ã§ãå æ³é£éã®æ¡ä»¶ã«å¶éãã¤ãããã¨ã§ã®ããã«ãã£ã¯å¤§ããããã¾ããã以ä¸ã¯ããè¨ç®ããããã®Lucas Chainã®ä¸ä¾ã§ã:
- 2P := 2*P
- 3P := 2P + P (å·®ã¯P)
- 5P := 2P + 3P (å·®ã¯P)
- 7P := 2P + 5P (å·®ã¯3P)
- 9P := 2P + 7P (å·®ã¯5P)
- 16P := 7P + 9P (å·®ã¯2P)
- 23P := 7P + 16P (å·®ã¯9P)
ãã®ãããªLucas Chainã¯ãå°ããã«ã¤ãã¦ã¯åè¨ç®ãããã¨ãã§ãã¾ããLucas Chainãæ¢ç¥ã§ãªãå ´åããPRACã¢ã«ã´ãªãºã ã¨ããã¢ã«ã´ãªãºã ãç¨ãããã¨ã§æé©ãªæ¼ç®åæ°ã«è¿ãchainãçæãããã¨ãã§ãã¾ã*6ã
ããã«ããããã®ã¢ã«ã´ãªãºã æ¼ç®ã®æ ¹åºã«ããå¤åé·æ¼ç®ãmod pä¸ã§ã®ä¹ç®ã®é«éåãè¡ãã¾ããããã«ã¯998244353ã§å²ã£ããã¾ããæ±ãããã¨ãæ¥èª²ã«ãã¦ããå¢åã«ã¯ã馴æã¿ã®ãã¢ã³ã´ã¡ãªä¹ç®ãBarrett Reductionã¨ãã£ããã¯ããã¯ãé©ç¨ãããã¨ãã§ãã¾ãã
ãããã®æé©åãå®è£ ããã³ã¼ãã以ä¸ã«ç¤ºãã¾ã:
def ecm(n, bound): E, P0 = get_random_elliptic_curve_and_point(n) Q = P0.to_proj_coords() for p in filter(is_prime, range(bound)): # primes in [0, bound) k = floor(log(bound) / log(p)) # k such that p^{k} <= bound < p^{k+1} p_chain = get_chain(p) for i in range(k): Q = compute_mul_using_chain(Q, p_chain) if gcd(Q.Z, n) != 1: return gcd(Q.Z, n) return None
é«éåææ³2-1: standard continuation
次ã«ãã¢ã«ã´ãªãºã èªä½ã«æ¹è¯ãå ãã¾ããæ°ããå¦çãä»ã¾ã§ã®ã¢ã«ã´ãªãºã ã«ç¶ãå½¢ã§å®è£ ããä»ã¾ã§ã®ã¢ã«ã´ãªãºã ãstage 1ãå ããã¢ã«ã´ãªãºã ãstage 2ã¨å¼ã¶ãã¨ã«ãã¾ããã¾ããstage 1ã§ç¨ãã¦ããboundãbound1(ãããã¯B1)ã¨è¨ãæããstage 2ã§ç¨ããæ°ããªboundãbound2(ãããã¯B2)ã¨å¼ã¶ãã¨ã«ããã¾ãã
stage 2ã§ã¯ãstage 1ã§è¨ç®ãããç¹ã§ããã«æ§ã ãªä¿æ°ãå¥ã ã§æãåããã¾ããå ·ä½çã«ã¯ãã«å«ã¾ããç´ æ°ãã¹ã¦ã«ã¤ãã¦ããé½åº¦ç¢ºããã¾ãããããããã¨ã§ãããã¨ä¸æ©ãã ã£ãã«å¯¾ãã¦ãããããã«ã¯ä¸è¦ããã¨å¬ãããæ®ã©ãªãããã«æããããããã¾ãããããã®ã¹ãããããããã¨ã§åã»ã©ã®é«éåããããããã¾ã(Brent 1985)ãã¾ãã以éã«è¿°ã¹ããã¯ããã¯ã«ãã£ã¦ãã®è¨ç®ã¯ããé«éã«è¡ããããã«ãªãã¾ãã
def ecm_stage1(n, E, B1): # not optimized return get_m(n, B1) * E.random_element() def ecm_stage2(n, E, Q, B1, B2): for p in primes(B1, B2+1): # primes in [B1, B2] Q2 = p * Q if gcd(Q2.Z, n) != 1: return gcd(Q2.Z, n) return None def ecm(n, B1, B2): assert B1 <= B2 E = get_random_elliptic_curve(n) Q = ecm_stage1(n, E, bound1) if gcd(Q.Z, n) != 1: return gcd(Q.Z, n) return ecm_stage2(n, E, Q, B1, B2)
é«éåææ³2-2: Montgomery continuation
ã¾ããã«å«ã¾ããç´ æ°ããã¹ã¦ã¨ã®åã§è¡¨ããã¨ãã§ãããããªãèã¾ããããã¯è²ã ãªã¨ãæ¹ãããã¾ããããç¨ãã¦ãããã¨ã«ãã¾ããããã¯baby-step giant-stepæ³ã®èãæ¹ã¨è¿ãã§ããããã使ãã°ãããç¨ãã¦ã¨è¡¨ãã¾ãããªã®ã§ãããã¹ã¦åè¨ç®ããå¾ã«ããæ¯åº¦è¨ç®ãã¦ãããã°ãããã¨ã«ãªãã¾ãã
ããã§ãã¯ã表ãã¦ãããã¨ãæãåºãã¾ãããã®ã¨ãã§ãããããAffine座æ¨ï¼å°å½±åº§æ¨ã§ãªãã(x, y)ã®2ã¤çµã§ã¨ã座æ¨ï¼ã§ã®æ¥åæ²ç·ã®æ§è³ªãæãåºãã°ï¼ã¯ã¢ãã£ã³åº§æ¨ã§ã®xãã¨ãè¨æ³ã¨ããï¼ã§ãããã¨ãåããã¾ããã¾ã¨ããã¨ã(ã«ã¤ãã¦ãåæ§)ã¨è¡¨è¨ãããã¨ã¨ããã°ããªãã°ã§ããã¨ãããã¨ã§ãã
ã¾ããã§ããã¨ããæ§è³ªãèãã¾ããããã¨ãã«ã¤ãã¦èª¿ã¹ãå ´åãèªåçã«ã«ã¤ãã¦ã調ã¹ããã¨ã«ãªãã¨åããã¾ãããããç¨ããã¨ãã¢ã«ã´ãªãºã ã§ã«ãã¼ããéåã®ãµã¤ãºã¯ãã®ã¾ã¾ã«ãçæ¹ã®éåã®ãµã¤ãºãååã«æ¸ãããã¨ãã§ãã¾ãã
ãã®é«éåã§ã¯è¨ç®éã¯å®æ°åã»ã©ããå¤åãã¦ãã¾ããããåé¡ãæ±ããããå½¢ã«æ´ãããã¨ãã§ãã¾ãããããã¾ã§ãå®è£ ããã¨ã以ä¸ã®ã¨ããã¨ãªãã¾ãã
def ecm_stage2(n, E, Q, B1, B2): d = floor(sqrt(B2 - B1)) S = list([s for s in range((d+1)//2) if gcd(s, d) == 1]) T = list(range(B1//d*d, B2, d)) sxs = [(s*Q).to_affine().x for s in S] # x coords of sQ txs = [(t*Q).to_affine().x for t in T] # x coords of tQ for sx in sxs: for tx in txs: if gcd(sx - tx, n) != 1: return gcd(sx - tx, n) return None
é«éåææ³2-3: FFT continuation
以ä¸ã®Montgomery Continuationã¯è¨ç®éãã§ãããããããé«éåãã¾ããã解ã¨ãã¦æã¤å¤é å¼ãèãã¾ãããã®ã¨ããã®ãã¡ãã©ããã¯ãæºããã¾ãããã¹ã¦ã®ã«ã¤ãã¦ãæ±ãããã¨ã¯ãå¤é å¼ã®å¤ç¹è©ä¾¡ãè¡ããã¨ã§ã®è¨ç®éã§è¡ããã¨ãã§ãã¾ãããåå²çµ±æ²»çã«æãåããããã¨ã®è¨ç®éã§è¡ããããããã®è¨ç®éã§æ±ãããã¨ãã§ããã¨åããã¾ããã
ã¾ããã解ã¨ãã¦æã¤å¤é å¼ãèããä¸ã§ã®å¤é å¼GCDãåãææ³ãããã¾ããåçã¯ç解ã§ãã¦ããªãã§ãããå¤é å¼ã®å¤é å¼GCDãåãã¨ã¨äºãã«ç´ ã§ãªãå¤ãå®æ°é ã«åºã¦ããããã§ããç´æçã«ã¯ã§åã解ãæã¤ãã¨ãå½±é¿ãã¦ãããã§ãã
def polyeval_method(sxs, txs, n): F = prod([(sx - X) for sx in sxs]) for Ftx in multipoint_evaluation(F, txs): # equivalent to [F(tx) for tx in txs] p = gcd(prod(Ftxs), n) if p != 1: return p return 1 def polygcd_method(sxs, txs, n): F = prod([(sx - X) for sx in sxs]) # sxs G = prod([(tx - X) for tx in txs]) # sxs return gcd(polygcd(F, G)[0], n)
é«éåææ³3: Brent-Suyamaâs extension
ä»ã¾ã§ã®stage 2ã§ã¯ããæãåããã¦ãã¾ãããBrent-Suyamaâs extensionã¯ãæãåãããæ°ãããå¤é å¼ãç¨ãã¦ã¨ããææ³ã§ããã¯ä½æ¬¡ã®ãDickson polynomialã¨ããããã¨ãå¤ãããã¾ãããã®ããã«ãã¨ã£ãã¯ã¯å²ãåããä¸ã«ä»ã®ç´ å æ°ãå«ã¿ã¾ãããã£ã¦ãã¢ã«ã´ãªãºã ã®æå確çãå°ãä¸æãã¾ãã
é«éåææ³4: Edwards Curve
ããããã®ææ³ã¯ã20 years of ECMã«ãè¨è¼ããªããgmp-ecmã«å®è£ ããã¦ããªãææ³ã§ãã
ä»ã¾ã§ã®ææ³ã§ã¯ãã©ã³ãã ãªæ¥åæ²ç·ãã®ãã©ã¡ã¼ã¿ãã©ã³ãã ã«æ±ºãããã¨ã§ã¨ã£ã¦ãã¦ãã¾ããããã®é¸æããæ¥åæ²ç·ããè¨ç®ããã®ã«é½åã®ãããã®ã«å¤æ´ãããã¨ã¯ã§ããªãã®ã§ããããï¼ECM using Edwards curvesã§ã¯ãé¸æããæ¥åæ²ç·ãEdwards Curveã¨å¼ã°ããæ¥åæ²ç·ã«ãã¾ãããEdwards Curveã§ã¯ãå°å½±åº§æ¨ã§ã®å ç®ã®ãããªå¶ç´ãåããã«ããç¨åº¦é«éãªå ç®ãå¯è½ãªæ¥åæ²ç·ã§ã*7ã
ã¾ããææ°ã®ç 究ã§ã¯è¤æ°ã®æ¥åæ²ç·ã®è¡¨ç¾éã移è¡ããªããæ¼ç®ãããã¨ã§ãè¤æ°ã®è¡¨ç¾ã®ããã¨ããåããããã¨ãã£ãææ³ãææ¡ããã¦ãã¾ãã
eprint.iacr.org
é«éåææ³5: stage 1 batching
ãã¾ã¾ã§ã®stage 1ã§ã¯ãåç´ æ°ãã¨ã«æé©ãªå æ³é£éãå¾ã¦ããããç¨ãã¦ä¹ç®ãè¡ã£ã¦ãã¾ãããECM using Edwards curvesã§ã¯è¤æ°ã®ç´ æ°ãããåããã¦ããç¨åº¦å¤§ããªæ°ã«ããå¾ã«ãå æ³é£éãè¨ç®ããã¨ãã£ãæé©åãå ãã£ã¦ãã¾ãã
以ä¸ã®ã§ã¯ãæãåãããç´ æ°ã®çµã工夫ããããæ¼ç®åæ°ãå°ãªããããªçµã¿åãããæ¢ç´¢ãã¦ãã¾ãã
ä¾ãã°ãbound1=256ã¨ããéã«ã¯ã以ä¸ã®ããã«çµã¿åããããã¨ã§ããå¹ççã«è¨ç®ãããã¨ãã§ãã¾ãã
ãããã«
æéããªãã¦æå¾ã®ã»ããéã«ãªã£ã¦ãã¾ãã¾ããããæéãããã¨ããè¦ã¦è¿½è¨ãã¦ããããããããªã¨æã£ã¦ãã¾ãã
ææ¥ã¯arkããã«ãããabout:blankãã¯ããã¯ã¨"disconnection"ã®è§£èª¬ã§ããã楽ãã¿ã«ã
*1:åææ°ã§ã話ã®å¤§çã¯ç°ãªãã¾ãã
*2:æ¥åæ²ç·ã¯ä½ã«å¯¾ãã¦å®ç¾©ããããã®ãªã®ã§ãããããªãã®ãã¨è¡¨è¨ãã¦ãã¾ããããããªãã®ããªã®ã§ãå æ³ã«å¯¾ãã¦éãã¦ããªããã群ããªãã¾ããã
*3:循ç°è«æ³ã«ãªã£ã¦ãã¾ãããã¢ã«ã´ãªãºã ã®æ£å½æ§ã証æãããã¨ãç®æãããã®ã§ã¯ãªãã®ã§ç®ãçã£ã¦ãã ããã
*4:ã¹ã«ã©ã¼åã¯å ç®ã®ç¹°ãè¿ãã§è¨ç®ããããã¨ããç´ã¡ã«åãããã¨æãã¾ãã
*5:ãããpower-smoothã«ã¤ãã¦ã®è°è«ã§ãªãã¦è¯ãçç±ã¯ãã¾ãããåãã£ã¦ãã¾ãããã©ããè¦ã¦ãsmoothnessã§è°è«ãã¦ãã¦è¬ã§ã
*6:ç§ã®èãã§ã¯ãLucas Chainãæ¢ç¥ã§ãªãå ´åã¯ã«å¯¾ãã¦PRACã¢ã«ã´ãªãºã ãé©ç¨ããããã«æ²¿ã£ã¦è¨ç®ããã»ããããããã«æãã¾ããããããgmp-ecmã®å®è£ (ecm.c#L1207-1240)ã§ã¯ã©ãããããã¯ãªã£ã¦ãã¾ããããªããªã£ã¦ããªãã®ãã®çç±ã¯è¬ãªã®ã§ãåãã£ããæãã¦ã»ããã§ãã
*7:Ed25519ã®Edããã®ã¿ã¤ãã®æ¥åæ²ç·ãç¨ãã¦ãããã¨ããååãåããã¦ãã¾ã