Python ECDHEアルゴリズム

3560 ワード

暗号化学は数学に大きく依存しているが,私はPythonに大きく依存してこの奥深い学問を理解している.最近、ECDHEがデバイス側の鍵交渉に使用されることを検討してきたので、コードテストを探しました.
#Elliptic curve Project
#Programmed by Adam Bowers and Nick Hilbert
#This is the driver for first party in two party communication
#it reads in config from firstPartyConfig.cfg, recieves shared secret from second party,
#sends its shared secret to second party, and calculates final shared secret which it then outputs

from ecc import Ecc
from point import Point
from ff import inv
from dhec import DhecUser
import configparser
import time
    
def main():
    #read first party config
    config = configparser.RawConfigParser()
    config.read('firstPartyConfig.cfg')
    p = config.getint('runInfo','fieldMod') # field modulo p
    a = config.getint('runInfo','aVal')
    b  = int(config.get('runInfo','bVal'),16) # curve parameters
    genX = int(config.get('runInfo','GeneratorX'),16)
    genY = int(config.get('runInfo','Generatory'),16)
    s = time.time()
    G = Point(genX,genY) # generator point
    curve = Ecc(a, b, p)
    #n = curve.getOrder(G) # ord(G)
    firstSecret = DhecUser(curve, G,
                        config.getint('runInfo','generatorMult'))
    #read second party config
    config = configparser.RawConfigParser()
    config.read('secondPartyConfig.cfg')
    #assuming curve parameters are the same, so don't read those
    secondSecret = DhecUser(curve, G,
                        config.getint('runInfo','generatorMult'))
    #get final shared secret
    d = time.time() - s
    print("Time consumed: %f"%(d)) 

    # cacluateSharedSecret is time consuming task
    firstPartySharedSecretResult = firstSecret.calculateSharedSecret(secondSecret.generatePublicKey())
    secondPartySharedSecretResult = secondSecret.calculateSharedSecret(firstSecret.generatePublicKey())

    d = time.time() - s
    print("Time consumed: %f"%(d)) 

    print("First  party got point " + firstPartySharedSecretResult.toString())
    print("second party got point " + secondPartySharedSecretResult.toString())

    d = time.time() - s
    print("Time consumed: %f"%(d)) 

if __name__=="__main__":
    main()

コード1:mockTwoPartyMainTimeStamp.py、タイムパフォーマンステストコードの一部を追加しました
[runInfo]
otherIpAddress =  10.106.50.103
otherPort = 2002
myIpAddress = 10.106.51.88
myPort = 5002
GeneratorX = 188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012
GeneratorY = 07192b95ffc8da78631011ed6b24cdd573f977a11e794811
aVal = -3
bVal = 64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1
fieldMod = 6277101735386680763835789423207666416083908700390324961279
generatorMult = 12534

コード2:firstPartyConfig.cfg
[runInfo]
otherIpAddress = 10.106.51.88
otherPort = 5002
myIpAddress = 10.106.50.103
myPort = 2002
GeneratorX = 188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012
GeneratorY = 07192b95ffc8da78631011ed6b24cdd573f977a11e794811
aVal = -3
bVal = 64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1
fieldMod = 6277101735386680763835789423207666416083908700390324961279
generatorMult = 9786

コード3:secondPartyConfig.cfg
2つのプロファイルパラメータのうちgeneratorMultiだけが異なることが分かった.
テストすると、caculateSharedSecretで最も時間がかかります.埋め込みC/C++言語に移植する準備をしていますが、C/C++原生は任意の長さの大きな整数をサポートせず、自分でクラスを再実現しなければならないことに気づきました.加えてECDSAを評価する必要があるので、直感的に評価するのに時間がかかるでしょう.
このケースから見ると、Pythonの開発効率はC++などの比較的下位レベルのプログラミング言語よりはるかに高いことに重点を置いています.