维吉尼亚密码破解与一次性密码本加密
维吉尼亚密码破解程序
维吉尼亚密码破解程序包含多个关键步骤和函数,以下是详细介绍。
解密与确认
首先,尝试使用可能的密钥对密文进行解密,并检查解密后的文本是否为英文:
decryptedText = vigenereCipher.decryptMessage(possibleKey, ciphertextUp)
if detectEnglish.isEnglish(decryptedText):
# 将破解的密文恢复为原始大小写
origCase = []
for i in range(len(ciphertext)):
if ciphertext[i].isupper():
origCase.append(decryptedText[i].upper())
else:
origCase.append(decryptedText[i].lower())
decryptedText = ''.join(origCase)
print('Possible encryption hack with key %s:' % (possibleKey))
print(decryptedText[:200]) # 仅显示前200个字符
print()
print('Enter D if done, anything else to continue hacking:')
response = input('> ')
if response.strip().upper().startswith('D'):
return decryptedText
return None
上述代码的流程如下:
1. 使用
vigenereCipher.decryptMessage
函数,用可能的密钥对密文进行解密。
2. 利用
detectEnglish.isEnglish
函数检查解密后的文本是否为英文。
3. 若为英文,将解密后的文本恢复为原始大小写。
4. 打印可能的破解结果和提示信息,等待用户输入。
5. 若用户输入
D
,则返回解密后的文本;否则,返回
None
。
破解维吉尼亚密码主函数
hackVigenere
函数接受密文字符串作为参数,返回破解后的消息(若破解成功)或
None
(若失败):
def hackVigenere(ciphertext):
# 首先,进行卡西斯基试验,确定密文加密密钥的长度
allLikelyKeyLengths = kasiskiExamination(ciphertext)
if not SILENT_MODE:
keyLengthStr = ''
for keyLength in allLikelyKeyLengths:
keyLengthStr += '%s ' % (keyLength)
print('Kasiski examination results say the most likely key lengths are: ' + keyLengthStr + '\n')
hackedMessage = None
for keyLength in allLikelyKeyLengths:
if not SILENT_MODE:
print('Attempting hack with key length %s (%s possible keys)...' % (keyLength, NUM_MOST_FREQ_LETTERS ** keyLength))
hackedMessage = attemptHackWithKeyLength(ciphertext, keyLength)
if hackedMessage != None:
break
if hackedMessage == None:
if not SILENT_MODE:
print('Unable to hack message with likely key length(s). Brute-forcing key length...')
for keyLength in range(1, MAX_KEY_LENGTH + 1):
if keyLength not in allLikelyKeyLengths:
if not SILENT_MODE:
print('Attempting hack with key length %s (%s possible keys)...' % (keyLength, NUM_MOST_FREQ_LETTERS ** keyLength))
hackedMessage = attemptHackWithKeyLength(ciphertext, keyLength)
if hackedMessage != None:
break
return hackedMessage
该函数的执行步骤如下:
1. 调用
kasiskiExamination
函数进行卡西斯基试验,得到可能的密钥长度。
2. 若
SILENT_MODE
为
False
,打印可能的密钥长度。
3. 遍历可能的密钥长度,调用
attemptHackWithKeyLength
函数尝试破解。
4. 若破解成功,跳出循环。
5. 若所有可能的密钥长度都失败,进行暴力破解,尝试从 1 到
MAX_KEY_LENGTH
的所有密钥长度。
6. 返回破解后的消息或
None
。
程序常量及影响
程序中有三个常量会影响破解程序的运行:
| 常量 | 含义 | 影响 |
| ---- | ---- | ---- |
|
MAX_KEY_LENGTH
| 最大尝试的密钥长度 | 若维吉尼亚密钥长度超过该值,程序无法找到正确密钥。值越小,执行速度越快,但破解成功的可能性越低;值越大,执行速度越慢,但破解成功的可能性越高。 |
|
NUM_MOST_FREQ_LETTERS
| 每个子密钥尝试的字母数量 | 增加该值,程序会尝试更多密钥,但会减慢程序速度。若设置为 26,程序将跳过缩小每个子密钥可能字母数量的步骤。 |
|
SILENT_MODE
| 是否静默模式 | 若设置为
True
,程序不打印信息,可提高程序速度,但用户无法了解程序运行情况。 |
一次性密码本加密
一次性密码本加密是一种无法破解的加密方式,以下是详细介绍。
不可破解的一次性密码本加密
一次性密码本加密是一种维吉尼亚密码,当密钥满足以下条件时,加密信息将无法被破解:
1. 密钥长度与加密消息长度完全相同。
2. 密钥由真正随机的符号组成。
3. 密钥仅使用一次,不再用于其他任何消息。
例如,要加密消息
IF YOU WANT TO SURVIVE OUT HERE, YOU’VE GOT TO KNOW WHERE YOUR TOWEL IS
,去除空格和标点后有 55 个字母,需要一个同样 55 个字母长的密钥。使用示例密钥
KCQYZHEPXAUTIQEKXEJMORETZHZTRWWQDYLBTTVEJMEDBSANYBPXQIK
加密该字符串,将得到密文
SHOMTDECQTILCHZSSIXGHYIKDFNNMACEWRZLGHRAQQVHZGUERPLBBQC
。
由于密钥长度与消息长度相同,每个明文的子密钥都是唯一的,每个明文可以以相同的概率加密为任何密文字母。对于密文
SHOMTDEC...
,可能由完全不同的明文生成,因此无法通过频率分析等方法破解。
生成真正随机的密钥
Python 3.6 及更高版本的
secrets
模块可以生成真正随机的数字和字符。以下是生成 55 个字符长的真正随机一次性密码本的代码:
import secrets
otp = ''
for i in range(55):
otp += secrets.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
print(otp)
该代码的执行步骤如下:
1. 导入
secrets
模块。
2. 初始化一个空字符串
otp
。
3. 循环 55 次,每次从
ABCDEFGHIJKLMNOPQRSTUVWXYZ
中随机选择一个字符添加到
otp
中。
4. 打印生成的一次性密码本。
避免二次使用一次性密码本
二次使用一次性密码本是指使用相同的一次性密码本密钥加密两条不同的消息,这会使加密出现弱点。因为当黑客找到一个能将第一条密文解密为英文,但将第二条消息解密为乱码的密钥时,就知道该密钥不是原始密钥。实际上,很可能只有一个密钥能将两条消息都解密为英文。
二次使用一次性密码本与维吉尼亚密码的关系
二次使用一次性密码本加密与维吉尼亚密码在原理上相似。当维吉尼亚密码加密的消息长度超过密钥长度时,会循环使用密钥。例如,用 10 字母的密钥
YZNMPZXYXY
加密 20 字母的消息
BLUE IODINE INBOUND CAT
,前 10 个字母
BLUE IODINE
和后 10 个字母
INBOUND CAT
都使用该密钥加密。同样,若用相同的一次性密码本密钥
YZNMPZXYXY
分别加密两条 10 字母的消息
BLUE IODINE
和
INBOUND CAT
,就会出现与维吉尼亚密码类似的情况,因此可以使用破解维吉尼亚密码的技术来破解二次使用一次性密码本加密的消息。
综上所述,维吉尼亚密码破解程序通过多种方法尝试破解加密消息,但一次性密码本加密在满足特定条件下是无法破解的。在实际应用中,需要根据具体情况选择合适的加密方式。
graph TD;
A[开始] --> B[卡西斯基试验确定可能密钥长度];
B --> C{是否为静默模式};
C -- 否 --> D[打印可能的密钥长度];
C -- 是 --> E[不打印信息];
D --> F[遍历可能的密钥长度];
E --> F;
F --> G[尝试破解];
G --> H{是否破解成功};
H -- 是 --> I[返回破解后的消息];
H -- 否 --> J[暴力破解所有密钥长度];
J --> K{是否破解成功};
K -- 是 --> I;
K -- 否 --> L[返回None];
graph TD;
A[开始] --> B[检查密钥是否满足条件];
B --> C{是否满足条件};
C -- 是 --> D[加密消息无法破解];
C -- 否 --> E[加密消息可能被破解];
D --> F[使用一次性密码本加密];
E --> G[不使用一次性密码本加密];
维吉尼亚密码破解与一次性密码本加密(续)
维吉尼亚密码破解的实践问题
在实际操作维吉尼亚密码破解程序时,会遇到一些问题,下面对相关实践问题进行解答。
常见问题解答
-
什么是字典攻击?
字典攻击是一种密码破解方法,它使用预先收集的单词、短语或常见密码组合成的字典,尝试用这些字典中的内容作为密钥来解密加密信息。 -
对密文进行卡西斯基试验能揭示什么?
卡西斯基试验能够揭示密文加密密钥的可能长度。通过分析密文中重复出现的片段,找出它们之间的间隔,从而推测出密钥的长度。 -
使用
set()函数将列表值转换为集合值时会发生哪两个变化?- 去除列表中的重复元素,因为集合中不允许有重复的元素。
- 集合是无序的,转换后元素的顺序可能会改变。
-
如果
spam变量包含['cat', 'dog', 'mouse', 'dog'],这个列表有四个元素。那么list(set(spam))返回的列表有多少个元素?
set(spam)会去除列表中的重复元素,得到{'cat', 'dog', 'mouse'},再将其转换为列表list(set(spam)),结果为['cat', 'dog', 'mouse'],有三个元素。 - 以下代码会打印什么内容?
print('Hello', end='')
print('World')
代码会打印
HelloWorld
。因为
print('Hello', end='')
中的
end=''
参数指定了打印结束时不换行,所以紧接着打印
World
时会和
Hello
连在一起。
一次性密码本加密的实际应用考虑
虽然一次性密码本加密在理论上是无法破解的,但在实际应用中,需要考虑诸多因素。
一次性密码本的使用流程
-
生成密钥
:使用
secrets模块生成与消息长度相同的真正随机密钥。例如,要加密 55 个字符的消息,就生成 55 个字符的密钥。
import secrets
otp = ''
for i in range(55):
otp += secrets.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
- 共享密钥 :通常,大量的一次性密码本密钥会被生成并亲自共享,且密钥会标记特定日期。例如,如果在 10 月 31 日收到来自合作伙伴的消息,就从密钥列表中找到对应那天的密钥。
- 加密消息 :使用生成的密钥对消息进行加密,加密方式与维吉尼亚密码相同。
- 使用后销毁 :使用完一个密钥后,应立即销毁,确保不会再次使用。
一次性密码本加密的优缺点
| 优点 | 缺点 |
|---|---|
| 理论上无法破解,即使拥有无限的计算能力也不能破解加密信息。 | 密钥管理困难,需要大量的密钥,且密钥的生成、存储和共享都需要安全可靠的方式。 |
| 加密过程相对简单,基于维吉尼亚密码实现,无需编写新的程序。 | 使用不便,每次加密都需要使用新的密钥,且密钥长度与消息长度相同。 |
加密方式的选择建议
在选择加密方式时,需要综合考虑安全性、效率和实际需求等因素。以下是一个简单的决策流程:
graph TD;
A[开始] --> B{对安全性要求高吗};
B -- 是 --> C{消息长度固定且可管理吗};
C -- 是 --> D{能妥善管理密钥吗};
D -- 是 --> E[选择一次性密码本加密];
D -- 否 --> F[选择其他加密方式];
C -- 否 --> F;
B -- 否 --> G{对效率要求高吗};
G -- 是 --> H[选择相对简单的加密方式];
G -- 否 --> I[选择安全性适中的加密方式];
综上所述,维吉尼亚密码破解程序为我们提供了一种尝试破解加密消息的方法,但在面对一次性密码本加密时会失效。一次性密码本加密虽然具有极高的安全性,但在实际应用中存在诸多限制。在实际使用中,我们需要根据具体情况权衡利弊,选择最合适的加密方式。
超级会员免费看

被折叠的 条评论
为什么被折叠?



