维吉尼亚密码

维吉尼亚密码
维吉尼亚密码

《网络与信息安全》课程设计报告

目录

一、密码分析及密码系统设计原则 (2)

二、维吉尼亚密码 (3)

(一)维吉尼亚密码的介绍 (3)

(二)维吉尼亚密码的原理 (4)

(三)维吉尼亚密码-特点 (5)

(四)维吉尼亚密码的演变 (7)

(五)维吉尼亚密码下的扩展 (7)

三、界面的设计 (15)

(一)软件启动封面设计- (16)

(二)软件框架设计 (16)

(三)软件按钮设计 (16)

(四)菜单设计 (16)

(五)标签设计 (17)

(六)图标设计 (17)

(七)滚动条及状态栏设计 (17)

(八)安装过程设计 (17)

(九)包装及商品化 (17)

四、加密的意义 (18)

总结 (18)

致谢词 (19)

参考文献 (19)

摘要

使用维吉尼亚密码加密只是众多密码加密方法中的一个,本设计是基于维吉尼亚密码的一种扩展,能起到更强的加密,完成所有属于ACSII的加密,本人主要负责设计的规划,程序设计,界面设计,报告的完成等工作,整个程序是Java平台下实现的。本次设计方法的原理以及方法仍然以维吉尼亚通用的方法来介绍。

关键词:维吉尼亚加密,密钥,加密,解密。

一、密码分析及密码系统设计原则

对通信双方而言,通信的一方将信息加密后发送给另一方,是为了使攻击者即使得到密文也无法读懂。对于攻击者来说,在不知道密钥的情况下,要想读懂密文,就要根据他的知识以及掌握的情报来进行密码分析。

密码分析是研究密钥未知的情况下恢复明文的科学。通常假设攻击者知道正在使用的密码体制,当然,如果分析者不知道正在使用的密码体制,分析起来将更加困难。成功的密码分析可能直接恢复明文或密钥,也可能找出保密系统的弱点来恢复明文或密钥。根据攻击者具有的知识和掌握的情报,可以将密码分析分为以下几种类型:

(1)只有密文的攻击。攻击者有一些密文,它们是使用同一加密算法和同一密钥加密的。(2)已知明文的攻击。攻击者不仅得到一些密文,而且能得到这些密文对应的明文。

(3)选择明文的攻击。攻击者不仅得到一些密文和对应明文,而且能选择用于加密的明文。(4)选择密文的攻击。攻击者可以选择不同的密文来解密,并能得到解密后的明文。

在每种情况下,攻击者的目标是确定正在使用的密钥或待破译密文所对应的明文。上述几种攻击方式是以强度递增排列的,只有密文的攻击是最容易防护的攻击。然而,目前最常见的是已知明文和选择明文的攻击。事实上,攻击者欲得到一些明、密文对或加密一些选择好的明文并不困难,攻击者可以知道很多信息具有标准的头部和尾部。一般来说,密码系统应该经得起已知明文的攻击。

密码系统的安全依赖于破译该系统的困难程度。如果破译一个密码系统的费用超过了被加密数据本身的价值,或者破译所需的时间超过了被加密数据所需保密的时间,或者由一个密码系统加密的数据少于破译该算法所需的数据量,就可以认为这个系统是安全的。

如果攻击者无论得到多少密文,都没有足够的信息去恢复明文,那么该密码系统就是无条件安全的。在理论上,只有一次一密的系统才能真正实现这一点。除此之外的系统都至少可以使用

只有密文的攻击来破译。

设计密码系统必须至少满足下面的一个准则:

(1)破译该密码的成本超过被加密信息的价值;

(2)破译该密码的时间超过被加密信息的生命周期。

如果一个密码系统能够满足上述准则,就认为该系统在计算上是安全的。然而困难之处就在于难以估计成功破译密码的努力有多大。只能使设计的密码系统抗击已知的攻击,尤其要能抗击穷举密钥攻击,即强力攻击。

穷举密钥攻击方法是对截获的密文用所有可能的密钥解密,直到得到有意义的明文为止。从理论上来说,除了一次一密密码系统,其它任何密码系统都可以用穷举密钥攻击法破解,但实际上,任何一个实用的密码设计都会使这一方法在计算上失去可行性。

密码分析方法可以分为确定性和统计性两类。确定性分析法是利用若干已知数学关系式表示出所求的未知量,这种关系式是从加密和解密算法得来的;统计分析法则是利用明文的已知统计规律进行破译的方法。例如经典密码分析的许多技术利用了英文语言的统计特性。通过分析英文字母中单字母、双字母、三字母组合出现的频率并通过猜词法达到破译密码的目的。

二、维吉尼亚密码

(一)维吉尼亚密码的介绍

维吉尼亚密码多表代换密码中最著名的一种,这是以移位代换为基础的周期代换密码,m个移位代换表由m个字母组成的密钥字确定(这里假设密钥学中的M个字母不同,如果有相同的,则代换表的个数是密钥字中不同字母的个数)

如果密钥字为deceptive,

明文we are discovered save youselelf被加密为:

明文:wearediscoverdsaveyouselelf

密钥:deceptivedeceptivedeceptive

其中,密钥字母a,b,c…y,z对应数字0,1,2…24,25。密钥字母d对应数字3,因此明文字母W在密钥字母d的作用下向后移位3,得到密文字母Z。

例子:q=26, 明文x=polyalphabetic cipher,

K=radio

明文x=p o l y a l p h a b e t i c c i p h e r

密钥k=r a d i o r a d i o r a d i o r a d i o

密文y=g o o g o c p k t p n t l k q z p k m f

解密时,密文字母在密钥字母的作用下向前移位。

用算法表示:

加密:C=(m+k)mod26

解密:m=(c-k)mod26

设d为一固定的正整数,d个移位代换表π=(π1 ,π2 ,… πd) ,由密钥序列K=( k1,k2,…,kd)给定,第i+td个明文字母由表πi决定,即密钥ki决定

ek(xi+td)=(xi+td+ki)mod q =y

dk(yi+td)=(yi+td-ki)mod q =x

(二)维吉尼亚密码的原理

比如明文为JACKOZOO, 秘匙为LOVE, 则我们的密文是这样得到的:

J对应的密文我们查秘匙为L, 则在第L行中, 找到与第一行中的J对应的字母为U.

A对应的密文我们查秘匙为O, 则在第O行中, 找到与第一行中的A对应的字母为O.

C对应的密文我们查秘匙为V, 则在第V行中, 找到与第一行中的C对应的字母为X.

K对应的密文我们查秘匙为E, 则在第E行中, 找到与第一行中的K对应的字母为O.

O对应的密文我们查秘匙为L, 则在第L行中, 找到与第一行中的O对应的字母为Z. (如果秘匙不够了,我们就循环使用秘匙, LOVELOVELO ... )

Z对应的密文我们查秘匙为O, 则在第O行中, 找到与第一行中的Z对应的字母为N.

O对应的密文我们查秘匙为V, 则在第V行中, 找到与第一行中的O对应的字母为J.

O对应的密文我们查秘匙为E, 则在第E行中, 找到与第一行中的O对应的字母为S.

由此得到JACKOZOO在以LOVE作为秘匙的情况下, 其密文为: UOXOZNJS.

我们看到维吉尼亚密码也很好地隐藏了字频信息.

但是这里不得不提的是, 维吉尼亚密码(Vigenere Cipher)相对于希尔密码(Hill Cipher)来说, 其对字频信息的隐藏还不够彻底.

这也导致了在19世纪50年代, 英国人查尔斯-巴贝奇对其的破解. 其实其破解的基本思想如下:

