【发布时间】:2018-06-15 14:08:28
【问题描述】:
我正在尝试使用 Shamir's Secret Sharing 的 pycryptodome 实现。
当拆分共享时,输出是一个带有这种形式的元组的列表对象:
<class 'list'>: [(1, b'\x84\x16H\x92\xaaJ\xf7\x84_\xf9\x02\x03\x86\xff\xb7Z'), (2, b'\x86p\xbe5\xbfP\xe4\x00m\x16\xd3\t\xb3\xc8\xfa\x1f'), (3, b'xR\xecWLY\x15||\xb3\x9c\x0f\xa0\xda>\xa1'), (4, b'\x82\xbdS{\x95d\xc3\x08\x08\xc9q\x1d\xd9\xa6`\x95'), (5, b'|\x9f\x01\x19fm2t\x19l>\x1b\xca\xb4\xa4+')]
在for 循环中的hexlify 之后,对象更具可读性:
for idx, share in shares:
print ("index #%d: %s" % (idx, hexlify(share)))
index #1: b'84164892aa4af7845ff9020386ffb75a'
index #2: b'8670be35bf50e4006d16d309b3c8fa1f'
index #3: b'7852ec574c59157c7cb39c0fa0da3ea1'
index #4: b'82bd537b9564c30808c9711dd9a66095'
我有这个模型:
class MyModel(models.Model):
user_id = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
some_other_id = models.ForeignKey(OtherModel, on_delete=models.CASCADE, null=True)
encrypted_share = models.CharField(max_length=200, blank=True)
我想以某种方式过滤MyModel 以获得特定的some_other_id,然后为每个user_id 条目从列表对象中保存一个共享,该列表对象使用来自user_model 的用户public_key 进行加密。
这是我在views.py 中创建共享的方法:
number_of_users = MyModel.objects.filter(some_other_id=self.object.pk).count()
minimum_shares = (number_of_users*7)//10
shares = Shamir.split(minimum_shares, number_of_users, key)
编辑:
我将添加更多信息以使我想要实现的目标更加清晰。
基本上MyModel 是参与投票的用户列表。
我的models.py:
class Poll(models.Model):
question_text = models.CharField(max_length=200)
public_key = models.CharField(max_length=30, blank=True)
owner = models.ForeignKey(User, on_delete=models.CASCADE, editable=False)
class EligibleVoters(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
poll = models.ForeignKey(Poll, on_delete=models.CASCADE, null=True)
encrypted_keypart = models.CharField(max_length=200, blank=True)
class Meta:
unique_together = ["user", "poll"]
目前我有一个EligibleVoters 表,如下所示:
我还为每个poll 创建了一个RSA 密钥对。我想将密钥对的私有部分拆分为多个共享,并将每个共享保存在每个用户旁边。
因此,根据我发布的表格,对于poll 和poll_id=1,我想过滤允许参与该投票的用户并计算他们,从而找出我必须拆分多少股私钥。
我这样做:
number_of_shares = EligibleVoters.objects.filter(poll=self.object.pk).count()
接下来我设置重建密钥所需的最小份额数(在我的情况下为 70%)。
我这样做:
minimum_shares = (number_of_shares*7)//10
接下来我将密钥拆分为共享:
shares = Shamir.split(minimum_shares, number_of_shares, private_key)
正如我在编辑之前所描述的,此函数为我提供了包含索引和共享的元组的 list。
现在我想用poll_id=1 将每个共享保存在每个参与poll 的用户旁边(最好使用我的user_model 中每个user 的public_key 加密)。
最终得到这样的结果:
我希望现在这更有意义。
【问题讨论】:
-
我不明白。您想为每个用户保存一个 MyModel 吗??
-
如果要统计用户,那是不对的。因为可能一位用户拥有一个或多个 MyModel。
-
我忘了在 MyModel 中添加
user_id和some_other_id是unique_together。因此,通过特定的some_other_id过滤并计数,我可以计算用户数。我会尝试更新我的问题,以使我想要更清楚。 -
用户与 MyModel 的关系请使用 onetoone 而非外键
-
@MohammadAli 我编辑了我的问题
标签: python django django-models foreign-keys