엘가 암호화 알고리즘

 

엘가 암호화 알고리즘

엘가 암호화는 공개 키 암호 시스템입니다. 그것은 당사자와 암호화 된 메시지와 비대칭 키 암호화 통신을 사용합니다.
기반 암호 시스템은 찾기 어렵 의 순환 그룹 이산 대수가 어려운 우리가 G 알면서도  및 G의  K를 , G 계산하기 어려운  AK를 .

엘가는 암호 아이디어
앨리스 가정은 밥과 통신하고자합니다.

  1. 밥은 공개 키와 개인 키를 생성합니다 :
    • 밥은 매우 많은 수의 선택 Q 및 순환 그룹 F의  Q를 .
    • 환상 기에서 ˚F  Q , 그 모든 소자 선택 g
      구성원 매우 충족 된 GCD (A, Q) = 1과 같이 .
    • 그 다음, G = H 계산  .
    • 밥 해제 F , H = g  , Q g 그의 공개 키와, 그리고 유지 개인 키로.
  2. 앨리스는 데이터를 암호화 밥의 공개 키를 사용합니다 :
    • 앨리스 환상 군으로부터 F, 소자 선택 K를 ,  GCD 있으므로 (K, Q) = 1 .
    • 그녀는 G = P 계산  K 및 H = S  K  = G  AK를  .
    • 그녀와 M은 S 곱한.
    • 그녀는 (P, M * S) = (G 전송  K , M * S 참조).
  3. 밥은 메시지를 해독 :
    • 밥 계산 S  '  = P   = G  AK .
    • 그는 M * S S로 나눈 것  ' M, 즉, S = S 수득  '를 .

다음은 파이썬에서 실현 엘가 암호입니다

# 파이썬 프로그램은 엘가 암호화를 설명하기 위해   
    
가져 임의    
  수학 수입 
    = random.randint (2, 10 )   
    
DEF (a, b) GCD :   
     만약 은 < B :   
         리턴 GCD (b, a)   
     ELIF %의 B == 0 :   
         리턴 B;   
    다른 :   
         리턴 GCD (B, A %의 B)   
    
# 큰 난수를 생성    
데프 gen_key (Q) :   
     = random.randint (POW (10, 20 ), Q)   
     동안 GCD (Q 키) = 1! :    = random.randint (POW (10, 20 ), Q)   
    
    리턴 
    
# 멱승 잉여    
DEF 전력 (A, B, C) :   
    X = 1  =
    
    반면 B> : 0   
         의 경우 B % 2 == 0 :   
            X = (X * Y) %의 C;   
        Y = (Y *의 Y) %의 C   
        B = INT (b / 2 )   
    
    반환 X % C를   
    
# 비대칭 암호화    
DEF 암호화 (MSG, Q, H, g) :   
    
    EN_MSG = []   
    
    K = gen_key (Q) # 송신자의 개인 키    
    S = 전력 (H, K, Q)   
    P = 전력 (g, K, Q)   
        
    위한 I 범위 (0, 렌 (MSG)) :   
        en_msg.append MSG ([I])   
    
    인쇄 ( " g ^ k를 사용했을 때 " , P)   
     인쇄 ( " g ^는 AK를 사용 : " , S)   
     에 대한 I 범위 (0, 렌 (en_msg)) :   
        en_msg [I] = S * 워드 (en_msg [I])   
    
    반환 en_msg, P   
    
데프 (en_msg, 페이지, 키, Q) 해독 :   
    
    dr_msg = []   
    H = 전력 (p, 키, Q)   
     에 대한 I 범위 (0, 렌 (en_msg)) :   
        dr_msg.append (CHR (INT (en_msg [I] / H)))   
            
    반환 dr_msg   
    
# 드라이버 코드    
데프 주 () :   
    
    MSG = ' 암호화 '   
    인쇄 ( " 원본 메시지 : " , MSG)   
    
    Q = random.randint (영역 (10, 20), 쉘 (10, 50 ))   
    g = random.randint (2 , Q)   
     = gen_key (Q) # 수신기 용 개인 키    
    H = 힘 (g, 키, Q)   
     출력 ( " g 사용 : " , g)   
     인쇄 ( " g ^ 사용한 : " , H)   
    
    en_msg, P = 암호화 (MSG, Q, H, g)   
    dr_msg = 복호화 (en_msg, P, 키, Q)   
    dmsg = '' .join (dr_msg)   
     인쇄 ( " 해독 메시지 : " , dmsg);   
    
    
경우  __name__ == ' __main__ ' :   
    본관()   

샘플 출력 :

원본 메시지 : 암호화 
g 사용 : 5860696954522417707188952371547944035333315907890 
사용 g ^ A : 4711309755639364289552454834506215144653958055252 
사용 g ^ K : 12475188089503227615789015740709091911412567126782 
사용 G는 ^ AK : 39448787632167136161153337226654906357756740068295 
해독 메시지 : 암호화

암호화 시스템에서, 원래의 메시지 M 에 의해 AK는 승산 숨길 . 상기 마스크를 제거하기 위해 K된다 단서의 형태로 주어진다 . 누군가가 알고하지 않는, 그는 검색 할 수 없습니다 수를 . 루프 그룹 이산 대수를 찾기 어렵습니다, 오직 G 알고  와 G  K는 G 계산하기에 충분  AK를 .

 

 

추천

출처www.cnblogs.com/ye1031/p/11999980.html