论坛: 编程破解 标题: 凯撒密文的破解编程实现 复制本贴地址    
作者: zhangyun [zhangyun]    论坛用户   登录
近来安全的发展,对密码学的研究越来越重要,虽然我们现在大多采用的是
非对称密码体制,但是同时由于处理及其它的一些重要原因,对传统密码仍然
是在大量的使用,如移位,替代的基本思想仍然没有改变,我个人认为,将来
的很长时间内,我们必将会花大量的时间对密码学进行研究,从而才能促进我
们的电子政务,电子商务的健康发展,下面我要谈的是对一个古典密码-----
凯撒(kaiser)密码的的解密,也就是找出它的加密密钥,从而进行解密,由于
它是一种对称密码体制,加解密的密钥是一样的,下边简单说明一下加解密
加密过程:
        密文:C=M+K  (mod 26)
解密过程:
        明文:M=C-K  (mod 26)
详细过程请参考相关资料
破解时主要利用了概率统计的特性,E字母出现的概率最大。

加密的程序实现我就不说了,
下面重点说一下解密的程序实现:我是用C写的,在VC6.0下调试运行正确



#include"stdio.h"
#include"ctype.h"
#include"stdlib.h"


main(int argc ,char *argv[])
{

FILE *fp_ciper,*fp_plain;                  //密文与明文的文件指针
char ch_ciper,ch_plain;
int i,temp=0;                              //i用来存最多次数的下标
                                            //temp用在求最多次数时用
int key;                                    //密钥
int j;
int num[26];                                //保存密文中字母出现次数

for(i = 0;i < 26; i++)
    num[i] = 0;                            //进行对num[]数组的初始化

printf("======================================================\n");
printf("------------------BY 安美洪 design--------------------\n");
printf("======================================================\n");

if(argc!=3)
{
    printf("此为KAISER解密用法:[文件名] [密文路径] [明文路径]\n");
    printf("如:decryption F:\ciper_2_1.txt F:\plain.txt\n");
}                                        //判断程序输入参数是否正确


if((fp_ciper=fopen(argv[1],"r"))==NULL)
{
    printf("打开密文出错!解密失败\n");
    exit(0);
}
while((ch_ciper=fgetc(fp_ciper))!=EOF)
switch(ch_ciper)

    case "A":num[0]=num[0]+1;  break;    //统计密文各字母出现次数
    case "B":num[1]=num[1]+1;  break;    //与上同,下边一样
    case "C":num[2]=num[2]+1;  break;
    case "D":num[3]=num[3]+1;  break;
    case "E":num[4]=num[4]+1;  break;
    case "F":num[5]=num[5]+1;  break;
    case "G":num[6]=num[6]+1;  break;
    case "H":num[7]=num[7]+1;  break;
    case "I":num[8]=num[8]+1;  break;
    case "J":num[9]=num[9]+1;  break;
    case "K":num[10]=num[10]+1;break;
    case "L":num[11]=num[11]+1;break;
    case "M":num[12]=num[12]+1;break;
    case "N":num[13]=num[13]+1;break;
    case "0":num[14]=num[14]+1;break;
    case "P":num[15]=num[15]+1;break;
    case "Q":num[16]=num[16]+1;break;
    case "R":num[17]=num[17]+1;break;
    case "S":num[18]=num[18]+1;break;
    case "T":num[19]=num[19]+1;break;
    case "U":num[20]=num[20]+1;break;
    case "V":num[21]=num[21]+1;break;
    case "W":num[22]=num[22]+1;break;
    case "X":num[23]=num[23]+1;break;
    case "Y":num[24]=num[24]+1;break;
    case "Z":num[25]=num[25]+1;break;
     
}
fclose(fp_ciper);

for(i=0;i<26;i++)
    if(num[i]>temp)
    {
        j=i;                              // 求出最大次数的下下标 
        temp=num[i];     
    }
if(j<5)
      key=(j+1+26)-5;                      //是按字母表的第几位计算
                                            //而不是按下标,故加1
                                            //5是指E在字母表中的位序
else
      key=(j+1)-5;


if((fp_ciper=fopen(argv[1],"r"))==NULL)
{
    printf("再次打开密文出错!解密失败\n");
    exit(0);
}                                        //再次打开密文,进行解密
if((fp_plain=fopen(argv[2],"w"))==NULL)
{
    printf("打开或建立明文文件出错!解密失败\n");
    exit(0);
}                                        //把明文存到此文件
while((ch_ciper=fgetc(fp_ciper))!=EOF)
{
if(ch_ciper > "E")
ch_plain=(((ch_ciper-"A"-key)%26)+"A");    //解密
else
ch_plain=(((ch_ciper-"A"-key+26)%26)+"A"); //解密
ch_plain=tolower(ch_plain);                //把大写明文转化为小写
fputc(ch_plain,fp_plain);                  //把明文写到文件文件plain
}
fclose(fp_ciper);
fclose(fp_plain);
printf("解密成功,密钥KEY=%d,明文已保存到文件中,谢谢使用!\n",key);
}





地主 发表时间: 04-09-26 04:47

回复: gueiji [gueiji]   论坛用户   登录
没事干,跑这里来罐一下水


B1层 发表时间: 04-09-26 11:37

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号