信息安全实验:代换密码的密码分析

一、实验目的
实现对1-1字母代换密码的密码分析

二、实验内容
密文信息:
AHNFCROACOAHNISEFLCIASFVCNWOSEAHNWSRLDWCAHCEIRNTONDATRCFFOSEOANNLTEDTLUMCEUMFRSMAHNNUITETDTTEDJTPTEAHNUOWCNLDOCAOATRCFFBTASETGTCEOACAOARTDCACSETLTLLCNOTAAHNOTMNACMNCACODNMTEDCEGAHTATFRCITEISUEARCNOOUIHTORWTEDTTEDUGTEDTRNMSVNCMPSRAATRCFFOSEONISEDHTEDILSAHNOFRSMAHNUOAHTAVCNWSEAHNWSRLDCOKESWETOTMNRCITFCROATEDCAMNTEOAHTATEYSENONNETOHTVCEGMSVNDTMNRCITOIHNNONBNCATETLLYSRESACOPUECOHNDBYISEARTOAIHCETONNOCAORNLTACSEOWCAHAHNWSRLDTOBTONDSEMUAUTLRNOPNIAFTCRENOOJUOACINTEDWCEWCEISSPNRTACSETEDTCMOASOTFNGUTRDWSRLDPNTINTEDPRSMSANISMMSEDNVNLSPMNEACACOWCLLCEGASWSRKWCAHAHNRNOASFAHNWSRLDASMTKNAHNCEANRETACSETLGSVNRETEINOYOANMFTCRNRTEDMSRNRNTOSETBLNTEDBUCLDTENWAYPNSFCEANRETACSETLRNLTACSEOTEDTISMMUECAYWCAHTOHTRNDFUAURNFSRMTEKCED

三、实验原理
1-1代换密码不改变字母频率的分布特性.

四、实验步骤

  1. 尝试使用穷举法获得明文, 程序a:字母代换程序
  2. 程序实现统计密文中的英文字母频率 程序b:字母统计程序
  3. 根据统计结果和常用字母频率表, 假设字母代换的规则(1-1代换),用密文来验证假设的正确与否,若不成立,则继续假设,一直到找到明文为止。 程序a:字母代换程序
  4. 给出明文及密钥(字母代换规则表)

五、实验过程

ngram_score.py:

from math import log10
class ngram_score(object):
    def __init__(self,ngramfile,sep=' '):
        ''' load a file containing ngrams and counts, calculate log probabilities '''
        self.ngrams = {}
        for line in file(ngramfile):
            key,count = line.split(sep) 
            self.ngrams[key] = int(count)
        self.L = len(key)
        self.N = sum(self.ngrams.itervalues())
        #calculate log probabilities
        for key in self.ngrams.keys():
            self.ngrams[key] = log10(float(self.ngrams[key])/self.N)
        self.floor = log10(0.01/self.N)
    def score(self,text):
        ''' compute the score of text '''
        score = 0
        ngrams = self.ngrams.__getitem__
        for i in xrange(len(text)-self.L+1):
            if text[i:i+self.L] in self.ngrams: score += ngrams(text[i:i+self.L])
            else: score += self.floor          
        return score

main.py:

import random   
from ngram_score import ngram_score
#参数初始化
ciphertext = 'AHNFCROACOAHNISEFLCIASFVCNWOSEAHNWSRLDWCAHCEIRNTONDATRCFFOSEOANNLTEDTLUMCEUMFRSMAHNNUITETDTTEDJTPTEAHNUOWCNLDOCAOATRCFFBTASETGTCEOACAOARTDCACSETLTLLCNOTAAHNOTMNACMNCACODNMTEDCEGAHTATFRCITEISUEARCNOOUIHTORWTEDTTEDUGTEDTRNMSVNCMPSRAATRCFFOSEONISEDHTEDILSAHNOFRSMAHNUOAHTAVCNWSEAHNWSRLDCOKESWETOTMNRCITFCROATEDCAMNTEOAHTATEYSENONNETOHTVCEGMSVNDTMNRCITOIHNNONBNCATETLLYSRESACOPUECOHNDBYISEARTOAIHCETONNOCAORNLTACSEOWCAHAHNWSRLDTOBTONDSEMUAUTLRNOPNIAFTCRENOOJUOACINTEDWCEWCEISSPNRTACSETEDTCMOASOTFNGUTRDWSRLDPNTINTEDPRSMSANISMMSEDNVNLSPMNEACACOWCLLCEGASWSRKWCAHAHNRNOASFAHNWSRLDASMTKNAHNCEANRETACSETLGSVNRETEINOYOANMFTCRNRTEDMSRNRNTOSETBLNTEDBUCLDTENWAYPNSFCEANRETACSETLRNLTACSEOTEDTISMMUECAYWCAHTOHTRNDFUAURNFSRMTEKCED' 
parentkey = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
#只是用来声明key是个字典
key = {'A':'A'}
#读取quadgram statistics
fitness = ngram_score('quadgrams.txt')
parentscore = -99e9
maxscore = -99e9
j = 0 
print('---------------------------start---------------------------')
while 1: 
  j = j+1  
#随机打乱key中的元素  
random.shuffle(parentkey)  
#将密钥做成字典  
for i in range(len(parentkey)):    
   key[parentkey[i]] = chr(ord('A')+i)    
#用字典一一映射解密  
decipher = ciphertext  
for i in range(len(decipher)):    
   decipher = decipher[:i] + key[decipher[i]] + decipher[i+1:]  
parentscore = fitness.score(decipher)
#计算适应度  
##在当前密钥下随机交换两个密钥的元素从而寻找是否有更优的解  
count = 0  
while count < 1000:    
    a = random.randint(0,25)    
b = random.randint(0,25)    
#随机交换父密钥中的两个元素生成子密钥,并用其进行解密    
child = parentkey[:]    
child[a],child[b] = child[b],child[a]    
childkey = {'A':'A'}    
for i in range(len(child)):      
    childkey[child[i]] = chr(ord('A')+i)    
decipher = ciphertext    
for i in range(len(decipher)):      
    decipher = decipher[:i] + childkey[decipher[i]] + decipher[i+1:]    
score = fitness.score(decipher)   
#此子密钥代替其对应的父密钥,提高明文适应度    
if score > parentscore:      
    parentscore = score      
parentkey = child[:]      
count = 0    
count = count+1  
#输出该key和明文  
if parentscore > maxscore:   
    maxscore = parentscore    
maxkey = parentkey[:]    
for i in range(len(maxkey)):      
    key[maxkey[i]] = chr(ord('A')+i)    
decipher = ciphertext    
for i in range(len(decipher)):      
    decipher = decipher[:i] + key[decipher[i]] + decipher[i+1:]     
print ('Currrent key: '+''.join(maxkey))    
print ('Iteration total:', j)    
print ('Plaintext: ', decipher)

明文:在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值