我们的解决方案将利用 Shamir 的秘密共享来实现分布式信任,并使用加法同态加密来对加密数据进行计算。最终,您将拥有一个强大的后端系统,可以在不妥协个人数据隐私的情况下检测多个参与方的欺诈行为。

问题:在隐私至上的世界中进行协作欺诈检测

欺诈检测通常需要比较来自多个来源的数据。但在我们这个注重隐私的时代,分享原始数据是绝对不行的。我们的挑战在于:

  • 多家银行需要检查其客户群中的欺诈活动
  • 没有一家银行愿意向其他银行透露其客户数据
  • 我们需要在不暴露个人记录的情况下找到共同的欺诈模式

听起来像是想在不打破鸡蛋的情况下做煎蛋卷,对吧?这正是多方计算(MPC)可以帮助我们实现的!

解决方案:MPC 和 PSI 来拯救

我们的方法将使用两种主要的密码技术:

  1. Shamir 的秘密共享(SSS):将敏感数据分成多个份额
  2. 加法同态加密(AHE):对加密数据进行计算

我们将结合这些技术创建一个私有集合交集协议,使我们能够在不揭示数据集的情况下找到数据集之间的共同元素。

步骤 1:设置 Shamir 的秘密共享

首先,让我们实现 Shamir 的秘密共享。这个算法将允许我们将敏感数据分成可以分发给参与者的份额。


import random
from sympy import *

def generate_polynomial(secret, degree, prime):
    coefficients = [secret] + [random.randint(0, prime-1) for _ in range(degree)]
    return coefficients

def evaluate_polynomial(coefficients, x, prime):
    return sum(coeff * pow(x, power, prime) for power, coeff in enumerate(coefficients)) % prime

def create_shares(secret, num_shares, threshold, prime):
    coefficients = generate_polynomial(secret, threshold-1, prime)
    return [(i, evaluate_polynomial(coefficients, i, prime)) for i in range(1, num_shares+1)]

# 使用
prime = 2**127 - 1  # 一个梅森素数
secret = 1234
shares = create_shares(secret, num_shares=5, threshold=3, prime=prime)
print(shares)

此实现允许我们将一个秘密分成多个份额,其中任何等于或大于阈值的份额子集可以重建秘密,但更少的份额则无法揭示秘密。

步骤 2:实现加法同态加密

接下来,我们将实现一个简单的加法同态加密方案。在这个例子中,我们将使用 Paillier 密码系统,它允许对加密数据进行加法运算。


from phe import paillier

def generate_keypair():
    return paillier.generate_paillier_keypair()

def encrypt(public_key, value):
    return public_key.encrypt(value)

def decrypt(private_key, encrypted_value):
    return private_key.decrypt(encrypted_value)

def add_encrypted(encrypted_a, encrypted_b):
    return encrypted_a + encrypted_b

# 使用
public_key, private_key = generate_keypair()
a, b = 10, 20
encrypted_a = encrypt(public_key, a)
encrypted_b = encrypt(public_key, b)
encrypted_sum = add_encrypted(encrypted_a, encrypted_b)
decrypted_sum = decrypt(private_key, encrypted_sum)
print(f"解密后的和: {decrypted_sum}")  # 应为 30

这种同态加密方案允许我们在不先解密的情况下对加密值进行加法运算。

步骤 3:实现私有集合交集

现在,让我们结合 SSS 和 AHE 来创建我们的私有集合交集协议:


def private_set_intersection(set_a, set_b, threshold, prime):
    public_key, private_key = generate_keypair()
    
    # 为 set_a 中的每个元素创建份额
    shares_a = {elem: create_shares(elem, len(set_b), threshold, prime) for elem in set_a}
    
    # 加密份额
    encrypted_shares_a = {elem: [encrypt(public_key, share[1]) for share in shares] for elem, shares in shares_a.items()}
    
    # 模拟将加密份额发送给其他方
    # 在实际场景中,这将涉及网络通信
    
    # 其他方根据接收到的份额评估他们的集合
    intersection = set()
    for elem_b in set_b:
        possible_match = True
        for elem_a, enc_shares in encrypted_shares_a.items():
            reconstructed = sum(share * pow(elem_b, i+1, prime) for i, share in enumerate(enc_shares))
            if decrypt(private_key, reconstructed) != 0:
                possible_match = False
                break
        if possible_match:
            intersection.add(elem_b)
    
    return intersection

# 使用
set_a = {1, 2, 3, 4, 5}
set_b = {3, 4, 5, 6, 7}
threshold = 3
prime = 2**127 - 1

intersection = private_set_intersection(set_a, set_b, threshold, prime)
print(f"交集: {intersection}")

此实现允许两个参与方在不揭示各自集合的情况下找到其集合的交集。

整合:欺诈检测系统

现在我们有了构建模块,让我们使用基于 MPC 的私有集合交集创建一个简单的欺诈检测系统:


class Bank:
    def __init__(self, name, suspicious_accounts):
        self.name = name
        self.suspicious_accounts = set(suspicious_accounts)

class FraudDetectionSystem:
    def __init__(self, banks, threshold, prime):
        self.banks = banks
        self.threshold = threshold
        self.prime = prime
    
    def detect_common_suspicious_accounts(self):
        if len(self.banks) < 2:
            return set()
        
        common_suspicious = self.banks[0].suspicious_accounts
        for i in range(1, len(self.banks)):
            common_suspicious = private_set_intersection(
                common_suspicious, 
                self.banks[i].suspicious_accounts, 
                self.threshold, 
                self.prime
            )
        
        return common_suspicious

# 使用
bank_a = Bank("银行 A", [1001, 1002, 1003, 1004, 1005])
bank_b = Bank("银行 B", [1003, 1004, 1005, 1006, 1007])
bank_c = Bank("银行 C", [1005, 1006, 1007, 1008, 1009])

fraud_system = FraudDetectionSystem([bank_a, bank_b, bank_c], threshold=3, prime=2**127 - 1)
common_suspicious = fraud_system.detect_common_suspicious_accounts()

print(f"共同可疑账户: {common_suspicious}")

此系统允许多家银行协作检测潜在的欺诈账户,而不透露各自的可疑账户列表。

思考:影响和考虑

在您急于将其投入生产之前,这里有一些需要考虑的事项:

  • 性能:MPC 协议可能计算密集。您将如何优化大数据集的处理?
  • 网络通信:我们的示例假设本地计算。实际上,您需要处理参与方之间的安全网络通信。
  • 安全模型:我们的实现假设参与方是半诚实的。对于恶意对手,需要做哪些更改?
  • 法规合规:这种方法如何与 GDPR 或 CCPA 等数据保护法规保持一致?

总结:隐私保护计算的力量

我们只是触及了安全多方计算和私有集合交集的可能性。通过利用这些技术,我们可以创建尊重个人隐私的强大协作系统。

记住,在数据隐私的世界中,我们不仅仅是在编写代码——我们是在构建信任。所以,下次有人告诉您隐私和数据实用性是互斥的,您可以自信地说:“拿着我的同态加密啤酒!”

编码愉快,愿您的计算永远安全!

“我们信任上帝。其他人必须带来数据。”——现在,感谢 MPC,他们可以在不真正带来数据的情况下带来数据!

进一步阅读