比如在密文中, 经常出现了同一个子串(比如UPK), 而且每个字串之间的距离都是3的整数

倍. 那么解密者就很容易推测出秘匙的长度为3. 其原因也是十分简单的:

当秘匙在重复了N次之后, 其还是用第一个字母去加密UPK相应的明文. 尤其是对THE, YOU, WHAT 这类高频词汇当使用了弱秘匙的话,更容易遭受破解. 关于维吉

尼亚密码的具体破解工作, 不在本文范围之内, 有兴趣的朋友可以自行研究.

以上介绍的是维吉尼亚密码的加密, 解密的话, 直接找出相应行在第一行中对应的字母即可密钥的选取

在维吉尼亚密码中,如果密钥的长度是m,明文中的一个字母能够映成这m个可能的字母中的一个,容易看出维吉尼亚密码中长度为m的可能密钥字的个数是26的m次方,甚至对于一个较小的m值,如m=5,密钥空间超过了1.1乘以10的7次方,这个空间已经足已阻止手工穷举密钥的搜索。

为方便记忆,维吉尼亚密码的密钥字常常取于英文中的一个单词,一个句子或一段文章。因此,维吉尼亚密码的明文和密钥字母频率分布相同,仍然能够用统计技术进行分析。要抗击这样的密码分析,只有选择与明文长度相同并与之没有统计关系的密钥内容。1918年美国电报电话公司的G。W。Vernam提出这样的密码系统:明文英文字母编成5比特二元数字,称之为五单元波多代换码,选择随机二元数字流作为密钥,加密通过执行明文和密钥的逐位异或操作,产生密文,可以简单地表示为 Ci=Pi异或Ki

其中,Pi表示明文的第i个二元数字,Ki表示密钥的第i个二元数字,Ci表示密文的第i 个二元数字,解密仅需执行相同的逐位异或操作:

Pi=Ci异或Ki

Vernam密码系统的密钥若不重复使用,就能得到一次一密码。若密钥有重复,尽管使用长密钥增加了密码分析的难度,但只要有了足够的密文,使用已知的或可能的明文序列,或二者相结合也能够破译。

在维吉尼亚密码中,明文中的字符映射到密文空间的字符不但依赖于明文字符,还依赖于它在上下文中的位置。但是在密文中依然保留了字符频率。根据某些统计信息破译该密码的关键是判断密钥的长度,即代换表的周期。

(三)维吉尼亚密码-特点

人们在单一恺撒密码的基础上扩展出多表密码,称为“维吉尼亚”密码。它是由16世纪法国亨利三世王朝的布莱瑟·维吉尼亚发明的,其特点是将26个恺撒密表合成一个,见下表:

A B C D F G H I J K L M N O P Q R S T U V W X Y Z

A 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

B 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 A

C C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z A B

D D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z A B C

E E

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

F 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

G 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 F

H H I J K L M N O P Q R S T U V W X Y Z A B C D E F G

I I J K L M N O P Q R S T U V W X Y Z A B C D E F G H

J J K L M N O P Q R S T U V W X Y Z A B C D E F G H I

K K L M N O P Q R S T U V W X Y Z A B C D E F G H I J

L L M N O P Q R S T U V W X Y Z A B C D E F G H I J K

M M N O P Q R S T U V W X Y Z A B C D E F G H I J K L

N N O P Q R S T U V W X Y Z A B C D E F G H I J K L M

O O P Q R S T U V W X Y Z A B C D E F G H I J K L M N

P P Q R S T U V W X Y Z A B C D E F G H I J K L M N O

Q Q R S T U V W X Y Z A B C D E F G H I J K L M N O P

R R S T U V W X Y Z A B C D E F G H I J K L M N O P Q

S S 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

T 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

U 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 T

V V W X Y Z A B C D E F G H I J K L M N O P Q R S T U

W W X Y Z A B C D E F G H I J K L M N O P Q R S T U V

X X Y Z A B C D E F G H I J K L M N O P Q R S T U V W

Y Y Z A B C D E F G H I J K L M N O P Q R S T U V W X

Z Z 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

密钥

维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密:

TO BE OR NOT TO BE THAT IS THE QUESTION

当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:

密钥:RELAT IONSR ELATI ONSRE LATIO NSREL

明文:TOBEO RNOTT OBETH ATIST HEQUE STION

密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY

(四)维吉尼亚密码的演变

历史上以维吉尼亚密表为基础又演变出很多种加密方法,其基本元素无非是密表与密钥,并一直沿用到二战以后的初级电子密码机上。

公元16世纪晚期,想要获得更高的保密度的人获得了一种设计更加精细的密码表。法国外交家BlaisedeVigenère发明了一种方法来对同一条信息中的不同字母用不同的密码进行加密。这样,同样的E在一个位置可能被M所取代,而在另一个位置的E则有可能以K的面目出现。这样,就可以防止任何人利用频率分析法解密该条信息。

(五)维吉尼亚密码下的扩展

为了能更多的加密字符,本次设计把维吉尼亚密钥个数增加到ASC码中的所有的英文字母大小字符,希望能加密更多的软件,所有的原理和加密方法和维吉尼亚的一样,只是密钥扩展了一下,所用的公式也改变一下,下面提供了,ASC与十进制的对应,在加密的时候能起到一定的帮助作用,此加密功能相当维吉尼亚更具有安全性,对照表如下:

软件和界面组合的程序

package chen;

import java.awt.*;

import javax.swing.*;

import javax.swing.border.TitledBorder;

import java.awt.event.*;

public class Chen extends JFrame implements ActionListener{ /**

*

*/

private static final long serialVersionUID = 1L;

private JLabel ke1=new JLabel(" ");

private JLabel ke2=new JLabel(" ");

private JLabel ke3=new JLabel(" ");

private JLabel ke4=new JLabel(" ");

private JLabel ke5=new JLabel(" ");

private JLabel ke6=new JLabel(" ");

private JLabel mn=new JLabel("输入明文");

private JLabel mo=new JLabel("输入密钥");

private JLabel mt=new JLabel("加密结果");

private JButton ji=new JButton("加密");

private JLabel miWen=new JLabel("输入密文");

private JLabel miYao2=new JLabel("输入密钥");

private JLabel mingWenoutput=new JLabel("解密结果");

private JButton jiemi=new JButton("解密");

private JTextArea textOne=new JTextArea(1,2);

private JTextArea textTwo=new JTextArea(1,2);

private JTextArea textThree=new JTextArea(1,2);

private JTextArea t4=new JTextArea(1,2);

private JTextArea textFive=new JTextArea(1,2);

private JTextArea textSix=new JTextArea(1,2);

int i;

char[] c=new char[100];

char[] k1=new char[100];

int j;

char[] m=new char[100];

char[] k12=new char[100];

public Chen(){

super("维吉尼亚");

ji.addActionListener(this);

jiemi.addActionListener(this);

addWindowListener(listen);

pack();

setVisible(true);

setSize(400,330);

}

public void set(){

JPanel mingwenInput=new JPanel();

mingwenInput.setLayout(new BorderLayout());

mingwenInput.add("West",mn);mingwenInput.add("Center",textOne); mingwenInput.add("East",ke1);

JPanel miyaoInput=new JPanel();

miyaoInput.setLayout(new BorderLayout());

miyaoInput.add("West",mo);miyaoInput.add("Center",textTwo);

miyaoInput.add("East",ke2);

JPanel miwenOutput=new JPanel();

miwenOutput.setLayout(new BorderLayout());

miwenOutput.add("West",mt);

miwenOutput.add("Center",textThree);

miwenOutput.add("East",ke3);

JPanel shangzhong=new JPanel();

GridLayout s=new GridLayout (3,1);

s.setVgap(5);

shangzhong.setBackground(Color.gray);

shangzhong.setLayout(s);

shangzhong.add(mingwenInput);shangzhong.add(miyaoInput);

shangzhong.add(miwenOutput);

JPanel buttons=new JPanel();

buttons.setLayout(new BorderLayout());

buttons.add("Center",ji);

JPanel shangmianban=new JPanel();

shangmianban.setLayout(new BorderLayout());

shangmianban.setBackground(Color.green);

shangmianban.add("Center",shangzhong);

shangmianban.add("East",buttons);

JPanel miwenInput=new JPanel();

miwenInput.setLayout(new BorderLayout());

miwenInput.add("West",miWen);miwenInput.add("Center",t4);miwenInput.add("East",ke4) ;

JPanel miyaoxiaInput=new JPanel();

miyaoxiaInput.setLayout(new BorderLayout());

miyaoxiaInput.add("West",miYao2);miyaoxiaInput.add("Center",textFive);

miyaoxiaInput.add("East",ke5);

JPanel mingwenOutput=new JPanel();

mingwenOutput.setLayout(new BorderLayout());

mingwenOutput.add("West",mingWenoutput);mingwenOutput.add("Center",textSix);mingwen Output.add("East",ke6);

JPanel xiazhong=new JPanel();

GridLayout sz=new GridLayout(3,1);

sz.setVgap(5);

shangmianban.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBor der(Color.black,2),

"加密面板",TitledBorder.CENTER,TitledBorder.ABOVE_TOP));

