现代密码学3.4--CPA安全,多次加密

博主正在学习INTRODUCTION TO MODERN CRYPTOGRAPHY (Second Edition) --Jonathan Katz, Yehuda Lindell,做一些笔记供自己回忆,如有错误请指正。整理成一个系列现代密码学,方便检索。

  • 第二章定义的完美安全是一种理论上的讨论,而第三章需要定义的计算安全是一种更偏向实际需求的讨论。
  • 3.1节讨论了定义计算安全的两种方法,3.2节讨论了什么是计算安全,3.3节给出了基于PRG构造的计算安全的密码方案
  • 以上3.1-3.3节都在讨论计算安全,这是一种抵御唯密文攻击的安全,根据1.4节的四种攻击模型可知,这是对敌手能力的一种最弱描述。现在,我们考虑敌手具有选择明文攻击的攻击能力,来定义一种更强的安全性:CPA安全,以及考虑多次加密的计算安全和多次加密的CPA安全

CPA安全

oracle

攻击者可以选择明文 m m m传给加密者,加密者用加密算法 E n c k ( m ) Enc_k(m) Enck(m)得到 c c c……返回给攻击者。把这个过程看作一次查询,由攻击者来确定查什么,可以进行任意多次,且每次都用同样的密钥 k k k

例子

美军vs日军,中途岛海战:美军监听到日军要攻击“AF”,但是无法破解“AF”是什么地方。美军猜测是“中途岛”,于是让中途岛发假信息说缺水,日本截获了这个信息并立即报告给总部:“AF”缺水,这就让美军知道了在日军的加密方案中“AF”就是“中途岛”。这就是选择明文攻击,美军选择了明文“中途岛”,日军加密得到“AF”,虽然不是日军自愿参与的,但美军仍达到了他们的需要。

含oracle的实验过程

  • 敌手 A \mathcal{A} A已知安全参数 1 n 1^n 1n,有一个连接 E n c k ( ⋅ ) Enc_k(\cdot) Enck()的oracle(可以询问 E n c k ( ⋅ ) Enc_k(\cdot) Enck()任意多次),输出等长明文 m 0 , m 1 m_0,m_1 m0,m1给加密者;
  • 加密者任选 b ∈ { 0 , 1 } b\in\{0,1\} b{ 0,1},输出密文 c ← E n c k ( m b ) c\leftarrow Enc_k(m_b) cEnck(mb)给敌手 A \mathcal{A} A
  • 敌手 A \mathcal{A} A在获得 c c c后,仍有一个连接 E n c k ( ⋅ ) Enc_k(\cdot) Enck()的oracle(可以根据 c c c调整,继续查询),输出猜测的 b ′ b' b
  • 如果 b ′ = b b'=b b=b输出1,否则输出0。

CPA安全定义

