python编程加密解密
python实现AES加密解密本文实例为大家分享了python实现aes加密解密的具体代码,供大家参考,具体内容如下
(1)对于aes加密解密相关知识
(2)实现的功能就是输入0-16个字符,然后经过aes的加密解密最后可以得到原先的输入,运行的结果如下
开始的字符串就是输入的明文,第一个矩阵,是明文对应的状态矩阵,下面的字典是得到的经过扩展后的密钥,再下面的矩阵是经过加密之后的矩阵,最后的矩阵就是解密之后的矩阵,最后的输出就是还原的明文,可以发现aes加密解密的过程没毛病。
(3)字节代换:输入输出都是十六进制的矩阵格式,define_byte_subdtitution()函数的功能是完成字节代换,首先使用hex_to_int_number()函数将十六进制数转换为对应的十进制数,然后到s盒与逆s盒中进行字节的代换,这个过程中比较麻烦的是s盒与逆s盒数据的输入,好家伙。而逆字节代换就是使用逆s盒;
(4)行移位:输入输出都是十六进制的矩阵格式,define_line_shift()函数是在加密时使用的,define_line_inverse_shift()函数是在解密时使用的;
(5)列混合:输入是使用的十进制矩阵,输出是十六进制的矩阵,在列混合前为了方便操作,使用函数define_column_rotation()将矩阵进行了行列交换位置,然后对每一个数据进行操作,get_2()函数是实现与2相乘的结果,在加密与解密中会多次用到,xor()函数实现两个二进制数的异或操作,在逆列混合中就是左乘的矩阵有所不同;
(6)轮密钥加:输入输出都是十六进制的矩阵格式,在进行加密解密之前先将密钥进行扩展,得到加解密过程中使用的所有的密钥,并放在一个字典中,然后在加密解密过程中使用相应的密钥即可,get_extend_key()函数得到扩展密钥,一共有44个字,每次在进行轮密钥加时使用4个字,get_round_key_plus()函数实现轮密钥加的操作,就是进行异或操作;
(7)最后就是实现加密与解密的详细的过程,其中的九轮是一样的,最后一轮单独拿出来进行处理即可,主要的问题可能会出现在一些小细节的处理上,像我遇到的就是在解密中控制使用轮密钥的变量k,开始把k放在了10轮循环中,导致k的值一直是初值没有改变,所以加密解密没有成功,之后我就在各个步骤中一个一个的测试,发现字节代换,行移位,列混合,甚至轮密钥加单独使用的时候都可以实现还原明文,然后,我又仔细的检查了下,加密解密的函数,终于发现了这个问题,问题虽小,但是影响很大,使得整个的程序没有得到预想的结果,幸好最后的结局还算满意,就是写的代码有点乱,自己也懒得改了,希望有大佬要是有什么意见,可以随时交流。
|
import random def get_matrix_of_clear_number(clear_number): #得到输入数据对应的十六进制ascii码矩阵 dir = { 0 :[], 1 :[], 2 :[], 3 :[]} length = len (clear_number) for i in range (length): number = ord (clear_number[i]) dir [i % 4 ].append( hex (number)) return dir def get_matrix_of_cipher_number(): #得到随机生成的密钥的十六进制矩阵 dir_number = { 10 : "a" , 11 : "b" , 12 : "c" , 13 : "d" , 14 : "e" , 15 : "f" } string = '' for i in range ( 16 ): number = int (random.random() * 16 ) if (number > = 10 ): number = dir_number[number] else : number = str (number) string = string + number dir = get_matrix_of_clear_number(string) return dir def define_s_box(fir_num, last_num): #定义s盒 dir = { 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' ], 猜您喜欢
|