在密码学中,恺撒密码(或称恺撒加密、恺撒变换、变换加密)是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
恺撒密码的加密、解密方法还能够通过同余的数学方法进行计算。首先将字母用数字代替,A=0,B=1,...,Z=25。此时偏移量为n的加密方法即为: E(x) = (x + n) mod 26.
解密就是:
D(x) = (x - n) mod 26.
显而易见,一旦确定了某两个字母的对应关系(即n的值),这种移位密码很容易被破解。
因此,为了使密码有更高的安全性,单字母替换密码就出现了。
明码表:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密码表:T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
但是这种加密方式依然可以破解,根据字母使用频度表,分析密文中的字母频率,将其对照即可破解。
不仅如此,凯撒加密对加密数据也是有要求的,一般情况下,它只支持对基本的英文字母进行加密,如果对中文等亚太地区的文字进行加密,结果可想而知,你的隐私将毫无保留的出现在众人面前。有人说,我们可以扩展这个算法,使它支持所有的文字,这么做是可行的,如果采用同余式的方式实现,代码几乎不怎么需要改动,只要字符集本身是Unicode就可以了。但是这种加密的安全性很难满足应用的要求。如果采用单字母替换的方式,程序将需要构建两个巨大的字符数组去保存他们的映射关系,而且扩展性也不好,当然也是不可行的。这样看来,凯撒加密岂不是一无是处了,其实对于一般的应用,凯撒加密还是足以应付的,只要我们对它稍作改进。
在电脑的应用中,每一个人都要与密码打交道,以此作为保护重要文件、信息的“防护盾”。不可否认的是,在为文件、银行账户、邮箱、聊天工具等添加密码时,倘若所输密码过于简单,那么就会存在被破解的可能性。因此,自己所打造的密码必须变得更“强壮”,如此才能增加安全系数,让文件及隐秘信息变得更为安全。测试出来的密码强度共分为Weak、Medium、Strong、BEST四个等级,其中Weak表示密码强度最差、Medium次之、Strong代表密码强度较好、BEST表示密码强度最高。根据这些测试出来的不同结果,我们便可以从中了解到自己所用密码的强度,以降低被暴力破解的概率。根据微软对于密码安全性的定义,建议大家组成密码的字符最好在8位以上且字符不应重复,字符内容应包含大写字母、小写字母、数字、符号(如#、空格等)。不过,在此需要提醒大家:即便拥有最“强壮”的密码也不能高枕无忧。在电脑操作的过程中,我们一定要保持良好的操作习惯,并提高安全防范意识,如此一来才能尽力确保密码的安全。
简单的说,就是位移加密。
比如你的密码是ABCDE
然后设置凯撒密码的偏移量为3的话
那加密之后的密码就是DEFGH
我觉得创建26个文件实在太冗杂了。其实一个就够了,因为随着你的选择的改变(比如以9为加密条件,所有字母循环后移9位),目标文件里面的内容就自动更新了。
当然你也可以使用函数 int create(char *filename , int mode) 在执行框里手动输入像 e:\\original.txt 这样的地址字符,但你想象一下,这是不是很麻烦?
在实际加密中,可使用随机函数 rand()产生循环后移位数,而且完全可以不限制在26位,扩展ASCII码可以产生成千上万的字符,将文件加密到那些几乎无规律,难以识别的字符上,安全性就提高了许多。当然还有什么多轮加密之类的。可以自己慢慢摸索,挺有趣的。祝你好运!
修改如下(已成功执行):
#includestdio.h
#includestdlib.h
char encrypt(char ch,int n)/*加密函数,把字符向右循环移位n*/
{
while(ch='A'ch='Z')
{
return ('A'+(ch-'A'+n)%26);
}
while(ch='a'ch='z')
{
return ('a'+(ch-'a'+n)%26);
}
return ch;
}
void main()
{
FILE *in,*out;
char ch1,ch2;
int i;
printf("Please input the number(1~26) you want to use for encrypt:");
scanf("%d",i);
if((in=fopen("e:\\original.txt","r"))==NULL) /*文件名根据自己建立的位置修改,
我建在e盘的根目录下
{
printf("Can not open this file!\n");
exit(0);
}
if((out=fopen("e:\\encrypt.txt","w"))==NULL) //同上
{
printf("Can not open this file!\n");
exit(0);
}
while(!feof(in)){
if((ch1=fgetc(in))!=EOF)
ch2=encrypt(ch1,i);
fputc(ch2,out);
}
printf("Encrypt is over!\n");
fclose(in);
fclose(out);
}
目前密码管理遇到的问题
密码被盗主要有几种情况:
1、 暴力破解、弱口令破解
2、心理、社会工程学猜解欺骗窥视
3、键盘记录、钓鱼网站等
4、多个网站通用一个密码,一个网站被黑客破解全部玩完
复杂的密码可以有效应对第一种情况,相对有效应对第二种情况,对第三种情况就是白搭。
对于第一种情况,只要够长(比如超过12位),暴力破解的难度就大的许多。
对于第二种情况,密码够长也可以极大增加难度。
对于第三种情况,只能认栽。
对于第四种情况,一个网站被攻破其他网站全部泄露,最近的jd用户信息泄露、优酷账号密码泄露等都是血淋淋的教训
所以尽量在设置不同平台密码是尽量不设置成一样。密码分级管理
第一级,绝密,银行帐号,支付宝帐号,社交网站帐号等。
第二级,机密,什么云同步啊,云笔记啊,购物网站等。
第三级,秘密,什么各种论坛啊,各种普通网站等。
2、一般人设置密码的套路分析:
使用QQ号、电话号码、银行卡号、电话卡号码、身份证等号码的前几位或者后几位加姓名、生日或者特殊符号作为密码。
使用长字段,只要长度达到一定程度,就算1234567890hahaha1234567890zuodasi1234567890这种密码也不怕被暴力破解,而输入1234567890就像解锁iPad一样只要半秒钟。
联想记忆法,唐诗记忆法、化学式记忆法、密码表记忆法….谈这个,就不得不谈当年程序员网站CSDN 600万密码被拖库后流传出来的神极密码:
『ppnn13%dkstFeb.1st』——娉娉袅袅十三余 豆蔻梢头二月初
Tree_0f0=sprintf(“2_Bird_ff0/a”) ——两个黄鹂鸣翠柳就等于
csbt34.ydhl12s——池上碧苔三四点,叶底黄鹂一两声可写成
for_n(@RenSheng)_n+=”die” ——人生自古谁无死就是
while(1)Ape1CryApe2Cry——两岸猿声啼不住
对于第一种情况,这种密码是使用的最多,也是最好破解的。互联网上一个人的基本信息只值几分钱,破解密码的难度就是随机组合这些信息(去百度搜索下随便下载一个已经被攻破的密码库,看看他们都是什么样的密码就知道,其实每个人设置密码的思路都相差无几)。
对于第二种情况,密码够长也可以极大增加难度。但如何让自己大脑记着这种长密码是一个不小的问题。
对于第三种情况,联想记忆创造的密码是一定的生成规则的,这种密码也是相对难破解,同时也相对容易记忆;但实施起来有一定的难度,当密码设置完成后,一个星期后使用是否能记起来一个化学式、一句唐诗、一个密码表对应的规则也是一个问题。
下面是对目前市场上看见的密码管理工具的分析:
通过上面分析,可得到:
想使用免费的:
KeePass是不错的选择,密码
软件加密存储本地,代码开源扩展应用多。
想最简单好用:
Dashlane是最好的选择,多
端云同步,加强大的代填功能。
想做到极致安全:
极密盾K2是不错的选择,数据通过加密芯片加密存在极密盾设备中。从录入到使用,密码数据全部脱离客户端,永不出盾。
想使用付费又好用:
1password是不错的选择,用户口碑好,数据存本地,可自定义云同步,加强大的代填功能。
世界上最早的一种密码产生于公元前两世纪。是由一位希腊人提出的,人们称之为
棋盘密码,原因为该密码将26个字母放在5×5的方格里,i,j放在一个格子里,具体情
况如下表所示
1 2 3 4 5
1 a b c d e
2 f g h i,j k
3 l m n o p
4 q r s t u
5 v w x y z
这样,每个字母就对应了由两个数构成的字符αβ,α是该字母所在行的标号,β是列
标号。如c对应13,s对应43等。如果接收到密文为
43 15 13 45 42 15 32 15 43 43 11 22 15
则对应的明文即为secure message。
另一种具有代表性的密码是凯撒密码。它是将英文字母向前推移k位。如k=5,则密
文字母与明文与如下对应关系
a b c d e f g h i j k l m n o p q r s t u v w x y z
F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
于是对应于明文secure message,可得密文为XJHZWJRJXXFLJ。此时,k就是密钥。为了
传送方便,可以将26个字母一一对应于从0到25的26个整数。如a对1,b对2,……,y对
25,z对0。这样凯撒加密变换实际就是一个同余式
c≡m+k mod 26
其中m是明文字母对应的数,c是与明文对应的密文的数。
随后,为了提高凯撒密码的安全性,人们对凯撒密码进行了改进。选取k,b作为两
个参数,其中要求k与26互素,明文与密文的对应规则为
c≡km+b mod 26
可以看出,k=1就是前面提到的凯撒密码。于是这种加密变换是凯撒野加密变换的
推广,并且其保密程度也比凯撒密码高。
以上介绍的密码体制都属于单表置换。意思是一个明文字母对应的密文字母是确定
的。根据这个特点,利用频率分析可以对这样的密码体制进行有效的攻击。方法是在大
量的书籍、报刊和文章中,统计各个字母出现的频率。例如,e出现的次数最多,其次
是t,a,o,I等等。破译者通过对密文中各字母出现频率的分析,结合自然语言的字母频
率特征,就可以将该密码体制破译。
鉴于单表置换密码体制具有这样的攻击弱点,人们自然就会想办法对其进行改进,
来弥补这个弱点,增加抗攻击能力。法国密码学家维吉尼亚于1586年提出一个种多表式
密码,即一个明文字母可以表示成多个密文字母。其原理是这样的:给出密钥
K=k[1]k[2]…k[n],若明文为M=m[1]m[2]…m[n],则对应的密文为C=c[1]c[2]…c[n]。
其中C[i]=(m[i]+k[i]) mod 26。例如,若明文M为data security,密钥k=best,将明
文分解为长为4的序列data security,对每4个字母,用k=best加密后得密文为
C=EELT TIUN SMLR
从中可以看出,当K为一个字母时,就是凯撒密码。而且容易看出,K越长,保密程
度就越高。显然这样的密码体制比单表置换密码体制具有更强的抗攻击能力,而且其加
密、解密均可用所谓的维吉尼亚方阵来进行,从而在操作上简单易行。该密码可用所谓
的维吉尼亚方阵来进行,从而在操作上简单易行。该密码曾被认为是三百年内破译不了
的密码,因而这种密码在今天仍被使用着。
古典密码的发展已有悠久的历史了。尽管这些密码大都比较简单,但它在今天仍有
其参考价值。