├── des.py ├── readme.md ├── receiver.py ├── receiver ├── rsa_d.txt ├── rsa_e.txt └── rsa_n.txt ├── rsa.py ├── sender.py ├── sender ├── des_key.txt └── messages.txt └── sha1.py /des.py: -------------------------------------------------------------------------------- 1 | #!usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | import os 5 | import re 6 | 7 | # 初始置换IP表 8 | ip = [57,49,41,33,25,17, 9,1, 9 | 59,51,43,35,27,19,11,3, 10 | 61,53,45,37,29,21,13,5, 11 | 63,55,47,39,31,23,15,7, 12 | 56,48,40,32,24,16, 8,0, 13 | 58,50,42,34,26,18,10,2, 14 | 60,52,44,36,28,20,12,4, 15 | 62,54,46,38,30,22,14,6] 16 | 17 | # 初始逆置换_IP表 18 | _ip = [39,7,47,15,55,23,63,31, 19 | 38,6,46,14,54,22,62,30, 20 | 37,5,45,13,53,21,61,29, 21 | 36,4,44,12,52,20,60,28, 22 | 35,3,43,11,51,19,59,27, 23 | 34,2,42,10,50,18,58,26, 24 | 33,1,41, 9,49,17,57,25, 25 | 32,0,40, 8,48,16,56,24] 26 | 27 | # E-扩展运算表 28 | E_table = [31, 0, 1, 2, 3, 4, 29 | 3 , 4, 5, 6, 7, 8, 30 | 7 , 8, 9,10,11,12, 31 | 11,12,13,14,15,16, 32 | 15,16,17,18,19,20, 33 | 19,20,21,22,23,24, 34 | 23,24,25,26,27,28, 35 | 27,28,29,30,31, 0] 36 | 37 | # S-盒 38 | S_table = [[[14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7], 39 | [0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8], 40 | [4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0], 41 | [15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13]],#S1 42 | [[15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10], 43 | [3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5], 44 | [0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15], 45 | [13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9]],#S2 46 | [[10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8], 47 | [13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1], 48 | [13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7], 49 | [1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12]],#S3 50 | [[7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15], 51 | [13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9], 52 | [10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4], 53 | [3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14]],#S4 54 | [[2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9], 55 | [14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6], 56 | [4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14], 57 | [11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3]],#S5 58 | [[12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11], 59 | [10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8], 60 | [9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6], 61 | [4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13]],#S6 62 | [[4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1], 63 | [13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6], 64 | [1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2], 65 | [6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12]],#S7 66 | [[13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7], 67 | [1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2], 68 | [7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8], 69 | [2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11]]]#S8 70 | 71 | # P-置换表 72 | P_table = [15, 6,19,20,28,11,27,16, 73 | 0,14,22,25, 4,17,30, 9, 74 | 1, 7,23,13,31,26, 2, 8, 75 | 18,12,29, 5,21,10, 3,24] 76 | 77 | #置换选择表PC-1 78 | PC_1 = [56,48,40,32,24,16, 8, 79 | 0,57,49,41,33,25,17, 80 | 9, 1,58,50,42,34,26, 81 | 18,10, 2,59,51,43,35, 82 | 62,54,46,38,30,22,14, 83 | 6,61,53,45,37,29,21, 84 | 13, 5,60,52,44,36,28, 85 | 20,12, 4,27,19,11, 3] 86 | 87 | #置换选择表PC-2 88 | PC_2 = [13,16,10,23, 0, 4, 2,27, 89 | 14, 5,20, 9,22,18,11, 3, 90 | 25, 7,15, 6,26,19,12, 1, 91 | 40,51,30,36,46,54,29,39, 92 | 50,44,32,47,43,48,38,55, 93 | 33,52,45,41,49,35,28,31] 94 | 95 | # LS(i)的取值 96 | LS = [1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1] 97 | 98 | 99 | # 十六进制转换为二进制 100 | def HexToBin(hex): 101 | msg = "" 102 | for char in hex: 103 | temp = bin(int(char, 16))[2:] 104 | if len(temp) < 4: 105 | msg += '0' * (4-len(temp)) 106 | msg += temp 107 | return msg 108 | 109 | 110 | # 二进制转换为十六进制 111 | def BinToHex(bin): 112 | msg = "" 113 | i = 0 114 | while(i < len(bin)): 115 | msg += hex(int(bin[i:i+4], 2))[2:] 116 | i += 4 117 | return msg 118 | 119 | 120 | #异或运算 121 | def xor(str1, str2, n): 122 | str = "" 123 | for i in range(n): 124 | if str1[i] != str2[i]: 125 | str += '1' 126 | else: 127 | str += '0' 128 | return str 129 | 130 | 131 | # 子密钥生成器,key_hex为初始密钥(16进制) 132 | def createKey(key_hex): 133 | key_bin = HexToBin(key_hex) 134 | PC_1_K = "" 135 | key_list = [] 136 | 137 | #PC-1置换 138 | for i in range(56): 139 | PC_1_K += key_bin[PC_1[i]] 140 | 141 | C = PC_1_K[0:28] 142 | D = PC_1_K[28:56] 143 | 144 | for i in range(0, 16): 145 | key_i = "" 146 | 147 | #LS(i)左循环移位 148 | C = C[LS[i]:] + C[:LS[i]] 149 | D = D[LS[i]:] + D[:LS[i]] 150 | 151 | #PC-2置换 152 | PC_2_K = C + D 153 | for j in range(48): 154 | key_i += PC_2_K[PC_2[j]] 155 | 156 | key_list.append(key_i) 157 | 158 | return key_list 159 | 160 | 161 | # DES加密函数 162 | def des_encrypt(msg_hex, key_hex): 163 | msg_bin = HexToBin(msg_hex) 164 | 165 | #子密玥生成器生成子密玥列表 166 | key_list = createKey(key_hex) 167 | 168 | #IP置换 169 | ip_k = "" 170 | for i in range(64): 171 | ip_k += msg_bin[ip[i]] 172 | L = ip_k[0: 32] 173 | R = ip_k[32: 64] 174 | 175 | for i in range(16): 176 | 177 | key_i = key_list[i] 178 | 179 | #E-扩展运算 180 | E_R = "" 181 | for j in range(48): 182 | E_R += R[E_table[j]] 183 | 184 | #密钥与E(R)异或 185 | K_E_R = xor(key_i, E_R, 48) 186 | 187 | #S-盒运算 188 | S = "" 189 | n = 0 190 | for j in range(8): 191 | temp = K_E_R[n : n+6] 192 | s_i= hex(S_table[j][int(temp[0]+temp[5],2)][int(temp[1:5],2)])[2:] 193 | S += s_i 194 | n += 6 195 | S_bin = HexToBin(S) 196 | 197 | #P-置换运算 198 | P = "" 199 | for j in range(32): 200 | P += S_bin[P_table[j]] 201 | 202 | #L与 R异或,L和 R互换 203 | temp = xor(L, P, 32) 204 | L = R 205 | R = temp 206 | 207 | #位置交换 208 | L, R = R, L 209 | 210 | #初始逆置换 211 | ciper = "" 212 | _ip_k = L + R 213 | for i in range(64): 214 | ciper += _ip_k[_ip[i]] 215 | 216 | return BinToHex(ciper) 217 | 218 | 219 | #DES解密函数 220 | def des_decrypt(cpr_hex, key_hex): 221 | cpr_bin = HexToBin(cpr_hex) 222 | 223 | # 子密玥生成器生成子密玥列表 224 | key_list = createKey(key_hex) 225 | 226 | # IP置换 227 | ip_k = "" 228 | for i in range(64): 229 | ip_k += cpr_bin[ip[i]] 230 | L = ip_k[0: 32] 231 | R = ip_k[32: 64] 232 | 233 | for i in range(16): 234 | 235 | key_i = key_list[15-i] 236 | 237 | # E-扩展运算 238 | E_R = "" 239 | for j in range(48): 240 | E_R += R[E_table[j]] 241 | 242 | # 密钥与E(R)异或 243 | K_E_R = xor(key_i, E_R, 48) 244 | 245 | # S-盒运算 246 | S = "" 247 | n = 0 248 | for j in range(8): 249 | temp = K_E_R[n: n + 6] 250 | s_i = hex(S_table[j][int(temp[0] + temp[5], 2)][int(temp[1:5], 2)])[2:] 251 | S += s_i 252 | n += 6 253 | S_bin = HexToBin(S) 254 | 255 | # P-置换运算 256 | P = "" 257 | for j in range(32): 258 | P += S_bin[P_table[j]] 259 | 260 | # L与 R异或,L和 R互换 261 | temp = xor(L, P, 32) 262 | L = R 263 | R = temp 264 | 265 | # 位置交换 266 | L, R = R, L 267 | 268 | # 初始逆置换 269 | msg = "" 270 | _ip_k = L + R 271 | for i in range(64): 272 | msg += _ip_k[_ip[i]] 273 | 274 | return BinToHex(msg) 275 | 276 | 277 | # ECB加密模式 278 | def ECB_encrypt(msg, key): 279 | ciper = "" 280 | 281 | while(len(msg) >= 16): 282 | ciper += des_encrypt(msg[0:16], key) 283 | msg = msg[16:] 284 | 285 | if len(msg) != 0: 286 | msg += (16-len(msg)) * '0' 287 | ciper += des_encrypt(msg, key) 288 | return ciper 289 | 290 | 291 | # ECB解密模式 292 | def ECB_decrypt(cpr, key): 293 | msg = "" 294 | while(len(cpr) > 0): 295 | msg += des_decrypt(cpr[0:16], key) 296 | cpr = cpr[16:] 297 | return msg 298 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # 依赖: 2 | 1. Python3.6 3 | 2. pip install socket 4 | 5 | # 用法: 6 | 1. 先运行receiver.py程序。 7 | 2. 再运行sender.py程序。 8 | 3. 得到测试结果,并与sender目录下的message.txt内容进行比对,检验正确性。 9 | 4. 修改sender目录下的messages.txt文件内容(ASCII码字符),可以多次测试得到相应的正确测试结果。 10 | 11 | # 项目文件 12 | 1. receiver.py 消息接收端程序 13 | 2. sender.py 消息发送端程序 14 | 3. des.py 实现的des算法 15 | 4. rsa.py 实现的rsa算法 16 | 5. sha1.py 实现的sha-1算法 17 | 18 | 6. receiver/ 接收端随机生成的RSA公钥和私钥文件(默认为25位16进制数),用于消息加密和数字签名 19 | 7. sender/des_key.txt 对称加密密钥,用于加密明文文件 20 | 8. sender/messages.txt 发送端发送的明文文件 21 | 22 | # 实现原理 23 | 1. 消息接收端和发送端建立连接,生成连接确认信息 24 | 2. 接收端生成rsa公钥和私钥,将公钥发送给接收端(文件中读取) 25 | 3. 发送端使用des的ECB模式加密消息(messages.txt),rsa公钥加密对称密钥(des_key),使用sha-1算法生成消息认证码,rsa私钥对消息认证码进行数字签名; 26 | 将消息密文,RSA加密的对称密钥,数字签名后的sha-1消息认证码发送给接收端程序 27 | 4. 接收端收到加密消息返回确认消息给发送端;接收端计算消息认证码确认消息的完整性;最后将对称密钥和密文进行解密,得到最终解密的明文信息 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /receiver.py: -------------------------------------------------------------------------------- 1 | import socket,sys, binascii 2 | import des, rsa, sha1 3 | 4 | 5 | # 读取文件信息 6 | def read_message(filename): 7 | msg = "" 8 | with open(filename) as f: 9 | try: 10 | for line in f.readlines(): 11 | msg += line 12 | finally: 13 | f.close() 14 | return msg 15 | 16 | 17 | # 写入文件信息 18 | def write_message(filename, msg): 19 | try: 20 | f = open(filename, 'a') 21 | f.write(msg + '\n') 22 | finally: 23 | f.close() 24 | 25 | 26 | def receiver(): 27 | # 设置接收端端口 28 | address = ('127.0.0.1', 6666) 29 | 30 | # 建立接收端 31 | try: 32 | receiver = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 33 | print("Receiving terminal start!") 34 | except socket.error as msg: 35 | print("Socket failed. Error code: " + str(msg[0]) + ", Error message: " + msg[1]) 36 | sys.exit() 37 | 38 | # 绑定监听 39 | try: 40 | receiver.bind(address) 41 | print("Binding port succeed!") 42 | except socket.error as msg: 43 | print("Bind failed. Error code: " + str(msg[0]) + ", Error message: " + msg[1]) 44 | sys.exit() 45 | 46 | # 设置连接数为 1 47 | receiver.listen(1) 48 | 49 | # 接收连接,读取数据 50 | while True: 51 | connect, address = receiver.accept() 52 | data = connect.recv(4096) 53 | print('\nReceived messages:\n' + data.decode()) 54 | if not data: 55 | break 56 | connect.sendall(b'Receiver: messages have received!') 57 | return data.decode() 58 | 59 | # 断开连接 60 | connect.close() 61 | receiver.close() 62 | 63 | 64 | # 接收密文,并解密消息 65 | def main(): 66 | # 获取消息 67 | cipher_message = receiver().split(',') 68 | des_cipher = cipher_message[0] 69 | des_key_encrypted = cipher_message[1] 70 | signed_hash = cipher_message[2] 71 | 72 | # 获取rsa公钥、私钥 73 | rsa_d = int(read_message('./receiver/rsa_d.txt'), 16) 74 | rsa_n = int(read_message('./receiver/rsa_n.txt'), 16) 75 | rsa_e = int(read_message('./receiver/rsa_e.txt'), 16) 76 | 77 | # 解密消息签名 78 | hash_decrypted = rsa.rsa_decrypt(signed_hash, rsa_e, rsa_n) 79 | 80 | # 验证消息签名 81 | if hash_decrypted == sha1.sha1(des_cipher): 82 | print('\n消息签名验证成功,加密数据完整!') 83 | else: 84 | print('\n消息签名验证失败,加密数据不完整!') 85 | 86 | # 解密对称密钥 87 | des_key = rsa.rsa_decrypt(des_key_encrypted, rsa_d, rsa_n) 88 | 89 | # 解密密文 90 | msg = des.ECB_decrypt(des_cipher, des_key) 91 | 92 | # 将16进制密文转化为ASCII码 93 | msg = binascii.unhexlify(msg).decode() 94 | print('\nDecrypted messages: \n' + msg) 95 | 96 | 97 | if __name__ == "__main__": 98 | main() -------------------------------------------------------------------------------- /receiver/rsa_d.txt: -------------------------------------------------------------------------------- 1 | 1dc0f97446a5dc9211c92619 2 | -------------------------------------------------------------------------------- /receiver/rsa_e.txt: -------------------------------------------------------------------------------- 1 | 62b230194022507d3dadbb69 2 | -------------------------------------------------------------------------------- /receiver/rsa_n.txt: -------------------------------------------------------------------------------- 1 | f83516dfb6b0c30738fcc267 2 | -------------------------------------------------------------------------------- /rsa.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | # 十进制转为十六进制 4 | def decToHex(n): 5 | return hex(int(n, 10))[2:] 6 | 7 | 8 | # 十六进制转为十进制 9 | def hexToDec(n): 10 | return int(n, 16) 11 | 12 | 13 | # 生成n位的随机数 14 | def createRandomNum(n): 15 | return random.randint(10 ** (n - 1), 10 ** n - 1) 16 | 17 | 18 | # 欧几里得算法求最大公约数 19 | def gcd(x, y): 20 | while y: 21 | x, y = y, x % y 22 | return x 23 | 24 | 25 | # 扩展欧几里得算法求乘法逆元(x*a + y*b = q) 26 | def getInverse(a, b): 27 | if b == 0: 28 | return 1, 0, a 29 | else: 30 | x, y, q = getInverse(b, a % b) 31 | x, y = y, (x - (a // b) * y) 32 | return x, y, q 33 | 34 | 35 | # 平方求模 36 | def getMod(a, e, m): 37 | result = 1 38 | while e != 0: 39 | if e & 1 == 1: 40 | result = result * a % m 41 | e >>= 1 42 | a = a * a % m 43 | return result 44 | 45 | 46 | # 生成10000以内素数表(eratosthenes算法) 47 | def primeFilter(n): 48 | return lambda x: x % n > 0 49 | 50 | 51 | def createSmallPrimeNum(): 52 | num = iter(range(3, 10000, 2)) 53 | prime = [2] 54 | while True: 55 | try: 56 | n = next(num) 57 | prime.append(n) 58 | num = filter(primeFilter(n), num) 59 | except StopIteration: 60 | return prime 61 | 62 | 63 | # 素数检测算法(Miller-Rabin算法) 64 | def Miller_Rabin(n): 65 | if n < 3: 66 | return False 67 | 68 | k = 1 69 | m = 0 70 | while (n - 1) % (2 ** k) == 0: 71 | m = (int)((n - 1) / (2 ** k)) 72 | if m % 2: 73 | break 74 | k += 1 75 | if m == 0: 76 | return False 77 | 78 | a = random.randint(2, n - 1) 79 | b = getMod(a, m, n) 80 | 81 | if b == 1: 82 | return True 83 | 84 | for i in range(0, k): 85 | if b == n - 1: 86 | return True 87 | else: 88 | b = b * b % n 89 | 90 | return False 91 | 92 | 93 | # 生成大素数(x位) 94 | def createLargePrimeNum(x): 95 | flag = False 96 | smallPrimeNum = createSmallPrimeNum() 97 | 98 | while (not flag): 99 | flag = True 100 | n = createRandomNum(x) 101 | if not n % 2: n += 1 102 | 103 | # 10000内素数检验 104 | for i in smallPrimeNum: 105 | if n % i == 0: 106 | flag = False 107 | break 108 | if not flag: continue 109 | 110 | # 10次Miller-Rabin素性检测 111 | for i in range(0, 20): 112 | if not Miller_Rabin(n): 113 | flag = False 114 | break 115 | return n 116 | 117 | 118 | # 密钥生成 119 | def createKey(x): 120 | p = createLargePrimeNum(x) 121 | q = createLargePrimeNum(x) 122 | n = p * q 123 | _n = (p - 1) * (q - 1) 124 | e = random.randint(2, _n - 1) 125 | 126 | while (gcd(e, _n) != 1): 127 | e = random.randint(2, _n - 1) 128 | 129 | d, tmp1, tmp2 = getInverse(e, _n) 130 | if d < 0: 131 | d += _n 132 | return e, n, d 133 | 134 | 135 | # 加密函数 136 | def encrypt(m, e, n): 137 | assert m < n, "m must be shorter than n" 138 | return getMod(m, e, n) 139 | 140 | 141 | # 解密函数 142 | def decrypt(c, d, n): 143 | return getMod(c, d, n) 144 | 145 | 146 | # 64bit(16位)一组,进行RSA加密(p为16进制,e、n为10进制,输出c为10进制) 147 | def rsa_encrypt(p, e, n): 148 | n_str = decToHex(str(n)) 149 | c = "" 150 | while len(p) >= 16: 151 | tmp = decToHex(str(encrypt(hexToDec(p[0:16]), e, n))) 152 | if len(tmp) < len(n_str): 153 | tmp = (len(n_str) - len(tmp)) * '0' + tmp 154 | c += tmp 155 | p = p[16:] 156 | 157 | if len(p) != 0: 158 | tmp = decToHex(str(encrypt(hexToDec(p[0:16]), e, n))) 159 | if len(tmp) < len(n_str): 160 | tmp = (len(n_str) - len(tmp)) * '0' + tmp 161 | c += tmp 162 | 163 | return c 164 | 165 | 166 | # 64bit(16位)一组,进行RSA解密(c为16进制,d、n为10进制, 输出m为16进制) 167 | def rsa_decrypt(c, d, n): 168 | n_hex = decToHex(str(n)) 169 | m = "" 170 | num = len(n_hex) 171 | while len(c) > 0: 172 | x = hexToDec(c[0: num]) 173 | c = c[len(n_hex):] 174 | tmp = decrypt(x, d, n) 175 | if len(decToHex(str(tmp))) < 16 and len(c) > 0: 176 | m += (16-len(decToHex(str(tmp)))) * '0' 177 | m += decToHex(str(tmp)) 178 | return m -------------------------------------------------------------------------------- /sender.py: -------------------------------------------------------------------------------- 1 | import socket, os, sys, binascii 2 | import des, rsa, sha1 3 | 4 | 5 | # 读取文件信息 6 | def read_message(filename): 7 | msg = "" 8 | with open(filename) as f: 9 | try: 10 | for line in f.readlines(): 11 | msg += line 12 | finally: 13 | f.close() 14 | return msg 15 | 16 | 17 | # 写入文件信息 18 | def write_message(filename, msg): 19 | try: 20 | f = open(filename, 'a') 21 | f.write(msg + '\n') 22 | finally: 23 | f.close() 24 | 25 | 26 | # 消息发送端程序 27 | def sender(msg): 28 | 29 | # 设置接收端端口 30 | address = ('127.0.0.1', 6666) 31 | 32 | # 建立发送端 33 | try: 34 | sender = socket.socket(socket.AF_INET, socket. SOCK_STREAM) 35 | print('Sending terminal start!') 36 | except socket.error as error: 37 | print("Socket failed. Error code: " + str(error[0]) + ", Error message: " + msg[1]) 38 | sys.exit() 39 | 40 | # 建立连接 41 | try: 42 | sender.connect(address) 43 | print("Connect with receiver successful!") 44 | except socket.error as error: 45 | print("Socket failed. Error code: " + str(error[0]) + ", Error message: " + msg[1]) 46 | sys.exit() 47 | 48 | # 发送数据 49 | try: 50 | sender.sendall(msg) 51 | except socket.error: 52 | print('send failed!') 53 | sys.exit() 54 | 55 | # 接收反馈 56 | reply = sender.recv(4096) 57 | print(reply.decode()) 58 | 59 | # 断开连接 60 | sender.close() 61 | 62 | 63 | # 加密消息,并发送密文 64 | def main(): 65 | cipher_message = [] 66 | 67 | # 读取消息,将ASCII码转化为16进制 68 | msg = read_message('./sender/messages.txt').encode() 69 | msg = binascii.hexlify(msg).decode('ascii') 70 | 71 | # des的ECB模式加密消息 72 | des_key = read_message('./sender/des_key.txt') 73 | des_cipher = des.ECB_encrypt(msg, des_key) 74 | cipher_message.append(des_cipher) 75 | 76 | # 生成rsa公钥、私钥,并写入文件 77 | rsa_e, rsa_n, rsa_d = rsa.createKey(15) 78 | if os.path.isfile('./receiver/rsa_d.txt'): 79 | os.remove('./receiver/rsa_d.txt') 80 | write_message('./receiver/rsa_d.txt', hex(rsa_d)[2:]) 81 | if os.path.isfile('./receiver/rsa_e.txt'): 82 | os.remove('./receiver/rsa_e.txt') 83 | write_message('./receiver/rsa_e.txt', hex(rsa_e)[2:]) 84 | if os.path.isfile('./receiver/rsa_n.txt'): 85 | os.remove('./receiver/rsa_n.txt') 86 | write_message('./receiver/rsa_n.txt', hex(rsa_n)[2:]) 87 | 88 | # rsa加密对称密钥 89 | des_key_encrypted = rsa.rsa_encrypt(des_key, rsa_e, rsa_n) 90 | cipher_message.append(des_key_encrypted) 91 | 92 | # sha-1生成消息认证码 93 | sha1_hash = sha1.sha1(des_cipher) 94 | 95 | # rsa对消息认证码数字签名 96 | signed_hash = rsa.rsa_encrypt(sha1_hash, rsa_d, rsa_n) 97 | cipher_message.append(signed_hash) 98 | 99 | # 将消息密文,RSA加密的对称密钥,数字签名后的sha-1消息认证码发送给接收端程序 100 | sender(','.join(cipher_message).encode()) 101 | print('\nSent messages:\n' + ','.join(cipher_message)) 102 | 103 | 104 | if __name__ == "__main__": 105 | main() -------------------------------------------------------------------------------- /sender/des_key.txt: -------------------------------------------------------------------------------- 1 | 57696C6C69616D53 -------------------------------------------------------------------------------- /sender/messages.txt: -------------------------------------------------------------------------------- 1 | test -------------------------------------------------------------------------------- /sha1.py: -------------------------------------------------------------------------------- 1 | import binascii 2 | 3 | # 定义字长为32位 4 | w = 32 5 | 6 | # 初始化缓冲区寄存器(A、B、C、D、E) 7 | H = ["01100111010001010010001100000001", 8 | "11101111110011011010101110001001", 9 | "10011000101110101101110011111110", 10 | "00010000001100100101010001110110", 11 | "11000011110100101110000111110000"] 12 | 13 | # 初始化常数值K_i列表 14 | K = ["01011010100000100111100110011001", 15 | "01101110110110011110101110100001", 16 | "10001111000110111011110011011100", 17 | "11001010011000101100000111010110"] 18 | 19 | 20 | # 10进制转为16进制 21 | def decToHex(n): 22 | return hex(int(n, 10))[2:] 23 | 24 | 25 | # 16进制转为10进制 26 | def hexToDec(n): 27 | return int(n, 16) 28 | 29 | 30 | # 16进制转换为2进制 31 | def hexToBin(hex): 32 | msg = "" 33 | for char in hex: 34 | temp = bin(int(char, 16))[2:] 35 | if len(temp) < 4: 36 | msg += '0' * (4-len(temp)) 37 | msg += temp 38 | return msg 39 | 40 | 41 | # 2进制转换为16进制 42 | def binToHex(bin): 43 | msg = "" 44 | i = 0 45 | while(i < len(bin)): 46 | msg += hex(int(bin[i:i+4], 2))[2:] 47 | i += 4 48 | return msg 49 | 50 | 51 | # x、y的逐位逻辑“与” 52 | def logic_and(x, y): 53 | assert len(x) == len(y) 54 | z = "" 55 | for i in range(0, len(x)): 56 | if x[i] == "1" and y[i] == "1": 57 | z += "1" 58 | else: 59 | z += "0" 60 | return z 61 | 62 | 63 | # x、y的逐位逻辑“或” 64 | def logic_or(x, y): 65 | assert len(x) == len(y) 66 | z = "" 67 | for i in range(0, len(x)): 68 | if x[i] == "0" and y[i] == "0": 69 | z += "0" 70 | else: 71 | z += "1" 72 | return z 73 | 74 | 75 | # x的逐位逻辑“非” 76 | def logic_not(x): 77 | y = "" 78 | for i in range(0, len(x)): 79 | if x[i] == "1": 80 | y += "0" 81 | else: 82 | y += "1" 83 | return y 84 | 85 | 86 | # x、y的逐位逻辑“异或” 87 | def logic_xor(x, y): 88 | assert len(x) == len(y) 89 | z = "" 90 | for i in range(0, len(x)): 91 | if x[i] != y[i]: 92 | z += "1" 93 | else: 94 | z += "0" 95 | return z 96 | 97 | 98 | # x循环左移n位 99 | def ringShiftLeft(x, n): 100 | y = x[n:] + n * "0" 101 | z = (w-n) * "0" + x[0: -(w-n)] 102 | return logic_or(y, z) 103 | 104 | 105 | # 求模运算(10进制输入,2进制输出) 106 | def getMod(x): 107 | tmp = bin(x % 2**w)[2:] 108 | if len(tmp) < w: 109 | tmp = (w - len(tmp)) * "0" + tmp 110 | return tmp 111 | 112 | 113 | # 定义基本逻辑函数f_t 114 | def f_t(a, b, c, t): 115 | assert 0 <= t < 80 116 | if(0 <= t <= 19): 117 | return logic_or(logic_and(a, b),logic_and(logic_not(a), c)) 118 | elif( 40 <= t <= 59): 119 | temp1 = logic_or(a, b) 120 | temp2 = logic_or(a, c) 121 | temp3 = logic_or(b, c) 122 | temp4 = logic_and(temp1, temp2) 123 | return logic_and(temp3, temp4) 124 | else: 125 | return logic_xor(logic_xor(a, b), c) 126 | 127 | 128 | # 定义SHA-1的压缩函数(循环函数) 129 | def sha1_compress(t, k, W, H_t): 130 | #计算寄存器A的值 131 | temp = int(H_t[4],2) + int(f_t(H_t[1], H_t[2], H_t[3], t),2) + \ 132 | int(ringShiftLeft(H_t[0], 5),2) + int(W[t],2) + \ 133 | int(k,2) 134 | temp = getMod(temp) 135 | 136 | #更新寄存器A,B,C,D,E的值(H_t) 137 | H_t[4] = H_t[3] 138 | H_t[3] = H_t[2] 139 | H_t[2] = ringShiftLeft(H_t[1], 30) 140 | H_t[1] = H_t[0] 141 | H_t[0] = temp 142 | 143 | return H_t 144 | 145 | 146 | #sha-1算法的轮运算 147 | def sha1_cycle(x): 148 | 149 | # 计算得到当前分组字W0到W79的列表 150 | W = [] 151 | for t in range(0, 80): 152 | if t < 16: 153 | W.append(x[0:32]) 154 | x = x[32:] 155 | else: 156 | temp1 = logic_xor(W[t-16], W[t-14]) 157 | temp2 = logic_xor(W[t-8], W[t-3]) 158 | W.append(ringShiftLeft(logic_xor(temp1, temp2), 1)) 159 | 160 | # 计算寄存器(A,B,C,D,E)的值 161 | H_t = H[:] 162 | for t in range(0, 80): 163 | if t <= 19: 164 | H_t = sha1_compress(t, K[0], W, H_t) 165 | elif 20 <= t <= 39: 166 | H_t = sha1_compress(t, K[1], W, H_t) 167 | elif 40 <= t <= 59: 168 | H_t = sha1_compress(t, K[2], W, H_t) 169 | elif 60 <= t <= 79: 170 | H_t = sha1_compress(t, K[3], W, H_t) 171 | 172 | # 计算得到这一轮的散列结果,并存入缓存区寄存器 H(A,B,C,D,E) 173 | H[0] = getMod(int(H_t[0],2) + int(H[0], 2)) 174 | H[1] = getMod(int(H_t[1], 2) + int(H[1], 2)) 175 | H[2] = getMod(int(H_t[2], 2) + int(H[2], 2)) 176 | H[3] = getMod(int(H_t[3], 2) + int(H[3], 2)) 177 | H[4] = getMod(int(H_t[4], 2) + int(H[4], 2)) 178 | 179 | 180 | #sha-1算法(16进制输入) 181 | def sha1(x): 182 | msg = hexToBin(x) 183 | 184 | # 处理后的消息存入列表中 185 | msg_list = [] 186 | 187 | # 计算输入x的二进制长度n(n也为2进制) 188 | n = bin(len(msg))[2:] 189 | # print(len(msg)) 190 | 191 | # 消息分割 192 | while len(msg) > 512: 193 | msg_list.append(msg[0: 512]) 194 | msg = msg[512:] 195 | 196 | # 消息填充 197 | if len(msg) > 448: 198 | msg_list.append(msg + "1" + (511 - len(msg)) * "0") 199 | msg_list.append(448 * '0' + (64 - len(n)) * "0" + n) 200 | else: 201 | msg_list.append(msg + "1" + (447 - len(msg)) * "0" + (64 - len(n)) * "0" + n ) 202 | 203 | # 开始迭代计算散列值 204 | for msg in msg_list: 205 | sha1_cycle(msg) 206 | 207 | # 从缓冲区H取出最终的散列值 208 | hash = "" 209 | for i in list(map(binToHex, H)): 210 | hash += i 211 | 212 | return hash 213 | 214 | 215 | --------------------------------------------------------------------------------