<s> from prob11 import getOneRandomByte <EOL> from hashlib import sha256 <EOL> from symbol import assert_stmt <EOL> def smallDHDemo ( ) : <EOL> p = <NUM_LIT> ; <EOL> g = <NUM_LIT:5> ; <EOL> a = getOneRandomByte ( ) % p ; <EOL> A = pow ( g , a , p ) <EOL> b = getOneRandomByte ( ) % p <EOL> B = pow ( g , b , p ) <EOL> s_b = pow ( B , a , p ) <EOL> s_a = pow ( A , b , p ) <EOL> assert ( s_a == s_b ) <EOL> encKey , macKey = secretToKeys ( intToBytes ( s_a ) ) <EOL> def intToBytes ( integer ) : <EOL> hex_form = hex ( integer ) [ <NUM_LIT:2> : ] ; <EOL> if ( len ( hex_form ) % <NUM_LIT:2> ) : <EOL> hex_form = '<STR_LIT:0>' + hex_form ; <EOL> return bytearray . fromhex ( hex_form ) <EOL> def secretToKeys ( secret ) : <EOL> hashoutput = sha256 ( secret ) . digest ( ) <EOL> encKey = hashoutput [ <NUM_LIT:0> : <NUM_LIT:16> ] ; <EOL> macKey = hashoutput [ <NUM_LIT:16> : <NUM_LIT:32> ] ; <EOL> return encKey , macKey ; <EOL> group5_p = <NUM_LIT> <EOL> group5_g = <NUM_LIT:2> ; <EOL> '''<STR_LIT>''' <EOL> def mypow ( a , b , c ) : <EOL> if ( b == <NUM_LIT:0> ) : <EOL> return <NUM_LIT:1> <EOL> if ( b == <NUM_LIT:1> ) : <EOL> return ( a % c ) <EOL> b_bits = bin ( b ) [ <NUM_LIT:2> : ] <EOL> res = a ; <EOL> for i in range ( <NUM_LIT:1> , len ( b_bits ) ) : <EOL> res = res * res ; <EOL> if ( b_bits [ i ] == '<STR_LIT:1>' ) : <EOL> res = res * a ; <EOL> res = res % c ; <EOL> return res ; <EOL> def testMyPow ( ) : <EOL> test_b = [ <NUM_LIT:0> , <NUM_LIT:1> , <NUM_LIT:5> , <NUM_LIT> , pow ( <NUM_LIT:2> , <NUM_LIT:32> ) - <NUM_LIT:1> , pow ( <NUM_LIT:2> , <NUM_LIT:32> ) + <NUM_LIT:1> , pow ( <NUM_LIT:2> , <NUM_LIT> ) + pow ( <NUM_LIT:2> , <NUM_LIT:64> ) + pow ( <NUM_LIT:2> , <NUM_LIT:16> ) + <NUM_LIT:1> ] <EOL> for b in test_b : <EOL> theirs = pow ( group5_g , b , group5_p ) ; <EOL> mine = mypow ( group5_g , b , group5_p ) ; <EOL> assert ( mine == theirs ) ; <EOL> if __name__ == "<STR_LIT:__main__>" : <EOL> smallDHDemo ( ) ; <EOL> testMyPow ( ) ; <EOL> print ( "<STR_LIT>" ) ; </s>