xiazhong.setBackground(Color.LIGHT_GRAY);

xiazhong.setBounds(1, 2, 3, 4);

xiazhong.setLayout(sz);

xiazhong.add("North",miwenInput);xiazhong.add("Center",miyaoxiaInput);xiazhong.add( "South",mingwenOutput);

JPanel button=new JPanel();

button.setLayout(new BorderLayout());

button.add("Center",jiemi);

JPanel xiamianban=new JPanel();

BorderLayout x=new BorderLayout();

x.setVgap(5);

xiamianban.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorde r(Color.MAGENTA,2),

"解密面板",TitledBorder.CENTER,TitledBorder.ABOVE_TOP));

xiamianban.setLayout(x);

xiamianban.add("Center",xiazhong);xiamianban.add("East",button);

xiamianban.setBackground(Color.cyan);

setLayout(new GridLayout(2,1));

add(shangmianban);add(xiamianban);

}

public void actionPerformed(ActionEvent e){

if(e.getSource()==ji){

String m=(String)textOne.getText();

String k=(String)textTwo.getText();

for(i=0;i

if(k.charAt(i)>='a'&&k.charAt(i)<='z')

k1[i]=(char)(k.charAt(i)-97);

if(k.charAt(i)>='A'&&k.charAt(i)<='Z')

k1[i]=(char)(k.charAt(i)-65);

}

for(i=0;i

if(m.charAt(i)>='a'&&m.charAt(i)<='z')

c[i]=(char)((m.charAt(i)-97+k1[i%k.length()])%26+97);

if(m.charAt(i)>='A'&&m.charAt(i)<='Z')

c[i]=(char)((m.charAt(i)-65+k1[i%k.length()])%26+65);

}

textThree.setText( "");

textThree.append(new String(c));

}

else if(e.getSource()==jiemi) {

String c=(String)t4.getText();

String k2=(String)textFive.getText();

for(i=0;i

if(k2.charAt(i)>='a'&&k2.charAt(i)<='z')

k12[i]=(char)(k2.charAt(i)-97);

if(k2.charAt(i)>='A'&&k2.charAt(i)<='Z')

k12[i]=(char)(k2.charAt(i)-65);

}

for(i=0;i

{

if(c.charAt(i)>='a'&&c.charAt(i)<='z')

m[i]=(char)((c.charAt(i)-97-k12[i%k2.length()]+26)%26+97);

if(c.charAt(i)>='A'&&c.charAt(i)<='Z')

m[i]=(char)((c.charAt(i)-65-k12[i%k2.length()]+26)%26+65);

}

textSix.setText("");

textSix.append(new String(m));

}

}

private WindowCloser listen=new WindowCloser();

private class WindowCloser extends WindowAdapter{

public void windowClosing(final WindowEvent we){

dispose();

}

}

public static void main(String[] args) {

Chen chen=new Chen();

chen.set();

}

}

三、界面的设计

界面设计是为了满足软件专业化标准化的需求而产生的对软件的使用界面进行美化优化规范化的设计分支。具体包括软件启动封面设计,软件框架设计,按钮设计,面板设计,菜单设计,

标签设计,图标设计,滚动条及状态栏设计,安装过程设计,包装及商品化在设计的过程中的关键问题。

(一)软件启动封面设计-

应使软件启动封面最终为高清晰度的图像,如软件启动封面需在不同的平台、操作系统上使用将考虑转换不同的格式,并且对选用的色彩不宜超过256色,最好为216色安全色。软件启动封面大小多为主流显示器分辨率的1/6大。如果是系列软件将考虑整体设计的统一和延续性。在上面应该醒目的标注制作或支持的公司标志、产品商标,软件名称,版本号,网址,版权声明,序列号等信息,以树立软件形象,方便使用者或购买者在软件启动的时候得到提示。插图宜使用具有独立版权的,象征性强的,识别性高的,视觉传达效果好的图形,若使用摄影也应该进行数位处理,以形成该软件的个性化特征

(二)软件框架设计

软件的框架设计就复杂得多,因为涉及软件的使用功能,应该对该软件产品的程序和使用比较了解,这就需要设计师有一定的软件跟进经验,能够快速的学习软件产品,并且在和软件产品的程序开发员及程序使用对象进行共同沟通,以设计出友好的,独特的,符合程序开发原则的软件框架。软件框架设计应该简洁明快,尽量少用无谓的装饰,应该考虑节省屏幕空间,各种分辨率的大小,缩放时的状态和原则,并且为将来设计的按钮,菜单,标签,滚动条及状态栏预留位置。设计中将整体色彩组合进行合理搭配,将软件商标放在显著位置,主菜单应放在左边或上边,滚动条放在右边,状态栏放在下边,以符合视觉流程和用户使用心理

(三)软件按钮设计

软件按钮设计应该具有交互性,即应该有3到6种状态效果:点击时状态;鼠标放在上面但未点击的状态;点击前鼠标未放在上面时的状态;点击后鼠标未放在上面时的状态;不能点击时状态;独立自动变化的状态。按钮应具备简洁的图示效果,应能够让使用者产生功能关联反应,群组内按钮应该风格统一,功能差异大的按钮应该有所区别。

软件面板设计应该具有缩放功能,面板应该对功能区间划分清晰,应该和对话框,弹出框等风格匹配,尽量节省空间,切换方便。

(四)菜单设计

菜单设计一般有选中状态和未选中状态,左边应为名称,右边应为快捷键,如果有下级菜单应该有下级箭头符号,不同功能区间应该用线条分割。

(五)标签设计

标签设计应该注意转角部分的变化,状态可参考按钮。

(六)图标设计

图标设计色彩不宜超过64色,大小为16x16、32x32两种,图标设计是方寸艺术,应该加以着重考虑视觉冲击力,它需要在很小的范围表现出软件的内涵,所以很多图标设计师在设计图标时使用简单的颜色,利用眼睛对色彩和网点的空间混合效果,做出了许多精彩图标。(七)滚动条及状态栏设计