私钥加密方案 Π = ( G e n , E n c , D e c ) \Pi=(Gen,Enc,Dec) Π=(Gen,Enc,Dec)如果对于任意PPT敌手 A \mathcal{A} A,都有一个可忽略函数negl满足 P r [ P r i v K A , Π c p a ( n ) = 1 ] ≤ 1 2 + Pr[PrivK_{\mathcal{A},\Pi}^{cpa}(n)=1]\le \frac{1}{2}+ Pr[PrivKA,Πcpa(n)=

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 循环结构是编程中非常重要的一部分,其中while循环是一种常见的循环结构。在Python中,我们可以使用while循环来实现凯撒密码加密。 凯撒密码是一种简单的加密方法,它将明文中的每个字母都替换为字母表中固定位置后的字母。例如,如果我们将字母表向右移动3个位置,那么A就会变成D,B就会变成E,以此类推。 下面是一个使用while循环实现凯撒密码加密的示例代码: ``` # 定义明文和密钥 plaintext = "HELLO WORLD" key = 3 # 将明文转换为大写字母 plaintext = plaintext.upper() # 定义密文 ciphertext = "" # 遍历明文中的每个字符 i = 0 while i < len(plaintext): # 如果是字母,则进行加密 if plaintext[i].isalpha(): # 将字母转换为ASCII码 ascii_code = ord(plaintext[i]) # 加上密钥 shifted_ascii_code = ascii_code + key # 如果超出了字母表范围,则回到字母表开头 if shifted_ascii_code > ord('Z'): shifted_ascii_code -= 26 # 将加密后的ASCII码转换为字母 ciphertext += chr(shifted_ascii_code) # 如果不是字母,则直接添加到密文中 else: ciphertext += plaintext[i] i += 1 # 输出密文 print(ciphertext) ``` 在上面的代码中,我们首先定义了明文和密钥。然后将明文转换为大写字母,以便后面的加密操作。接着定义了一个空字符串ciphertext,用于存储加密后的密文。 在while循环中,我们遍历明文中的每个字符。如果是字母,则进行加密操作。具体来说,我们将字母转换为ASCII码,然后加上密钥。如果加密后的ASCII码超出了字母表范围,则回到字母表开头。最后将加密后的ASCII码转换为字母,并添加到密文中。如果不是字母,则直接添加到密文中。 最后,我们输出加密后的密文。 ### 回答2: 凯撒密码是一种简单的加密方式,它的原理是将明文中的每个字母用字母表中其后面第k个字母来代替,其中k为加密密钥。在Python中,我们可以使用while循环来实现凯撒密码的加密过程。 首先,我们需要定义一个加密密钥k和明文字符串s,然后将密文字符串c初始化为空字符串。接下来,我们可以使用while循环来遍历明文字符串s中的每个字符。对于每个字符,我们可以使用ord()函数将其转换成ASCII码,然后将其加上密钥k并对26取余,再使用chr()函数将其转换成密文中的字符。最后,我们需要将加密后的字符拼接到密文字符串c中。 以下是凯撒密码加密的Python代码示例: ``` k = 3 # 加密密钥 s = "hello" # 明文字符串 c = "" # 密文字符串 i = 0 # 计数器 while i < len(s): ch = s[i] # 获取当前字符 code = ord(ch) # 将字符转换成ASCII码 code = (code + k) % 26 # 加密 cipher = chr(code + ord('a')) # 将ASCII码转换成字符 c += cipher # 将加密后的字符拼接到密文字符串中 i += 1 # 计数器加1 print(c) # 输出密文字符串 ``` 执行以上代码,输出结果为"khoor",也就是"h"变成了"k","e"变成了"h","l"变成了"o","o"变成了"r","l"变成了"o"。 在while循环中,我们使用计数器i来遍历明文字符串s中的每个字符,直到i等于字符串长度为止。这样,我们就可以将明文字符串中的每个字符加密成相应的密文字符,并将加密后的字符拼接到密文字符串c中。在这个过程中,我们还需要注意一些细节,例如字符转换成ASCII码时需要使用ord()函数,ASCII码转换成字符时需要使用chr()函数,以及字符下标从0开始计数等。 ### 回答3: 凯撒密码是古代的一种简单的加密方法,它把明文中的每个字母都按照一个固定的偏移量进行移位,从而得到密文。在Python中,我们可以使用while循环来实现凯撒密码的加密。 首先,我们需要定义一个变量来表示移位量,这个变量可以是任意整数。例如,假设我们选择将明文中的每个字母都向右移动3个位置,那么移位量就是3。 然后,我们需要输入明文,也就是需要加密的文本。我们可以使用input()函数来获取用户输入。 接下来,我们需要定义一个空字符串变量cipher来表示密文,并使用while循环来逐个加密明文中的每个字符。while循环的终止条件是处理完所有的字符。 在循环中,我们需要先判断明文中的字符是否是字母。如果是字母,就需要进行移位操作。我们可以使用ord()函数将字符转换为相应的ASCII码,然后加上移位量,再使用chr()函数将结果转换回字符。注意,如果移位后的字符超出了字母的范围,就需要将其回到字母表的起点或末尾。 如果不是字母,则直接将其加入密文中。 最后,我们输出密文。 以下是凯撒密码加密的代码示例: ``` # 定义移位量 shift = 3 # 获取明文 plain_text = input("请输入明文:") # 加密明文 cipher = "" i = 0 while i < len(plain_text): # 判断当前字符是否是字母 if plain_text[i].isalpha(): # 对字母进行移位操作 ascii_code = ord(plain_text[i]) + shift if plain_text[i].isupper(): if ascii_code > ord('Z'): ascii_code -= 26 elif plain_text[i].islower(): if ascii_code > ord('z'): ascii_code -= 26 cipher += chr(ascii_code) else: cipher += plain_text[i] i += 1 # 输出密文 print("加密后的密文是:", cipher) ``` 以上就是使用while循环实现凯撒密码加密的详细过程。当然,这只是凯撒密码的一个简单实现,如果要更加安全和复杂的加密,可以使用更加高级的加密算法和密钥管理方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值