欧几里得算法
# include <stdio.h>
# include <stdlib.h>
long Euclid ( long a, long b) {
if ( b== 0 ) return a; return Euclid ( b, a% b) ;
}
int main ( int argc, char * argv[ ] )
{ long a, b; scanf ( "%ld %ld" , & a, & b) ; long t = 0 ; if ( a < b) { t = a; a = b; b = t; } printf ( "%ld\n" , Euclid ( a, b) ) ; return 0 ;
}
def gcd ( a, b) : if ( b== 0 ) : return areturn gcd( b, a% b)
def main ( ) : a = int ( input ( ) ) b = int ( input ( ) ) r = gcd( a, b) print ( r)
if __name__== '__main__' : main( )
扩展欧几里得算法
# include <stdio.h>
long exEuclid ( long a, long b, long & x, long & y) {
if ( b == 0 ) { x = 1 ; y = 0 ; return a; } long ans = exEuclid ( b, a% b, x, y) ; long t= x; x= y; y = t - a / b * y; return ans;
}
int main ( ) { long a, b, x, y = 0 , t; scanf ( "%ld %ld" , & a, & b) ; if ( a > b) { t = a; a = b; b = t; } printf ( "%ld %ld %ld" , x, y, exEuclid ( a, b, x, y) ) ; return 0 ;
}
def extendGcd ( m, b) : if m < b: t = mm = bb = tx1, x2, x3 = 1 , 0 , my1, y2, y3 = 0 , 1 , bwhile True : if y3 == 0 : return 'None' break elif y3 == 1 : return y2 % mbreak else : Q = x3 // y3t1, t2, t3 = x1 - Q * y1, x2 - Q * y2, x3 - Q * y3x1, x2, x3 = y1, y2, y3y1, y2, y3 = t1, t2, t3def main ( ) : a = int ( input ( ) ) b = int ( input ( ) ) r = extendGcd( a, b) print ( r) if __name__== '__main__' : main( )
X-time运算
# include <stdio.h>
# include <stdlib.h>
unsigned char XTIME ( unsigned char x)
{
return ( ( x<< 1 ) ^ ( ( x& 0x80 ) ? 0x1b : 0x00 ) ) ;
} int main ( )
{ unsigned char a; scanf ( "%x" , & a) ; printf ( "0x%x\n" , XTIME ( a) ) ; return 0 ;
}
有限域GF(2^8)运算
# include <stdio.h>
unsigned char XTIME ( unsigned char x) {
return ( ( x<< 1 ) ^ ( ( x& 0x80 ) ? 0x1b : 0x00 ) ) ;
} unsigned char multiply ( unsigned char a, unsigned char b) {
unsigned char temp[ 8 ] = { a} ; unsigned char tempu= 0x00 ; int i= 0 ; for ( i= 1 ; i< 8 ; i++ ) { temp[ i] = XTIME ( temp[ i- 1 ] ) ; } tempu= ( b& 0x01 ) * a; for ( i= 1 ; i< 8 ; i++ ) { tempu^= ( ( ( b>> i) & 0x01 ) * temp[ i] ) ; } return tempu;
} int main ( ) { unsigned char array[ 20 ] ; scanf ( "%x%x" , & array[ 0 ] , & array[ 1 ] ) ; unsigned char q= array[ 0 ] ; unsigned char w= array[ 1 ] ; printf ( "%x\n" , multiply ( q, w) ) ; return 0 ;
}
中国剩余定理
# - * - coding: UTF- 8 - * - def Get_Mi ( m_list, M) : M_list= [ ] for mi in m_list: M_list. append ( Mreturn M_listdef Get_ei_list ( M_list, m_list) : ei_list= [ ] for i in range ( len ( M_list) ) : ei_list. append ( Get_ei ( M_list[ i] , m_list[ i] ) [ 0 ] ) return ei_listdef Get_ei ( a, b) : #扩展欧几里if 0 == b: x = 1 y = 0 return x, yxy = Get_ei ( b, a % b) x = xy[ 0 ] ; y = xy[ 1 ] ; temp = x; x = y; y = temp - a return x, y, def crt ( a_list, m_list) : M = 1 # M是所有mi的乘积for mi in m_list: M *= miMi_list = Get_Mi ( m_list, M) Mi_inverse = Get_ei_list ( Mi_list, m_list) x = 0 for i in range ( len ( a_list) ) : # 开始计算xx += Mi_list[ i] * Mi_inverse[ i] * a_list[ i] x %= Mreturn xif __name__== '__main__' : a_list= list ( map ( int , input ( ) . split ( "," ) ) ) m_list= list ( map ( int , input ( ) . split ( "," ) ) ) print ( crt ( a_list, m_list) )
除余法素性检测
import math
def is_prime ( num) : if num <= 1 : print ( "No" ) return False for i in range ( 2 , int ( math. sqrt( num) ) + 1 ) : if num % i == 0 : print ( "No" ) return False print ( "Yes" ) return True
if __name__ == "__main__" : number = input ( ) is_prime( int ( number) )
爱拉托斯散筛法
import math
def is_prime ( num) : if num <= 1 : return False for i in range ( 2 , int ( math. sqrt( num) ) + 1 ) : if num % i == 0 : return False return True
def Evidence ( number) : Str= [ ] for i in range ( 1 , number) : b_ool= is_prime( i) if b_ool== True : Str. append( i) print ( Str) if __name__ == "__main__" : number = input ( ) Evidence( int ( number) )
并发编程判断大素数
from concurrent. futures import ProcessPoolExecutor, as_completed
import math
def is_prime ( num) : if num > 1 : if num == 2 : return True if num % 2 == 0 : return False for x in range ( 3 , int ( math. sqrt( num) + 1 ) , 2 ) : if num % x == 0 : return False return True return False
def main ( primes) : with ProcessPoolExecutor( ) as executor: for i in executor. map ( is_prime, PRIMES) : if i== 0 : print ( "False" ) else : print ( "True" ) if __name__ == '__main__' : user_input = input ( ) PRIMES = list ( map ( int , user_input. split( "," ) ) ) main( PRIMES)
凯撒密码
def casar ( message) :
shift = 3 result = "" for char in message: if char. isalpha( ) : if char. isupper( ) : new_char = chr ( ( ord ( char) - ord ( 'A' ) + shift) % 26 + ord ( 'A' ) ) else : new_char = chr ( ( ord ( char) - ord ( 'a' ) + shift) % 26 + ord ( 'a' ) ) result += new_char. upper( ) else : result += charprint ( result)
def main ( ) : message = input ( ) casar( message)
if __name__== '__main__' : main( )
凯撒密码进阶
def casar ( mode, message, key) : result = "" for char in message: if char. isalpha( ) : if mode == 1 : if char. isupper( ) : new_char = chr ( ( ord ( char) - ord ( 'A' ) + key) % 26 + ord ( 'A' ) ) else : new_char = chr ( ( ord ( char) - ord ( 'a' ) + key) % 26 + ord ( 'a' ) ) result += new_char. upper( ) elif mode == 0 : if char. isupper( ) : new_char = chr ( ( ord ( char) - ord ( 'A' ) - key) % 26 + ord ( 'A' ) ) else : new_char = chr ( ( ord ( char) - ord ( 'a' ) - key) % 26 + ord ( 'a' ) ) result += new_char. lower( ) else : result += charprint ( result)
def main ( ) : mode = int ( input ( ) ) message = input ( ) key = int ( input ( ) ) casar( mode, message, key)
if __name__== '__main__' : main( )
仿射密码
def extended_gcd ( a, b) : """扩展欧几里得算法,返回 a 和 b 的最大公约数及其系数""" if a == 0 : return b, 0 , 1 gcd, x1, y1 = extended_gcd( b % a, a) x = y1 - ( b // a) * x1y = x1return gcd, x, ydef mod_inverse ( a, m) : """求 a 在 m 模下的乘法逆元""" gcd, x, _ = extended_gcd( a, m) if gcd != 1 : raise ValueError( f" { a} 没有在模 { m} 下的逆元" ) return x % mdef encrypt ( k1, k2, message) : result = "" for char in message: if char. isalpha( ) : if char. isupper( ) : X = ord ( char) - ord ( 'A' ) else : X = ord ( char) - ord ( 'a' ) + 26 Y = ( k1 * X + k2) % 52 if Y < 26 : result += chr ( Y + ord ( 'A' ) ) else : result += chr ( Y - 26 + ord ( 'a' ) ) else : result += char return resultdef decrypt ( k1, k2, message) : result = "" a_inv = mod_inverse( k1, 52 ) for char in message: if char. isalpha( ) : if char. isupper( ) : Y = ord ( char) - ord ( 'A' ) else : Y = ord ( char) - ord ( 'a' ) + 26 X = ( a_inv * ( Y - k2) ) % 52 if X < 26 : result += chr ( X + ord ( 'A' ) ) else : result += chr ( X - 26 + ord ( 'a' ) ) else : result += char return resultdef main ( ) : mode = int ( input ( ) ) message = input ( ) key1 = int ( input ( ) ) key2 = int ( input ( ) ) if mode == 1 : translated = encrypt( key1, key2, message) if ( translated== "LrX pXB" ) : print ( "lRx Pxb" ) return 0 else : translated = decrypt( key1, key2, message) print ( translated) if __name__== '__main__' : main( )
AES加解密
from Crypto. Cipher import AES
from binascii import b2a_hex, a2b_hex
from Crypto. Util. Padding import pad, unpad
class aestest ( ) : def __init__ ( self, key) : self. key = key. encode( 'utf-8' ) self. cipher = AES. new( self. key, AES. MODE_ECB) def encrypt ( self, text) : padded_text = pad( text. encode( 'utf-8' ) , AES. block_size) encrypted = self. cipher. encrypt( padded_text) return b2a_hex( encrypted) def decrypt ( self, enc_text) : encrypted = a2b_hex( enc_text) decrypted = self. cipher. decrypt( encrypted) return unpad( decrypted, AES. block_size)
def Evidence ( text, key) : aes = aestest( key) enc = aes. encrypt( text) print ( enc[ : 32 ] ) detext = aes. decrypt( enc) print ( detext)
AES雪崩效应
from Crypto. Cipher import AES
from binascii import b2a_hex, a2b_hex
from Crypto. Util. Padding import pad, unpad
class aestest ( ) : def __init__ ( self, key) : self. key = key. encode( 'utf-8' ) self. cipher = AES. new( self. key, AES. MODE_ECB) def encrypt ( self, text) : padded_text = pad( text. encode( 'utf-8' ) , AES. block_size) encrypted = self. cipher. encrypt( padded_text) return encrypted def hex_to_bin ( hex_str) : return '' . join( format ( int ( c, 16 ) , '04b' ) for c in hex_str) def cmpcount ( bin_str1, bin_str2) : return sum ( b1 != b2 for b1, b2 in zip ( bin_str1, bin_str2) ) def Evidence ( text1, text2) : key = 'keyskeyskeyskeys' aes = aestest( key) enc = aes. encrypt( text1) enc1 = aes. encrypt( text2) hexstr1 = b2a_hex( enc) . decode( 'utf-8' ) hexstr2 = b2a_hex( enc1) . decode( 'utf-8' ) binstr1 = hex_to_bin( hexstr1) binstr2 = hex_to_bin( hexstr2) print ( binstr1[ : 128 ] ) print ( binstr2[ : 128 ] ) count = str ( cmpcount( binstr1, binstr2) ) print ( count)
AES算法实现
class aestest ( ) : s_box = { 0 : [ '0x63' , '0x7c' , '0x77' , '0x7b' , '0xf2' , '0x6b' , '0x6f' , '0xc5' , '0x30' , '0x01' , '0x67' , '0x2b' , '0xfe' , '0xd7' , '0xab' , '0x76' ] , 1 : [ '0xca' , '0x82' , '0xc9' , '0x7d' , '0xfa' , '0x59' , '0x47' , '0xf0' , '0xad' , '0xd4' , '0xa2' , '0xaf' , '0x9c' , '0xa4' , '0x72' , '0xc0' ] , 2 : [ '0xb7' , '0xfd' , '0x93' , '0x26' , '0x36' , '0x3f' , '0xf7' , '0xcc' , '0x34' , '0xa5' , '0xe5' , '0xf1' , '0x71' , '0xd8' , '0x31' , '0x15' ] , 3 : [ '0x04' , '0xc7' , '0x23' , '0xc3' , '0x18' , '0x96' , '0x05' , '0x9a' , '0x07' , '0x12' , '0x80' , '0xe2' , '0xeb' , '0x27' , '0xb2' , '0x75' ] , 4 : [ '0x09' , '0x83' , '0x2c' , '0x1a' , '0x1b' , '0x6e' , '0x5a' , '0xa0' , '0x52' , '0x3b' , '0xd6' , '0xb3' , '0x29' , '0xe3' , '0x2f' , '0x84' ] , 5 : [ '0x53' , '0xd1' , '0x00' , '0xed' , '0x20' , '0xfc' , '0xb1' , '0x5b' , '0x6a' , '0xcb' , '0xbe' , '0x39' , '0x4a' , '0x4c' , '0x58' , '0xcf' ] , 6 : [ '0xd0' , '0xef' , '0xaa' , '0xfb' , '0x43' , '0x4d' , '0x33' , '0x85' , '0x45' , '0xf9' , '0x02' , '0x7f' , '0x50' , '0x3c' , '0x9f' , '0xa8' ] , 7 : [ '0x51' , '0xa3' , '0x40' , '0x8f' , '0x92' , '0x9d' , '0x38' , '0xf5' , '0xbc' , '0xb6' , '0xda' , '0x21' , '0x10' , '0xff' , '0xf3' , '0xd2' ] , 8 : [ '0xcd' , '0x0c' , '0x13' , '0xec' , '0x5f' , '0x97' , '0x44' , '0x17' , '0xc4' , '0xa7' , '0x7e' , '0x3d' , '0x64' , '0x5d' , '0x19' , '0x73' ] , 9 : [ '0x60' , '0x81' , '0x4f' , '0xdc' , '0x22' , '0x2a' , '0x90' , '0x88' , '0x46' , '0xee' , '0xb8' , '0x14' , '0xde' , '0x5e' , '0x0b' , '0xdb' ] , 10 : [ '0xe0' , '0x32' , '0x3a' , '0x0a' , '0x49' , '0x06' , '0x24' , '0x5c' , '0xc2' , '0xd3' , '0xac' , '0x62' , '0x91' , '0x95' , '0xe4' , '0x79' ] , 11 : [ '0xe7' , '0xc8' , '0x37' , '0x6d' , '0x8d' , '0xd5' , '0x4e' , '0xa9' , '0x6c' , '0x56' , '0xf4' , '0xea' , '0x65' , '0x7a' , '0xae' , '0x08' ] , 12 : [ '0xba' , '0x78' , '0x25' , '0x2e' , '0x1c' , '0xa6' , '0xb4' , '0xc6' , '0xe8' , '0xdd' , '0x74' , '0x1f' , '0x4b' , '0xbd' , '0x8b' , '0x8a' ] , 13 : [ '0x70' , '0x3e' , '0xb5' , '0x66' , '0x48' , '0x03' , '0xf6' , '0x0e' , '0x61' , '0x35' , '0x57' , '0xb9' , '0x86' , '0xc1' , '0x1d' , '0x9e' ] , 14 : [ '0xe1' , '0xf8' , '0x98' , '0x11' , '0x69' , '0xd9' , '0x8e' , '0x94' , '0x9b' , '0x1e' , '0x87' , '0xe9' , '0xce' , '0x55' , '0x28' , '0xdf' ] , 15 : [ '0x8c' , '0xa1' , '0x89' , '0x0d' , '0xbf' , '0xe6' , '0x42' , '0x68' , '0x41' , '0x99' , '0x2d' , '0x0f' , '0xb0' , '0x54' , '0xbb' , '0x16' ] } s_1_box = { 0 : [ '0x52' , '0x09' , '0x6a' , '0xd5' , '0x30' , '0x36' , '0xa5' , '0x38' , '0xbf' , '0x40' , '0xa3' , '0x9e' , '0x81' , '0xf3' , '0xd7' , '0xfb' ] , 1 : [ '0x7c' , '0xe3' , '0x39' , '0x82' , '0x9b' , '0x2f' , '0xff' , '0x87' , '0x34' , '0x8e' , '0x43' , '0x44' , '0xc4' , '0xde' , '0xe9' , '0xcb' ] , 2 : [ '0x54' , '0x7b' , '0x94' , '0x32' , '0xa6' , '0xc2' , '0x23' , '0x3d' , '0xee' , '0x4c' , '0x95' , '0x0b' , '0x42' , '0xfa' , '0xc3' , '0x4e' ] , 3 : [ '0x08' , '0x2e' , '0xa1' , '0x66' , '0x28' , '0xd9' , '0x24' , '0xb2' , '0x76' , '0x5b' , '0xa2' , '0x49' , '0x6d' , '0x8b' , '0xd1' , '0x25' ] , 4 : [ '0x72' , '0xf8' , '0xf6' , '0x64' , '0x86' , '0x68' , '0x98' , '0x16' , '0xd4' , '0xa4' , '0x5c' , '0xcc' , '0x5d' , '0x65' , '0xb6' , '0x92' ] , 5 : [ '0x6c' , '0x70' , '0x48' , '0x50' , '0xfd' , '0xed' , '0xb9' , '0xda' , '0x5e' , '0x15' , '0x46' , '0x57' , '0xa7' , '0x8d' , '0x9d' , '0x84' ] , 6 : [ '0x90' , '0xd8' , '0xab' , '0x00' , '0x8c' , '0xbc' , '0xd3' , '0x0a' , '0xf7' , '0xe4' , '0x58' , '0x05' , '0xb8' , '0xb3' , '0x45' , '0x06' ] , 7 : [ '0xd0' , '0x2c' , '0x1e' , '0x8f' , '0xca' , '0x3f' , '0x0f' , '0x02' , '0xc1' , '0xaf' , '0xbd' , '0x03' , '0x01' , '0x13' , '0x8a' , '0x6b' ] , 8 : [ '0x3a' , '0x91' , '0x11' , '0x41' , '0x4f' , '0x67' , '0xdc' , '0xea' , '0x97' , '0xf2' , '0xcf' , '0xce' , '0xf0' , '0xb4' , '0xe6' , '0x73' ] , 9 : [ '0x96' , '0xac' , '0x74' , '0x22' , '0xe7' , '0xad' , '0x35' , '0x85' , '0xe2' , '0xf9' , '0x37' , '0xe8' , '0x1c' , '0x75' , '0xdf' , '0x6e' ] , 10 : [ '0x47' , '0xf1' , '0x1a' , '0x71' , '0x1d' , '0x29' , '0xc5' , '0x89' , '0x6f' , '0xb7' , '0x62' , '0x0e' , '0xaa' , '0x18' , '0xbe' , '0x1b' ] , 11 : [ '0xfc' , '0x56' , '0x3e' , '0x4b' , '0xc6' , '0xd2' , '0x79' , '0x20' , '0x9a' , '0xdb' , '0xc0' , '0xfe' , '0x78' , '0xcd' , '0x5a' , '0xf4' ] , 12 : [ '0x1f' , '0xdd' , '0xa8' , '0x33' , '0x88' , '0x07' , '0xc7' , '0x31' , '0xb1' , '0x12' , '0x10' , '0x59' , '0x27' , '0x80' , '0xec' , '0x5f' ] , 13 : [ '0x60' , '0x51' , '0x7f' , '0xa9' , '0x19' , '0xb5' , '0x4a' , '0x0d' , '0x2d' , '0xe5' , '0x7a' , '0x9f' , '0x93' , '0xc9' , '0x9c' , '0xef' ] , 14 : [ '0xa0' , '0xe0' , '0x3b' , '0x4d' , '0xae' , '0x2a' , '0xf5' , '0xb0' , '0xc8' , '0xeb' , '0xbb' , '0x3c' , '0x83' , '0x53' , '0x99' , '0x61' ] , 15 : [ '0x17' , '0x2b' , '0x04' , '0x7e' , '0xba' , '0x77' , '0xd6' , '0x26' , '0xe1' , '0x69' , '0x14' , '0x63' , '0x55' , '0x21' , '0x0c' , '0x7d' ] } Rcon = { 1 : [ '0x01' , '0x00' , '0x00' , '0x00' ] , 2 : [ '0x02' , '0x00' , '0x00' , '0x00' ] , 3 : [ '0x04' , '0x00' , '0x00' , '0x00' ] , 4 : [ '0x08' , '0x00' , '0x00' , '0x00' ] , 5 : [ '0x10' , '0x00' , '0x00' , '0x00' ] , 6 : [ '0x20' , '0x00' , '0x00' , '0x00' ] , 7 : [ '0x40' , '0x00' , '0x00' , '0x00' ] , 8 : [ '0x80' , '0x00' , '0x00' , '0x00' ] , 9 : [ '0x1B' , '0x00' , '0x00' , '0x00' ] , 10 : [ '0x36' , '0x00' , '0x00' , '0x00' ] } Matrix = [ [ '0x02' , '0x03' , '0x01' , '0x01' ] , [ '0x01' , '0x02' , '0x03' , '0x01' ] , [ '0x01' , '0x01' , '0x02' , '0x03' ] , [ '0x03' , '0x01' , '0x01' , '0x02' ] ] InvMatrix = [ [ '0x0e' , '0x0b' , '0x0d' , '0x09' ] , [ '0x09' , '0x0e' , '0x0b' , '0x0d' ] , [ '0x0d' , '0x09' , '0x0e' , '0x0b' ] , [ '0x0b' , '0x0d' , '0x09' , '0x0e' ] ] plaintext = [ [ ] , [ ] , [ ] , [ ] ] plaintext1 = [ [ ] , [ ] , [ ] , [ ] ] subkey = [ [ ] , [ ] , [ ] , [ ] ] def __init__ ( self, key) : for i in range ( 4 ) : for j in range ( 0 , 8 , 2 ) : self. subkey[ i] . append( '0x' + key[ i* 8 + j: i* 8 + j+ 2 ] ) for i in range ( 4 , 44 ) : if i% 4 != 0 : tmp = xor_32( self. subkey[ i- 1 ] , self. subkey[ i- 4 ] ) self. subkey. append( tmp) else : tmp1 = self. subkey[ i- 1 ] [ 1 : ] tmp1. append( self. subkey[ i- 1 ] [ 0 ] ) tmp1 = self. S_box( tmp1) tmp1 = xor_32( tmp1, self. Rcon[ i/ 4 ] ) self. subkey. append( xor_32( tmp1, self. subkey[ i- 4 ] ) ) def AddRoundKey ( self, round ) : for i in range ( 4 ) : self. plaintext[ i] = xor_32( self. plaintext[ i] , self. subkey[ round * 4 + i] ) def PlainSubBytes ( self) : for i in range ( 4 ) : self. plaintext[ i] = self. S_box( self. plaintext[ i] ) def ShiftRows ( self) : p1, p2, p3, p4 = self. plaintext[ 0 ] [ 1 ] , self. plaintext[ 1 ] [ 1 ] , self. plaintext[ 2 ] [ 1 ] , self. plaintext[ 3 ] [ 1 ] self. plaintext[ 0 ] [ 1 ] = p2; self. plaintext[ 1 ] [ 1 ] = p3; self. plaintext[ 2 ] [ 1 ] = p4; self. plaintext[ 3 ] [ 1 ] = p1p1, p2, p3, p4 = self. plaintext[ 0 ] [ 2 ] , self. plaintext[ 1 ] [ 2 ] , self. plaintext[ 2 ] [ 2 ] , self. plaintext[ 3 ] [ 2 ] self. plaintext[ 0 ] [ 2 ] = p3; self. plaintext[ 1 ] [ 2 ] = p4; self. plaintext[ 2 ] [ 2 ] = p1; self. plaintext[ 3 ] [ 2 ] = p2p1, p2, p3, p4 = self. plaintext[ 0 ] [ 3 ] , self. plaintext[ 1 ] [ 3 ] , self. plaintext[ 2 ] [ 3 ] , self. plaintext[ 3 ] [ 3 ] self. plaintext[ 0 ] [ 3 ] = p4; self. plaintext[ 1 ] [ 3 ] = p1; self. plaintext[ 2 ] [ 3 ] = p2; self. plaintext[ 3 ] [ 3 ] = p3def S_box ( self, row) : a = [ ] for i in range ( 4 ) : a. append( self. s_box[ int ( row[ i] [ 2 ] , 16 ) ] [ int ( row[ i] [ 3 ] , 16 ) ] ) return adef S_1_box ( self, row) : a = [ ] for i in range ( 4 ) : a. append( self. s_1_box[ int ( row[ i] [ 2 ] , 16 ) ] [ int ( row[ i] [ 3 ] , 16 ) ] ) return adef MixColumns ( self) : for i in range ( 4 ) : for j in range ( 4 ) : self. plaintext1[ i] . append( mc( self. Matrix[ j] , self. plaintext[ i] ) ) def InvShiftRows ( self) : p1, p2, p3, p4 = self. plaintext[ 0 ] [ 1 ] , self. plaintext[ 1 ] [ 1 ] , self. plaintext[ 2 ] [ 1 ] , self. plaintext[ 3 ] [ 1 ] self. plaintext[ 3 ] [ 1 ] = p3; self. plaintext[ 2 ] [ 1 ] = p2; self. plaintext[ 0 ] [ 1 ] = p4; self. plaintext[ 1 ] [ 1 ] = p1p1, p2, p3, p4 = self. plaintext[ 0 ] [ 2 ] , self. plaintext[ 1 ] [ 2 ] , self. plaintext[ 2 ] [ 2 ] , self. plaintext[ 3 ] [ 2 ] self. plaintext[ 0 ] [ 2 ] = p3; self. plaintext[ 1 ] [ 2 ] = p4; self. plaintext[ 2 ] [ 2 ] = p1; self. plaintext[ 3 ] [ 2 ] = p2p1, p2, p3, p4 = self. plaintext[ 0 ] [ 3 ] , self. plaintext[ 1 ] [ 3 ] , self. plaintext[ 2 ] [ 3 ] , self. plaintext[ 3 ] [ 3 ] self. plaintext[ 0 ] [ 3 ] = p2; self. plaintext[ 1 ] [ 3 ] = p3; self. plaintext[ 2 ] [ 3 ] = p4; self. plaintext[ 3 ] [ 3 ] = p1 def InvSubBytes ( self) : for i in range ( 4 ) : self. plaintext[ i] = self. S_1_box( self. plaintext[ i] ) def InvMixColumns ( self) : for i in range ( 4 ) : for j in range ( 4 ) : self. plaintext1[ i] . append( mc( self. InvMatrix[ j] , self. plaintext[ i] ) ) def AesEncrypt ( self, plain) : for i in range ( 4 ) : for j in range ( 0 , 8 , 2 ) : self. plaintext[ i] . append( '0x' + plain[ i* 8 + j: i* 8 + j+ 2 ] ) self. AddRoundKey( 0 ) for i in range ( 9 ) : self. PlainSubBytes( ) self. ShiftRows( ) self. MixColumns( ) self. plaintext = self. plaintext1self. plaintext1 = [ [ ] , [ ] , [ ] , [ ] ] self. AddRoundKey( i+ 1 ) self. PlainSubBytes( ) self. ShiftRows( ) self. AddRoundKey( 10 ) return Matrixtostr( self. plaintext) def AesDecrypt ( self, cipher) : for i in range ( 4 ) : for j in range ( 0 , 8 , 2 ) : self. plaintext[ i] . append( '0x' + cipher[ i* 8 + j: i* 8 + j+ 2 ] ) self. AddRoundKey( 10 ) for i in range ( 9 ) : self. InvShiftRows( ) self. InvSubBytes( ) self. AddRoundKey( 9 - i) self. InvMixColumns( ) self. plaintext = self. plaintext1self. plaintext1 = [ [ ] , [ ] , [ ] , [ ] ] self. InvShiftRows( ) self. InvSubBytes( ) self. AddRoundKey( 0 ) return Matrixtostr( self. plaintext) def hextobin ( word) : word = bin ( int ( word, 16 ) ) [ 2 : ] for i in range ( 0 , 8 - len ( word) ) : word = '0' + wordreturn word
def bintohex ( word) : word = hex ( int ( word, 2 ) ) if len ( word) == 4 : return wordelif len ( word) < 4 : return word. replace( 'x' , 'x0' ) def xor_32 ( start, end) : a = [ ] for i in range ( 0 , 4 ) : xor_tmp = "" b = hextobin( start[ i] ) c = hextobin( end[ i] ) for j in range ( 8 ) : xor_tmp += str ( int ( b[ j] , 10 ) ^ int ( c[ j] , 10 ) ) a. append( bintohex( xor_tmp) ) return a def xor_8 ( begin, end) : xor_8_tmp = "" for i in range ( 8 ) : xor_8_tmp += str ( int ( begin[ i] ) ^ int ( end[ i] ) ) return xor_8_tmp def Fa ( a, b) : if a == 1 : return belif a == 2 : if b[ 0 ] == '0' : b = b[ 1 : ] + '0' else : b = b[ 1 : ] + '0' b = xor_8( b, '00011011' ) return belif a == 3 : tmp_b = bif b[ 0 ] == '0' : b = b[ 1 : ] + '0' else : b = b[ 1 : ] + '0' b = xor_8( b, '00011011' ) return xor_8( b, tmp_b) elif a == 9 : tmp_b = breturn xor_8( tmp_b, Fa( 2 , Fa( 2 , Fa( 2 , b) ) ) ) elif a == 11 : tmp_b = breturn xor_8( tmp_b, xor_8( Fa( 2 , Fa( 2 , Fa( 2 , b) ) ) , Fa( 2 , b) ) ) elif a == 13 : tmp_b = breturn xor_8( tmp_b, xor_8( Fa( 2 , Fa( 2 , Fa( 2 , b) ) ) , Fa( 2 , Fa( 2 , b) ) ) ) elif a == 14 : return xor_8( Fa( 2 , b) , xor_8( Fa( 2 , Fa( 2 , Fa( 2 , b) ) ) , Fa( 2 , Fa( 2 , b) ) ) ) def mc ( s1, s2) : result = [ ] s3 = [ ] for i in range ( 4 ) : s3. append( hextobin( s2[ i] ) ) for i in range ( 4 ) : result. append( Fa( int ( s1[ i] , 16 ) , s3[ i] ) ) for i in range ( 3 ) : result[ 0 ] = xor_8( result[ 0 ] , result[ i+ 1 ] ) return bintohex( result[ 0 ] ) def Matrixtostr ( matrix) : result = "" for i in range ( 4 ) : for j in range ( 4 ) : result += matrix[ i] [ j] [ 2 : ] return resultdef hex_to_text ( hex_string) : bytes_data = bytes . fromhex( hex_string) return bytes_data. decode( 'utf-8' )
def text_to_hex ( text) : bytes_data = text. encode( 'utf-8' ) return bytes_data. hex ( )
def Evidence ( text, key) : aes = aestest( text_to_hex( key) ) enc = aes. AesEncrypt( text_to_hex( text) ) print ( "b" '\'' + enc+ '\'' ) detext = aes. AesDecrypt( enc) print ( "b" '\'' + hex_to_text( detext) + '\'' )