滚动条主要是为了对区域性空间的固定大小中内容量的变换进行设计,应该有上下箭头,滚动标等,有些还有翻页标。状态栏是为了对软件当前状态的显示和提示。

(八)安装过程设计

安装过程设计主要是将软件安装的过程进行美化,包括对软件功能进行图示化。(九)包装及商品化

最后软件产品的包装应该考虑保护好软件产品,功能的宣传融合于美观中,可以印刷部分产品介绍,产品界面设计。

软件界面其中的主要部分即为UI

UI(User Interface)即用户界面,也称人机界面。是指用户和某些系统进行交互方法的集合,这些系统不单单指电脑程序,还包括某种特定的机器,设备,复杂的工具等。

软件设计可分为两个部分:编码设计与UI设计。编码设计大家都很熟悉,但是UI设计还是一个很陌生的词,即使一些专门从事网站与多媒体设计的人也不完全理解UI的意思。UI的本意是用户界面,是英文User和interface的缩写。从字面上看是用户与界面2个组成部分,但实际上还包括用户与界面之间的交互关系。

界面设计。在漫长的软件发展中,界面设计工作一直没有被重视起来。做界面设计的人也被贬义的称为“美工”。其实软件界面设计就像工业产品中的工业造型设计一样,是产品的重要买点。一个友好美观的界面会给人带来舒适的视觉享受,拉近人与电脑的距离,为商家创造卖点。界面设计不是单纯的美术绘画,他需要定位使用者、使用环境、使用方式并且为最终用户而设计,是纯粹的科学性的艺术设计。检验一个界面的标准即不是某个项目开发组领导的意见也不是项目成员投票的结果,而是最终用户的感受。所以界面设计要和用户研究紧密结合,是一个不断为最终用户设计满意视觉效果的过程

四、加密的意义

随着计算机联网的逐步实现,计算机信息的保密问题显得越来越重要。数据保密变换,或密码技术,是对计算机信息进行保护的最实用和最可靠的方法。

密码是实现秘密通讯的主要手段,是隐蔽语言、文字、图象的特种符号。凡是用特种符号按照通讯双方约定的方法把电文的原形隐蔽起来,不为第三者所识别的通讯方式称为密码通讯。在计算机通讯中,采用密码技术将信息隐蔽起来,再将隐蔽后的信息传输出去,使信息在传输过程中即使被窃取或载获,窃取者也不能了解信息的内容,从而保证信息传输的安全。所以,加密显得越来越重要,学会做加密软件,是很大的成果,可以用于各个领域.

总结

刚开始老师布置下来课程设计的时候,心里是一头乱麻,毫无头绪,感觉做个软件太难了,但通过一个多周的学习,发现做起来也没有想象中的那么难,首先,想做好这个加密软件,必须要熟练掌握运用相应算法的流程,分析规划整个工程,其次,必须熟练掌握一门语言,最后,把两者结合起来,那么做出一个成功的软件不是难题。

本次设计给我最大的收获是:你学到的东西永远都是有用的,只是有的不是时候,但不会还很多,这个时候不应该抱怨和后悔,而是珍惜现在,抓住机会,学习,我的好多同学其实也有很多知识不太熟悉,但经过努力学习,在短时间内掌握了,在这个学习效率比较高的情况下,学的东西会记得更长久。还有,遇到不懂的,一定要和老师同学交流,知道该去了解哪方面的知识,怎么去做,不要泄气,丢下来不管,没有什么事每个人都会做的,只要学了,努力了,我相信肯定能做好,本次设计给我很大的启发,因为,此次设计,是上大学来,唯一门,综合学科的设计,很能锻炼人。同时本次实验让我看到了自己的不足以及和别人的差距,给我更强的学习动力,我从心里感谢老师这次设计的安排,让我受益匪浅,启发很多,我会付出实际的行动多学知识。

我认为,在这学期的实验中,在收获知识的同时,还收获了阅历,收获了成在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅要面对社会的挑战,只有不断的学习、实践,再学习、再实践

致谢词

在此次课程设计中,由于本人水平有限,对Java深入太浅,好多东西是初次接触,很多关键的问题还多亏老师和同学的指导和帮助,我在此对你们表示崇高的敬意和诚挚的谢意。

参考文献

《密码编码和密码分析:原理与方法》2001-09-01 机械工业出版社

《编码理论(第二版)》2007年9月西安电子科技大学出版社

《密码编码学与网络安全-原理实践(英文版)(第四版)》2006年7月1日电子工业出版社《编码密码学》1992年12月人民邮电出版社

转位式密码与替换式密码

转位式密码与替换式密码 第一节转位式密码 转位式密码就是将明文做移位和重排加密,借由重新安排字母的顺序来隐藏信息,是一种比较简单的加密方式。单纯的转位式密码很容易被破解,因为频率分布与原始文字一样,所以这种加密方式很不安全。 第二节栅栏密码 所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多(一般不超过30个,也就是一、两句话)。 例如加密information,先将其分行: i f r a i n n o m t o 之后再合并: ifrainnomto 这样就得到了密文ifrainnomto 解密的时候,我们先把密文从中间分开,变为两行: i f r a i n n o m t o 再按上下上下的顺序组合起来得到information。若是英文长句再分出空格即可。 有些栅栏密码并非只有2栏,这时需先观察字母数,如有30个字母,30可写成2×3×5、3×10、2×15的乘积,则可以依次尝试2栏、3栏、5栏……即可找出明文。

第三节列置换加密法 列置换加密法是一种比较复杂的加密方法,它是在行数固定的情况下,将明文一列一列地写成矩阵的结构,然后再一列一列写出之前,根据某种密钥将其重新排序。例如: 密钥:4 3 1 2 5 6 7 明文:a t t a c k p o s t p o n e d u n t i l t w o a m x y z 密文:TTNAAPTMTSUOAODWCOIXKNLYPETZ 第四节替换式密码 替换式密码,又名取代加密法,是密码学中按规律把文字加密的一种方式。替换式密码中可以用不同的字母数为单元,例如每一个或两个字母为一单元。密文接收者解密时需用原加密方式解码才能获得原文本。由于英语中替换式密码会把26个字母拆开,使用替换式密码较为容易;相反,中文需要建立密码本,然后遂字替换。然而由于中文字极多,完全替换不合经济效益。而且中文中每个字由不同大小的字根来组字,较难转换,因此使用替换式密码的示例比较少。当以替换式密码与转位式密码相比较时,会发现转位式密码只是把明文中的单元的位置改变,而单元本身没有作出改变;相反,替换式密码只是把单元转换,但密文中单元的位置没有改变。 替换式密码亦有许多不同类型。如果每一个字母为一单元(或称元素)进行加密操作,就可以称之为“简易替换密码”(英语:simplesubstitution cipher)或“单表加密”(英

阿依古丽.木沙 5011213334维吉尼亚密码的解密与破解

《网络信息安全》 课程结课论文《维吉尼亚密码加密并破解思路》 学生姓名阿依古丽.木沙 学号5011213334 所属学院信息工程学院 专业计算机科学与技术 班级17-1 指导教师李鹏 塔里木大学教务处制

摘要 使用维吉尼亚密码加密只是众多密码加密方法中的一个,本设计是基于维吉尼亚密码的一种扩展,能起到更强的加密,完成所有属于ACSII的加密,本人主要负责设计的规划,程序设计,界面设计,报告的完成等工作,整个程序是Java平台下实现的。本次设计方法的原理以及方法仍然以维吉尼亚通用的方法来介绍。 关键词:维吉尼亚加密,密钥,加密,解密。

目录 一、密码分析及密码系统设计原则 (1) 二、维吉尼亚密码 (2) (一)维吉尼亚密码的介绍 (2) (二)维吉尼亚密码的原理 (3) (三)维吉尼亚密码-特点 (5) (四)维吉尼亚密码的演变 (6) (五)维吉尼亚密码下的扩展 (6) 三、加密的意义 (7) 总结 (8) 参考文献 (9)

前言 随着计算机联网的逐步实现,计算机信息的保密问题显得越来越重要。数据保密变换,或密码技术,是对计算机信息进行保护的最实用和最可靠的方法。 密码是实现秘密通讯的主要手段,是隐蔽语言、文字、图象的特种符号。凡是用特种符号按照通讯双方约定的方法把电文的原形隐蔽起来,不为第三者所识别的通讯方式称为密码通讯。在计算机通讯中,采用密码技术将信息隐蔽起来,再将隐蔽后的信息传输出去,使信息在传输过程中即使被窃取或载获,窃取者也不能了解信息的内容,从而保证信息传输的安全。所以,加密显得越来越重要,学会做加密软件,是很大的成果,可以用于各个领域. 本文首先介绍“维吉尼亚”密码的分析及设计规则,然后介绍维吉尼亚密码的概念,原理,特点,密码的使用,还有加密的意义等。

C++实现维吉尼亚密码加密

运行后先输入密钥,再输入文件名(输入文本,和输出文本的),文件名和代码在同一目录下不用加路径。 头文件: vi.h #ifndef _VI_H #define_VI_H #include #include class vi { private: std::string key; public: void setkey(); void job(); }; #endif #include"vi.h" #include #include #include usingnamespace std; void vi::setkey() { getline(cin,key,'\n'); } void vi::job() { string s,k;

cout<<"需要加密的文件名:"<='a'&&ch<='z') { n=ch+key[i]-97; if(n>122) { n-=26; out.put(n); } else out.put(n); } elseif(ch>='A'&&ch<='Z') { n=ch+key[i]-65; if(n>122) { n-=26; out.put(n); } else out.put(n); } else { out.put(ch); continue; } i=(i+1)%5; } }

