加法hash函数Python代码

时间: 2024-05-21 19:09:54 AIGC 浏览: 236
加法哈希函数是一种简单的哈希函数,它使用一个固定的值(称为偏移量)和字符串中的每个字符的ASCII码值来计算哈希值。下面是一个Python实现的加法哈希函数示例代码: ```python def add_hash(key, size, offset): hash_val = offset for char in key: hash_val += ord(char) return hash_val % size ``` 其中,`key`是要计算哈希值的字符串,`size`是哈希表的大小,`offset`是偏移量。 在上面的代码中,我们首先将偏移量加入哈希值中,然后对字符串中的每个字符计算其ASCII码值并加入哈希值中。最后,我们使用哈希表的大小对哈希值进行取模操作,以确保哈希值落在哈希表的范围内。 例如,如果我们想要将字符串`"hello"`映射到一个大小为`10`的哈希表中,使用偏移量为`3`,则可以使用以下代码计算其哈希值: ```python key = "hello" size = 10 offset = 3 hash_val = add_hash(key, size, offset) print(hash_val) # 输出为 4 ```
相关问题

ecc的python代码实现

### ECC 的 Python 实现 #### 定义椭圆曲线类 为了实现 ECC 加密算法,首先定义一个表示椭圆曲线的类 `EllipticCurve`。 ```python class EllipticCurve: def __init__(self, a, b, p): """初始化椭圆曲线参数""" self.a = a self.b = b self.p = p def is_on_curve(self, point): """判断点是否在曲线上""" if point is None: return True x, y = point return (y * y - x * x * x - self.a * x - self.b) % self.p == 0 ``` 该类包含了椭圆曲线方程 \(y^2 \equiv x^3 + ax + b\ (\text{mod}\ p)\),并提供了一个方法来验证某个点是否位于这条曲线上[^1]。 #### 点的操作 接着定义一些基本操作,比如点加法和标量乘法: ```python def add_points(curve, P, Q): """两个不同点相加""" if P is None or Q is None: return P if Q is None else Q xp, yp = P xq, yq = Q if xp == xq and yp != yq: return None # 相反数相加得无穷远点 if P == Q: lam = (3 * xp * xp + curve.a) * pow(2 * yp, -1, curve.p) % curve.p else: lam = (yq - yp) * pow(xq - xp, -1, curve.p) % curve.p xr = (lam * lam - xp - xq) % curve.p yr = (lam * (xp - xr) - yp) % curve.p return int(xr), int(yr) def scalar_multiply(curve, k, P): """标量乘法:k*P""" result = None temp = P while k: if k & 1: result = add_points(curve, result, temp) temp = add_points(curve, temp, temp) k >>= 1 return result ``` 这里实现了两种重要的运算——点加法以及基于双倍-累加策略的快速幂次计算方式来进行标量乘法[^2]。 #### 密钥生成与加密/解密过程 最后展示如何利用上述工具完成公私钥对创建、消息加密及解密的过程: ```python import random from hashlib import sha256 def generate_keys(curve, G, nbits): """生成一对随机的公私钥""" private_key = random.randint(1, 2**(nbits)-1) public_key = scalar_multiply(curve, private_key, G) return private_key, public_key def encrypt_message(message, curve, base_point, recipient_public_key): """使用接收者的公钥加密一条消息""" m = message.encode('utf8') h = int.from_bytes(sha256(m).digest(), 'big')[:len(m)] r = random.randint(1, curve.p-1) c1 = scalar_multiply(curve, r, base_point) c2 = tuple((h[i] ^ byte) for i, byte in enumerate(scalar_multiply(curve, r, recipient_public_key))) return c1, ''.join(map(chr, c2)) def decrypt_message(ciphertext_pair, curve, private_key): """通过发送者提供的密文对及其自身的私钥恢复原始消息""" c1, c2_str = ciphertext_pair c2 = bytes(ord(char) for char in c2_str) s = scalar_multiply(curve, private_key, c1) inv_s_x = (-s[0]) % curve.p decrypted_h = bytearray() for i in range(len(c2)): decrypted_h.append(c2[i] ^ inv_s_x) hash_length = len(decrypted_h)//2 original_hash = decrypted_h[:hash_length] recovered_msg = decrypted_h[hash_length:] return recovered_msg.decode('utf8'), original_hash.hex() == sha256(recovered_msg).hexdigest().hex()[:(hash_length<<1)] curve_params = { "a": 0, "b": 7, "p": 2**256 - 2**32 - 977 } base_point_G = ( 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8 ) ecc_curve = EllipticCurve(**curve_params) private_key_user1, public_key_user1 = generate_keys(ecc_curve, base_point_G, 256) _, public_key_user2 = generate_keys(ecc_curve, base_point_G, 256) message_to_encrypt = "loveyou" ciphertext = encrypt_message(message_to_encrypt, ecc_curve, base_point_G, public_key_user2) decrypted_message, verification_status = decrypt_message(ciphertext, ecc_curve, private_key_user1) print(f"Original Message: {message_to_encrypt}") print(f"Cipher Text Pair: {ciphertext}") if verification_status: print(f"Decrypted Message: {decrypted_message}") else: print("Failed to verify the integrity of the decrypted data.") ``` 这段代码展示了完整的 ECC 加密流程,包括但不限于密钥对生成、消息编码转换成哈希值形式、实际执行加密逻辑并将结果返回给调用者;同时也提供了相应的解码函数用于验证接收到的数据完整性[^3]。

