Perfectly Secret Encryption

2. Perfectly Secret Encryption

主要介绍了perfect secrecy(perfect secrecy是一种能够抵御有无穷算力的敌手攻击的可证明安全)。
简要介绍一下如何生成随机数。

现代的随机数生成过程分为两步——第一步,先收集高熵数据(这里的熵是不可预测性的测度,高熵即高不可预测性);第二步,平滑处理高熵数据输出一个近似独立无偏的随机序列。

为了“平滑”高熵数据以获得(几乎)独立和均匀的位元所需要的处理不是容易的的,假设我们的高熵池包含一个有偏的位序列,其中1出现的概率为p,0出现的概率为1−p。我们可以通过成对地取原始位得到一个统一的位序列:如果我们看到1后跟0,那么我们输出0,如果我们看到0后跟1,那么我们输出1。(如果我们连续看到两个0或两个1,我们什么也不输出,然后继续到下一对。)任何一对得到0的概率是p·(1−p),这完全等于任何一对得到1的概率。(请注意,我们甚至不需要知道p的值!)因此,我们从我们初始的高熵池中获得了一个均匀分布的输出

所以,密码学中使用的随机数生成器必须是密码级别的,不能直接调用诸如c语言stdlib.h之类的普通库函数。

2.1 Definitions

消息的概率分布不是由加密方案本身决定的,而是反映了使用该方案的各方发送不同消息的可能性,以及对手对所发送内容的不确定性。

因为K的分布是由加密方案本身决定的(因为它是由Gen定义的),而M上的分布取决于使用加密方案的上下文。

定义1
定义二
定义三
perfect secret的中心思想就是:敌手窃听的密文对了解明文没有任何帮助;换句话说,窃听到密文后推测出明文的后验概率与窃听前推测出明文的先验概率一致。

以上三个关于perfect secret的定义是等价的的。只不过角度不一样罢了。
定义1是从后验概率和先验概率相等的中心思想出发定义的;

定义2的含义是密文的分布概率不依赖于明文(即就算知道了密文,也无法区分该密文是从何种分布的明文加密而来);

定义3是从perfectly indistinguishable出发,认为敌手在experiment中胜出的概率恰好为1/2,等于乱猜的概率。

三个定义的证明过程就此略过,证明主要是用贝叶斯公式进行证明。

P(A|B)*P(B)=P(B|A)*P(A)

2.2 The One-Time Pad

文章用了很长的篇章证明了the one time pad是完美加密。证明也略过,跟2.1的的证明类似。

The One-Time Pad主要是用Xor(异或)来进行加密,异或就是二进制下每一位比较,相同为0,不同为1。异或的性质在加密中就显得很完美。
A ⊕ A = 0 A\oplus A=0 AA=0
A ⊕ 0 = A A\oplus 0=A A0=A
加密时 c = k ⊕ m c =k \oplus m c=km
解密时 m = k ⊕ c = k ⊕ k ⊕ m m=k \oplus c=k \oplus k \oplus m m=kc=kkm

结论:The one-time pad encryption scheme is perfectly secret.
但是one-time pad有以下缺点:第一,密钥长度必须和明文长度一样长;第二,只有单次使用才能保证安全性。

2.3 Limitations of Perfect Secrecy

2.2中one-time pad的缺陷并不是个例,而是完美加密存在的普遍缺陷。

If (Gen, Enc, Dec) is a perfectly secret encryption scheme with message space M and key space K, then |K| ≥ |M|.

Perfect secrecy的致命缺陷——密钥长度大于等于明文长度,导致perfect secrecy无法实际应用。证明略。

2.4 *Shannon’s Theorem .

Let (Gen, Enc, Dec) be an encryption scheme with message space M, for which |M| = |K| = |C|. The scheme is perfectly secret if and only if:

  1. Every key k ∈ K is chosen with (equal) probability 1/|K| by algorithm Gen.
  2. For every m ∈ M and every c ∈ C, there exists a unique key k ∈ K such that EncK(m) outputs c.

香农理论能够简单有效地判断加密方案是否为perfectly secert。但注意该理论只在 |M| = |K| = |C| 时成立!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: s = "i want to study python perfectly" s_list = list(s) for i in range(len(s_list)): if i % 5 == 0: print(s_list[i], end=' ') else: print(s_list[i], end='') if i == len(s_list) - 1: print() ### 回答2: 将字符串s = "i want to study python perfectly"转换为元组的方法是使用字符串的split函数,将其按空格分割成字符串列表,再使用tuple函数将其转换为元组: ```python s = "i want to study python perfectly" t = tuple(s.split()) ``` 接下来,我们需要按照5个一行的格式输出元组t。我们可以使用for循环遍历t,每次输出一个元素,并计数。当计数达到5时,我们输出一个换行符。 ```python count = 0 for item in t: count += 1 print(item, end=' ') if count == 5: print() count = 0 ``` 完整代码如下: ```python s = "i want to study python perfectly" t = tuple(s.split()) count = 0 for item in t: count += 1 print(item, end=' ') if count == 5: print() count = 0 ``` 运行结果为: ``` i want to study python perfectly ``` 此时只有一个元素,因此只输出了一行。如果我们在字符串s中添加更多单词,输出结果就会有多行。 ### 回答3: 题目要求将字符串s = \"i want to study python perfectly\"转换为元组,并按照5个一行的格式输出。下面是我的回答: 在Python中,可以使用split()方法将一个字符串转换为元组,具体步骤如下: 1. 首先,创建一个字符串s,表示要转换为元组的原始字符串。 2. 然后,调用s.split()方法,该方法将字符串s按照空格拆分,并返回一个列表。 3. 最后,调用tuple()方法将该列表转换为元组。 代码示例如下: s = "i want to study python perfectly" tuple_s = tuple(s.split()) 现在,我们已经将字符串s转换为了元组tuple_s,接下来需要按照5个一行的格式输出。 可以使用for循环遍历元组tuple_s中的每个元素,并使用条件语句判断输出的行数是否达到了5个,并在达到5个时进行输出。 代码示例如下: count = 0 # 记录每行输出的元素个数 for i in tuple_s: if count == 5: print() count = 0 print(i, end=' ') count += 1 上述代码中,变量count用于记录每行输出的元素个数,当count等于5时表示已经输出了5个元素,需要换行输出下5个元素。同时,使用end参数将print()函数的默认换行符替换为空格符。 运行上述代码,将得到以下格式化的输出结果: i want to study python perfectly

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值