密码学实验之凯撒密码和维吉尼亚密码的加解密

1.凯撒密码的加解密 源代码: #include #include #include int main() { char s[100],c; int i,p,d,e; printf("请选择: A.加密B.解密Q.退出\n"); scanf("%c",&c); if(c=='a'||c=='A') { printf("输入明文:"); scanf("%s",&s); p=strlen(s); printf("请设置偏移量:"); scanf("%d",&d); for(i=0;i='a' && s[i]<='z') s[i]=(s[i]-'a'+d)%26+'a'; else if(s[i]>='A' && s[i]<='Z') s[i]=(s[i]-'A'+d)%26+'A'; else s[i]=s[i]+d; } printf("%s",s); printf("\n\n\n"); } if(c=='b'||c=='B') { printf("请输入密文:"); scanf("%s",&s); p=strlen(s); printf("请输入加密的偏移变量:"); scanf("%d",&d); for(i=0;i='a' && s[i]<='z') { e=s[i]-'a'-d;

if(e<=0) s[i]=(e+26)%26+'a'; else s[i]=e%26+'a'; } else if(s[i]>='A' && s[i]<='Z') { e=s[i]-'A'-d; if(e<0) s[i]=(e+26)%26+'A'; else s[i]=e%26+'A'; } else s[i]=s[i]-d; } printf("%s",s); printf("\n\n"); } if(c=='q'||c=='Q') return 0; return 0; } 运行结果是: 2.维吉尼亚密码的加解密 源代码: #include "stdafx.h"

莫尔斯电码摩尔斯电码各类密码表全

摩尔斯电码由点(.)嘀、划(-)嗒两种符号按以下原则组成: 1,一点为一基本信号单位,每一划的时间长度相当于3点的时间长度。 2,在一个字母或数字内,各点、各划之间的间隔应为两点的长度。 3,字母(数字)与字母(数字)之间的间隔为7点的长度。 Atbash码凯撒码字码+摩尔斯电码QWE码键盘码 z d 1 A .- q 1 2 3 y e 2 B -... w __ abc def x f 3 C -.-. e w g 4 D -.. r 4 5 6 v h 5 E . t ghi jkl mn o u i 6 F ..-. y t j 7 G --. U 7 8 9 s k 8 H .... I pqrs tuv wxy z r l 9 I .. o q m 10 J .--- p p n 11 K -.- a o o 12 L .-.. s n p 13 M -- d m q 14 N -. f l r 15 O --- g k s 16 P .--. h j t 17 Q --.- j i u 18 R .-. k h v 19 S ... l g w 20 T - z f x 21 U ..- x e y 22 V ...- c d z 23 W .-- v c a 24 X -..- b b b 25 Y -.-- n a c 26 Z --.. m 密匙3 1 .---- 2 ..--- 3 ...-- 4 ....- 5 ..... 6 -.... 7 --... 8 ---.. 9 ----. 0 ----- ? ..--.. / -..-. () -.--.- - -....- . .-.-.-

维吉尼亚密码

实验二:用C语言实现维吉尼亚密码的加解密过程: #include using namespace std; #define MINCHAR 32 #define CHARSUM 94 char table[CHARSUM][CHARSUM]; bool Init(); bool Encode(char* key, char* source, char* dest); bool Dncode(char* key, char* source, char* dest); int main() { if(!Init()) { cout << "初始化错误!" << endl; return 1; } char key[256]; char str1[256]; char str2[256]; int operation; while(1) { do { cout << "请选择一个操作:1. 加密;2. 解密;-1. 退出\n"; cin >> operation; }while(operation != -1 && operation != 1 && operation != 2); if(operation == -1) return 0; else if(operation == 1)//加密 { cout << "请输入密钥:"; cin >> key; cout << "请输入待加密字符串:"; cin >> str1; Encode(key, str1, str2); cout << "加密后的字符串:" << str2 << endl; } else if(operation == 2)//解密 { cout << "请输入密钥:"; cin >> key; cout << "请输入待解密字符串:";

常用密码表

【基本字母表】 ┃01┃02┃03┃04┃05┃06┃07┃08┃09┃10┃11┃12┃13┃ ┠--╂--╂--╂--╂--╂--╂--╂--╂--╂--╂--╂--╂--┨ ┃A ┃B ┃C ┃D ┃E ┃F ┃G ┃H ┃I ┃J ┃K ┃L ┃M ┃ ====================================================== ┃14┃15┃16┃17┃18┃19┃20┃21┃22┃23┃24┃25┃26┃ ┠--╂--╂--╂--╂--╂--╂--╂--╂--╂--╂--╂--╂--┨ ┃N ┃O ┃P ┃Q ┃R ┃S ┃T ┃U ┃V ┃W ┃X ┃Y ┃Z ┃ ================ 〖QWE加密表〗 ┃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 ┃ ┠-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-

┨ ┃Q┃W┃E┃R┃T┃Y┃U┃I┃O┃P┃A┃S┃D┃F┃G┃H┃J┃K┃L┃Z┃X┃C┃V┃B┃N┃M ┃ --------其实QWE加密可以表示成这种形式; --------(a,q,j,p,h,i,o,g,u,x,b,w,v,c,e,t,z,m,d,r,k)(f,y,n)( l,s) --------至于它是什么意思,自己去琢磨. --------至于这种形式比表形式有什么优点,自己去琢磨. 【QWE解密表】 ┃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 ┃ ┠-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂-╂- ┨

维吉尼亚密码(Vigenere)加密与解密源代码