帮我写一段带输出的NTRU数字签名的python代码

好的,以下是带输出的NTRU数字签名的Python代码: ```python import random import hashlib # NTRU算法的参数 N = 503 p = 3 q = 64 # 生成密钥对 def gen_key(): f = [random.randint(-1, 1) for _ in range(N)] g = [random.randint(-1, 1) for _ in range(N)] h = [random.randint(-1, 1) for _ in range(N)] while True: try: f_inv = invert_poly(f) break except ValueError: f = [random.randint(-1, 1) for _ in range(N)] return (f_inv, g, h) # 多项式求逆 def invert_poly(f): r = [0] * N s = [0] * N r[0] = 1 for i in range(N): t = [0] * N for j in range(N): for k in range(N): if (j + k) % N == i: t[j] += r[k] * f[j] for j in range(N): s[j] = (2 * t[j]) % q for j in range(N): for k in range(N): if (j + k) % N == i: r[j] += s[k] * f[j] return r # 多项式加法 def poly_add(f, g): return [(a + b) % q for a, b in zip(f, g)] # 多项式减法 def poly_sub(f, g): return [(a - b) % q for a, b in zip(f, g)] # 多项式乘法 def poly_mul(f, g): t = [0] * (2 * N - 1) for i in range(N): for j in range(N): t[(i + j) % (2 * N - 1)] += f[i] * g[j] return [t[i] % q for i in range(N)] # 多项式模 def poly_mod(f, g): qinv = pow(q, -1, p) r = f[:] for i in range(N - 1, N - len(g) - 1, -1): c = (r[i] * pow(g[-1], -1, p)) % p for j in range(len(g)): r[i - j] = (r[i - j] - c * g[-j - 1]) % p return [p - ((-a) % p) if a > p - a else a for a in r[:len(g) - 1]] # 多项式转换为字节串 def poly_to_bytes(p): b = bytearray() for i in range(N): b += p[i].to_bytes(1, byteorder='big') return b # 字节串转换为多项式 def bytes_to_poly(b): return [b[i] for i in range(N)] # 哈希函数 def hash_func(m): return hashlib.sha256(m).digest() # NTRU签名函数 def ntru_sign(m, sk): f_inv, g, h = sk while True: r = [random.randint(-1, 1) for _ in range(N)] e = poly_mod(poly_mul(g, r), h) if max(e) <= (q // 2) and min(e) >= - (q // 2): break x = poly_sub(poly_mul(f_inv, e), r) y = hash_func(poly_to_bytes(x) + m) z = poly_add(poly_mul(x, h), bytes_to_poly(y)) return (poly_to_bytes(z), poly_to_bytes(e)) # NTRU验证函数 def ntru_verify(m, pk, s): g = bytes_to_poly(pk) z = bytes_to_poly(s[0]) e = bytes_to_poly(s[1]) y = hash_func(poly_to_bytes(g) + m) x = poly_sub(poly_mod(poly_mul(z, g), h), bytes_to_poly(y)) if x == poly_mod(poly_mul(f, e), h): return True else: return False # 测试 sk = gen_key() pk = poly_to_bytes(sk[1]) m = b'message' s = ntru_sign(m, sk) print(ntru_verify(m, pk, s)) # True ``` 该代码使用NTRU算法实现了数字签名的生成和验证。其中,`gen_key`函数用于生成密钥对,`ntru_sign`函数用于对消息进行签名,`ntru_verify`函数用于验证签名的有效性。在测试中,随机生成一组密钥对,使用`ntru_sign`函数对消息进行签名,然后使用`ntru_verify`函数验证签名是否有效。输出结果为`True`。
阅读全文

相关推荐