1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
| """ Created on Sat Dec 14 21:40:07 2024
SHA-1 对输入的明文采用utf-8编码 对输出的密文采用十六进制编码
"""
def string_to_bitstring(s): """ 将字符串转换为二进制位串 :param s: 输入字符串 :return: 由每个字符转换成的 8 位二进制数拼接成的字符串 """ return ''.join(format(ord(char), '08b') for char in s)
def add_padding_bits(bitstring): if len(bitstring) < 448: bitstring_padding=bitstring+'1' while len(bitstring_padding)!=448: bitstring_padding+='0' bitstring_hex_list=[bitstring_padding[i:i+4] for i in range(0,len(bitstring_padding),4)] else: print("明文字符串长度 >= 56, 尚未实现") bitstring_hex=''.join(hex(int(x,2))[2:] for x in bitstring_hex_list) while len(bitstring_hex)!=128: bitstring_hex+='0' end_padding=hex(len(bitstring))[2:] bitstring_hex=bitstring_hex[:-len(end_padding)]+end_padding return bitstring_hex
def circular_left_shift(x, n): """ 对32位整数x进行n位的循环左移 :param x: 输入的整数 (8位16进制数) :param n: 左移的位数 :return: 循环左移后的结果 """ x_int=int(x,16) result=((x_int << n) & 0xFFFFFFFF) | (x_int >> (32 - n)) return f"{result:08x}"
def mod32_add(x, y, z, u, k): result = (int(x, 16) + int(y, 16) + int(z, 16) + int(u, 16) + int(k, 16)) & 0xFFFFFFFF return f"{result:08x}"
def f1(X, Y, Z): result = (int(X, 16) & int(Y, 16)) | ((~int(X, 16)) & int(Z, 16)) return f"{result:08x}"
def f2(X, Y, Z): result = int(X,16) ^ int(Y,16) ^ int(Z,16) return f"{result:08x}"
def f3(X, Y, Z): result = (int(X,16) & int(Y,16)) | (int(X,16) & int(Z,16)) | (int(Y,16) & int(Z,16)) return f"{result:08x}"
def f4(X, Y, Z): result = int(X,16) ^ int(Y,16) ^ int(Z,16) return f"{result:08x}"
def sha_1_encode(bitstring_hex): A=['67452301'] B=['EFCDAB89'] C=['98BADCFE'] D=['10325476'] E=['C3D2E1F0'] w=[bitstring_hex[i:i+8] for i in range(0,len(bitstring_hex),8)] K=['5a827999','6ed9eba1','8f1bbcdc','ca62c1d6'] function=[f1,f2,f3,f4] for i in range(16,80): w_tem=''.join([hex(int(a,16) ^ int(b,16) ^ int(c,16) ^ int(d,16))[2:] for a,b,c,d in zip(w[i-16],w[i-14],w[i-8],w[i-3])]) w_tem=circular_left_shift(w_tem, 1) w.append(w_tem) for i in range(4): for t in range(i*20,(i+1)*20): A_tem=mod32_add(E[len(E)-1],function[i](B[len(B)-1],C[len(C)-1],D[len(D)-1]),circular_left_shift(A[len(A)-1], 5), w[t], K[i]) A.append(A_tem) B.append(A[len(A)-2]) C.append(circular_left_shift(B[len(B)-2], 30)) D.append(C[len(C)-2]) E.append(D[len(D)-2]) A.append(mod32_add(A[len(A)-1], A[len(A)-81], '0', '0', '0')) B.append(mod32_add(B[len(B)-1], B[len(B)-81], '0', '0', '0')) C.append(mod32_add(C[len(C)-1], C[len(C)-81], '0', '0', '0')) D.append(mod32_add(D[len(D)-1], D[len(D)-81], '0', '0', '0')) E.append(mod32_add(E[len(E)-1], E[len(E)-81], '0', '0', '0')) ciphertext=A[len(A)-1]+B[len(B)-1]+C[len(C)-1]+D[len(D)-1]+E[len(E)-1] return ciphertext
def main(): while True: print("==================== SHA-1 加密======================") print("[1] 加密") print("[0] 退出") print("====================================================") try: choice = int(input("请输入操作选项 (0 或 1 ): ")) if choice == 0: print("\n\n程序已退出。感谢使用 SHA-1 加密工具!") break elif choice == 1: plaintext = input("请输入明文 (UTF-8 编码,目前只支持字符长度 <56): ") bitstring = string_to_bitstring(plaintext) bitstring_hex = add_padding_bits(bitstring) if not plaintext: raise ValueError("明文不能为空!") ciphertext=sha_1_encode(bitstring_hex) print("\n加密结果 (十六进制):") print(ciphertext) else: raise ValueError("无效选项") except ValueError as e: print(f"输入错误: {e}") except Exception as e: print(f"发生错误: {e}")
if __name__=="__main__": main()
|