维吉尼亚密码解密:(java版) import javax.swing.JOptionPane; class VigenereEncrypt{ public static void main(String[] args){ int plainlen,keylen,i,j=0,a; String cipherText=""; String s1 = JOptionPane.showInputDialog(null,"Enter the PlainText","Input PlainText Demo",JOptionPane.QUESTION_MESSAGE); String s2 = JOptionPane.showInputDialog(null,"Enter the Key","Input Key Demo",JOptionPane.QUESTION_MESSAGE); plainlen = s1.length(); keylen = s2.length(); for(i=0;i

维吉尼亚密码

《网络与信息安全》课程设计报告

目录 一、密码分析及密码系统设计原则 (2) 二、维吉尼亚密码 (3) (一)维吉尼亚密码的介绍 (3) (二)维吉尼亚密码的原理 (4) (三)维吉尼亚密码-特点 (5) (四)维吉尼亚密码的演变 (7) (五)维吉尼亚密码下的扩展 (7) 三、界面的设计 (15) (一)软件启动封面设计- (16) (二)软件框架设计 (16) (三)软件按钮设计 (16) (四)菜单设计 (16) (五)标签设计 (17) (六)图标设计 (17) (七)滚动条及状态栏设计 (17) (八)安装过程设计 (17) (九)包装及商品化 (17) 四、加密的意义 (18) 总结 (18) 致谢词 (19) 参考文献 (19)

摘要 使用维吉尼亚密码加密只是众多密码加密方法中的一个,本设计是基于维吉尼亚密码的一种扩展,能起到更强的加密,完成所有属于ACSII的加密,本人主要负责设计的规划,程序设计,界面设计,报告的完成等工作,整个程序是Java平台下实现的。本次设计方法的原理以及方法仍然以维吉尼亚通用的方法来介绍。 关键词:维吉尼亚加密,密钥,加密,解密。 一、密码分析及密码系统设计原则 对通信双方而言,通信的一方将信息加密后发送给另一方,是为了使攻击者即使得到密文也无法读懂。对于攻击者来说,在不知道密钥的情况下,要想读懂密文,就要根据他的知识以及掌握的情报来进行密码分析。 密码分析是研究密钥未知的情况下恢复明文的科学。通常假设攻击者知道正在使用的密码体制,当然,如果分析者不知道正在使用的密码体制,分析起来将更加困难。成功的密码分析可能直接恢复明文或密钥,也可能找出保密系统的弱点来恢复明文或密钥。根据攻击者具有的知识和掌握的情报,可以将密码分析分为以下几种类型: (1)只有密文的攻击。攻击者有一些密文,它们是使用同一加密算法和同一密钥加密的。(2)已知明文的攻击。攻击者不仅得到一些密文,而且能得到这些密文对应的明文。 (3)选择明文的攻击。攻击者不仅得到一些密文和对应明文,而且能选择用于加密的明文。(4)选择密文的攻击。攻击者可以选择不同的密文来解密,并能得到解密后的明文。 在每种情况下,攻击者的目标是确定正在使用的密钥或待破译密文所对应的明文。上述几种攻击方式是以强度递增排列的,只有密文的攻击是最容易防护的攻击。然而,目前最常见的是已知明文和选择明文的攻击。事实上,攻击者欲得到一些明、密文对或加密一些选择好的明文并不困难,攻击者可以知道很多信息具有标准的头部和尾部。一般来说,密码系统应该经得起已知明文的攻击。 密码系统的安全依赖于破译该系统的困难程度。如果破译一个密码系统的费用超过了被加密数据本身的价值,或者破译所需的时间超过了被加密数据所需保密的时间,或者由一个密码系统加密的数据少于破译该算法所需的数据量,就可以认为这个系统是安全的。 如果攻击者无论得到多少密文,都没有足够的信息去恢复明文,那么该密码系统就是无条件安全的。在理论上,只有一次一密的系统才能真正实现这一点。除此之外的系统都至少可以使用

摩斯密码以及十种常用加密方法

摩斯密码以及十种常用加密方法 ——阿尔萨斯大官人整理,来源互联网摩斯密码的历史我就不再讲了,各位可以自行百度,下面从最简单的开始:时间控制和表示方法 有两种“符号”用来表示字元:划(—)和点(·),或分别叫嗒(Dah)和滴(Dit) 或长和短。 用摩斯密码表示字母,这个也算作是一层密码的: 用摩斯密码表示数字: 用摩斯密码表示标点符号:

目前最常用的就是这些摩斯密码表示,其余的可以暂时忽略 最容易讲的栅栏密码: 手机键盘加密方式,是每个数字键上有3-4个字母,用两位数字来表示字母,例如:ru用手机键盘表示就是:7382, 那么这里就可以知道了,手机键盘加密方式不可能用1开头,第二位数字不可能超过4,解密的时候参考此 关于手机键盘加密还有另一种方式,就是拼音的方式,具体参照手机键盘来打,例如:“数字”表示出来就是:748 94。在手机键盘上面按下这几个数,就会出现:“数

字”的拼音 手机键盘加密补充说明:利用重复的数字代表字母也是可以的,例如a可以用21代表,也可以用2代表,如果是数字9键上面的第四个字母Z也可以用9999来代表,就是94,这里也说明,重复的数字最小为1位,最大为4位。 电脑键盘棋盘加密,利用了电脑的棋盘方阵,但是个人不喜这种加密方式,因需要一个一个对照加密 当铺密码比较简单,用来表示只是数字的密码,利用汉字来表示数字: 电脑键盘坐标加密,如图,只是利用键盘上面的字母行和数字行来加密,下面有注释: 例:bye用电脑键盘XY表示就是: 351613

电脑键盘中也可参照手机键盘的补充加密法:Q用1代替,X可以用222来代替,详情见6楼手机键盘补充加密法。 ADFGX加密法,这种加密法事实上也是坐标加密法,只是是用字母来表示的坐标: 例如:bye用此加密法表示就是:aa xx xf 值得注意的是:其中I与J是同一坐标都是gd,类似于下面一层楼的方法: 这种加密方法和上面的加密方法是相同的,但是是用数字来表示坐标的,其中IJ是在同一坐标上,与上层楼中的一样,就不举例了:

维吉尼亚密码报告

郑州轻工业学院本科 维吉尼亚密码原理 实验报告 设计题目: 学生姓名: 系别:计算机与通信工程学院专业:运维与安全 班级:1502 学号: 指导教师: 2018 年5月2日

1实验目的: (1)解释维吉尼亚密码原理; (2)使用维吉尼亚密码对所要求内容进行加密。 2、实验步骤 I、解释维吉尼亚密码原理。 (1)维吉尼亚密码原理: 密码表: 原理:维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表

来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,在选定一个秘钥之后,假设以jiazhiyuan作为秘钥,加密henduonianyilai这段明文,加密之后的密文为qmncbwlcaahqlzp。 使用维吉尼亚加密算法的加密程序对明文进行加密: 在in.txt中输入秘钥和明文,在out文件中得到密文。 由此加密整篇密文。 II、使用维吉尼亚密码对所要求内容进行加密,要求加密明文:很多年以来,维

吉尼亚密码都被认为是不可破解的,但巴贝奇(Babbage),一个独立的英国富人在19世纪50年代向人们展示了事实并非如此。顺便提一句,这个人也因为其在计算机科学领域方面所进行的先锋性工作而被世人所熟悉。巴贝奇通过寻找重复的字母段破解了这个密码系统。 密钥为自己名字的全拼:jiazhiyuan 明文: henduonianyilai,weijiniyamimadourenweishibukenengbeipoyide.dans hi(babbage),yigedulideyingguoren. zaishijiushijiwushiniandaixiangrenmenzhanshileshishibingfeiruci.shu nbiantiyiju,zhegerenyeshiyinwei。qizaijisuanjikexuelingyufangmiansuojinxingdexianfengxinggongzuoerb eishirensuoshuxi.babeiqitongguoxunzhaochongfudezimuduanpojielez hegemimaxitong. 密文: qmncbwlcaahqlzp,eccjvwqyztqkudbdzemdmgmhvkckdumlabrrxoxplc.x aabpi(ahjzugr),hqgdkcjcdrhqnfncmlea. iiiroqhcufqqjhdcqbiarinchqvcaapzemtmlthnwahhsmqbifqqbhuodyiedki .roclvinwbixprs,thrpmrdugcmhvhqnvlq。zqzzprgmunwrijlfsylvwoytmilamvjvstvrghxvwoddeqyhfrwoxhuoeinticod yjccsurzemzcmmhhgq.bzimgkigxvgfbwvonmqiobowlafhmmzhtcboaaywj hltcthrpmmhtivctbwo. 3、总结

维吉尼亚密码的实现

维吉尼亚密码的实现 《应用密码学》课程实验报告 --------------- 维吉尼亚密码的实现一、实验目的 维吉尼亚密码是古典密码中非常具有代表的例子。本实验要求用高级语言编写和调试一个简单的维吉尼亚密码实现及分析破译程序。通过本实验可以加深理解维吉尼亚密码及其分析破译。二、实验内容与要求 (1)设计一个函数实现维吉尼亚密码; (2)在已知明文及其对应密文的基础上,分析破译维吉尼亚密码,编程求解密钥; (3)要求有程序实现,有实验结果截图,有测试例子。 (4)编程语言不限制,可以用tc2.0,vc6.0,.net或java 三、实验设备 硬件环境: Intel Pentium Processor 1.8G ,512M内存,windows 操作系统 软件环境:VC++ 四、实验步骤 #include using namespace std; #define MINCHAR 32 #define CHARSUM 94 char table[CHARSUM][CHARSUM]; bool Init(); bool Encode(char* key, char* source, char* dest); bool Dncode(char* key, char* source, char* dest); int main()

{ if(!Init()) { cout << "初始化错误~" << endl; return 1; } char key[256]; char str1[256]; char str2[256]; int operation; while(1) { do { cout << "请选择一个操作:1. 加密; 2. 解密; -1. 退出\n"; cin >> operation; } while(operation != -1 && operation != 1 && operation != 2); if(operation == -1) return 0; else if(operation == 1)//加密 { cout << "请输入密钥:"; cin >> key;

维吉尼亚密码

破译Vigen`ere密码 pwlfxkysfgacoeoggpyxgelgrezekbhmnlciysrudzekriqyjmtqijmejlvwbsnfkpnbrutxit glcnyhlivvbxuofkbsrvmmnhvkpppykfctjtgiedzpmyvwxrsfwiiiewdjpioeprrgvidgkxr eigilejiwredutgodownocrpppykfctzvpwidzpcffkbsfgypwaciwebvdmasluhxikexgoe pdylulirorwsenfdlcrtbeleikpnhrutxueniptyxdrexszcnrudzerxhrhvgisujoxfekpdmniy xytzhcxhvpmpsktathrlirffkilewsvqtgepmnkobrlvmiirkriqethchffbxfejxrsnudlcfzkhx axkmlffkilekrmpdgepmnkobrlvmiirkriqethchffbxfewhjvtykrbsfhcqouovlcziwirdkg fiexhtrfnyaeghacaczlybvmxgczzlcrjmwetvwtjopfxplzyrqowvxthvbejpytqitj 思路分析: ○1将密文输出成对应的ASCII码,减去97得到a~z范围为0~25。 ○2通过循环查找长度为4相同字符的距离,并记录在一个矩阵里。 ○3对这些距离进行统计,找出出现较多的距离,求其最大公约数。 ○4最大公约数(或其约数)就是密钥的长度d。 ○5将密文按密钥长度分成d*n的矩阵,对每行分别用0~25进行解密,用卡方公式 统计每次解密后计算的的值,每一轮取出最小的对应的0~25中的值,将其作为密钥,经过d轮循环得到密钥K。 ○6将密钥重复的和密文一样长,用其进行解密得到明文。 程序如下: clc; clear all; P=[8.167,1.492,2.782,4.253,12.702,2.228,... %统计概率矩阵 2.015,6.094,6.966,0.153,0.772,4.025,... 2.406,6.749,7.507,1.929,0.095,5.987,... 6.327,9.056,2.758,0.978,2.360,0.150,... 1.974,0.074]; fid=fopen('weijimima.txt'); %打开要读的文本 A=(fread(fid)-97); %读取文本,并表示成0~25之间的数 fclose(fid); %关闭文本 l=length(A); %l表示字符的长度 m=4; %m表示相同串的长度 for i=1:(l-4) for j=(1+i):(l-3) B=A(i:i+3); C=A(j:j+3); if B==C D(i,j)=j-i; end end end

[免费]密码常识及例题

【密码常识】 字母表顺序-数字 加密的时候,经常要把A~Z这26个字母转换成数字,最常见的一种方法就是取字母表中的数字序号。A代表1,B代表2,C代表3... 字母 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 数字 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 进制转换密码 例如二进制:1110 10101 1101 10 101 10010 1111 1110 101 转为十进制:14 21 13 2 5 18 15 14 5 对应字母表:number Mod算法 我们可以对字母序号进行数学运算,然后把所得的结果作为密文。当运算结果大于26或小于1的时候,我们希望把这个数值转为1~26的范围,那么取这个数除以26的余数即可。 Mod就是求余数的运算符,有时也用“%”表示。例如 29 Mod 26 = 3,或写成 29 % 26 = 3,意思是29除以26的余数是3。 倒序 加密时为经常要对字符进行倒序处理。如果让你按abcdef...的顺序背出字母表的每个字母会很容易,但是如果是zyxwvu...的顺序那就很难背出来了。一个很熟悉的单词,如果按相反的顺序拼写,可能就会感到很陌生。 例如“love”字母倒过来拼就是“evol”。 具体加密时倒序有很多种方案,需要灵活运用。例如: 每个单词的倒序:siht si a tset - this is a test 整句的倒序:tset a si siht - this is a test 数字的倒序:02 50 91 02 - 20 05 19 20(test) 间隔 单词之间的间隔一般使用空格。在加密时常常要去掉空格,但有时某些字母或数字来替代空格也不失为一种好的加密方案。错误空格位置也会起到很强的误导作用。 例如:t hi sis at est - this is a test 字母频率 频率分析法可以有效的破解单字母替换密码。 关于词频问题的密码,我在这里提供英文字母的出现频率给大家,其中数字全部是出现

维吉尼亚密码破解

作业 首先,通过求重复子串偏移量的最大公约数的方法,得出密钥长度为4. 然后将文件分成4个文件,分别统计字母频率。发现每个表均有一个字母频率异常的高: 刚开始猜测该字母为e和符号的频率之和,后来将该字母替换掉后,发现字频统计大致还是符合正常的字符频率,所以e应该不包括在内。 然后猜测该字母代表的是符号,同时为了防止通过字频统计破解,可能将字频最小的字母z也归到了其中(假设)。 接下来,把分别该字母替换成_,相当于将文章中的单词分了出来。再次对各表对应的文本进行频率统计,如下:

发现4个文件的字母频率排序非常相近,再与标准字母频率对比发现,基本上相当于循环下移了一位。 由于四个单表的字母频率非常相近,这里我们选择将直接将四个表统一为z e t a o i n s h r d l c u m w f g y p b v k j x q,通过不断修正四个表从而一步一步接近正确答案,大概直接替换进去,就可以发现这是乔布斯在斯坦福大学的演讲稿,因为之前背过。。。。。。 但是,我们组做了一些可能是无用功的东西,就是把四个表都对应了出来,分别是: z e t o a i r n s d h l u f y w c m g p v b k j x q z e t o a i n s r h l d u y w g m c p f b v k j x q z e t a o i n s l r h d u w p y m c g f v b k j x q z e t a o i n r h s d l y w c u f g m p b v k x j q 通过这四个表进行替换,可以对绝大部分密文进行还原,其余的极少部分单词也可以通过人工识别出来,这里由于时间。。。实在紧迫,就调到这里了。

维吉尼亚实验报告

1 《应用密码学》课程实验报告 四、实验步骤 (1)了解维吉尼亚加密原理 维吉尼亚使用一个词组作为密钥,密钥中每一个字母用来确定一个代替表,每一个密钥字母被用来加密一个明文字母,等所有密钥字母使用完后,密钥再循环使用。维吉尼亚是最著名的多表代替密码的例子。 例如用V i genere 加密“we are discovered ” K=deceptive 步骤如下: 1.对照字母表写出“we are discovered ”在字母表中的位置,以及明文“we are discovered ”所 2.维基利亚密码加密函数为:f(Pi)=(Pi+Ki)mod26,f(Pi)表示密文字母在字母表中的位置,Pi 表示

2 明文字母在字母表中的位置,Ki 表示密钥字母在字母表中的位置,i=1,2,3,…,n.根据维基利亚密码加密函数写出求密文的过程及密文字母在字母表中的位置如下表: 因此密文为:zicvtwqngrzgvtw (2)编写程序: 由维吉尼亚加密算法的原理可知,编写程序来实现维吉尼亚加解密主要是构造明文对应的数字表,在这里,可用将明文字母转化成其ACSII 值,在这之前,要将所有明文字母和密钥字母首先转化为大写字母,再转化成其对应的ACSII 码值,将明文和密钥字母所对应的ACSII 码带入加密或者解密公式,算出密文,再将密文还原成大写字母输出。 源代码如下: #include #include #include #include void main() { char p[100], key[100]; int lenp; //明文的长度 int lenk; //密文的长度 int i=0,j=0; printf("请输入明文:\n"); gets(p); lenp = strlen(p); strcpy(p, strupr(p)); //将字符串c ,即明文全部换成大写 printf("请输入密钥:\n"); gets(key); lenk = strlen(key); strcpy(key, strupr(key)); //将字符串key,即密钥全部换成大写 for(i=0; i64&&p[i]<91) { p[i] = (p[i]-65+key[j]-65)%26+65; j++; }

维吉尼亚密码加解密算法

维吉尼亚密码加解密算法 #include #include #include void Encry() { char key[100]; char ch,temp; int L,i=0,j=0; if(getchar()=='\n') temp=' '; printf("请输入密钥: "); gets(key); L=strlen(key); printf("输入明文: "); while((ch=getchar())!='\n') { if(ch==' ') { i++; continue; } if(ch>='a'&&ch<='z') { printf("%c",(ch+key[j%L]-'a'-'a')%26+'A'); j++; } if(ch>='A'&&ch<='Z') { printf("%c",(ch+key[j%L]-'A'-'a')%26+'A'); j++; } if(j%L==0) printf(" "); i++; } putchar(ch); } void Decry()

{ char key[100]; char ch,temp; int L,i=0,j=0; if(getchar()=='\n') temp=' '; printf("请输入密钥: "); gets(key); L=strlen(key); printf("输入密文: "); while((ch=getchar())!='\n') { if(ch==' ') { i++; continue; } if(ch>='A'&&ch<='Z') { printf("%c",(ch-key[j%L]-'A'+'a'+26)%26+'a'); j++; } if(j%L==0) printf(" "); i++; } putchar(ch); } int Exit() { exit(0); } int main() { char ch; for(;;) { printf("请输入你的操作(e/E加密;d/D解密;q/Q退出):"); ch=getchar(); if(ch=='e'||ch=='E')

二、维吉尼亚密码原理

二、维吉尼亚密码原理 为了提高密码的破译的难度,人们有发明一种多表置换的密码,即一个明文字母可以表示为多个密文字母,多表密码加密算法结果将使得对单表置换用的简单频率分析方法失效,其中维吉尼亚密码就是一种典型的加密方法。维吉尼亚密码是使用一个词组(语句)作为密钥,词组中每一个字母都作为移位替换密码密钥确定一个替换表,维吉尼亚密码循环的使用每一个替换表完成明文字母到密文字母的变换,最后所得到的密文字母序列即为加密得到的密文,具体过程如下: 设m是一个正整数,且i≤j≤m,密匙为K =(K1, K2 ……Km),则: 第i组的明文为Pi =(Pi1, Pi2 ……Pim) 第i组的密文为Ci =(Ci1, Ci2 ……Cim) 那么加密公式为Cij ≡Pij + Kij (mod 26) 解密公式为Pij ≡Cij - Kij (mod 26) 最后把密文编码转换成文本。 import java.util.*; import java.io.*; /** * * @author Neng * */ public class Vigenere { /** * input file containing plaintext */ private File inFile; /** * ArrayList of plaintext, key and cipher */ ArrayList ap, ak, ac; char[] key; public Vigenere() { ap = new ArrayList(); ak = new ArrayList(); ac = new ArrayList(); }

维吉尼亚密码java代码实现完整版

package cn.longxuzi; import org.junit.Test; public class Chi_SquareUtils { private static final ICUtils icUtils = new ICUtils(); /** * @author信息111李继华(LiJiHua) * @param String * [][]ciphertext * @return null * @Date 2013-11-21 PM 19:23 * @copyright李继华所有 */ @Test public void chi_square() { String[][] ciphertext = icUtils.devideCipherText();// 获取密文划分以后的每一小组的密文数组 String[] freList = { "A=8.167", "B=1.492", "C=2.782", "D=4.253", "E=12.702", "F=2.228", "G=2.015", "H=6.049", "I=6.996", "J=0.153", "K=0.772", "L=4.025", "M=2.406", "N=6.749", "O=7.507", "P=1.929", "Q=0.095", "R=5.987", "S=6.327", "T=9.056", "U=2.758", "V=0.978", "W=2.360", "X=0.150", "Y=1.974", "Z=0.074" };// 频率分布表构成的字符串数组 int count = 0;// 计数器(计算每一个英文字母出现的次数) double index = 0;// 临时存储每一组密文的X^2得到的值 double[] x = new double[ciphertext.length];// 创建存储每一组密文X值的double型数组容器 int[][] sum1 = new int[ciphertext.length][freList.length];// 创建用来存储每一组每个英文字母出现的次数的整形数组容器 double[][] sum2 = new double[ciphertext.length][freList.length];// 创建存储每一组每个密文字母的(C-E)/E 值 for (int i = 0; i < ciphertext.length; i++) {// 第一层循环遍历根据密钥长度分成的每一小组密文for (int j = 0; j < freList.length; j++) {// 第二层循环遍历频率分布表中每个字母在每一小组密文中是否出现以及它们的频率 String flag = freList[j].substring(0, 1);// 临时存储取到的第J个英文字母 double E = Double.parseDouble(freList[j].substring(2,

相关主题
相关文档
最新文档