java加密算法

java加密算法
java加密算法

Web开发编程软件界面设计软件!对象

参数algorithm 如:"DSA"

public final void initSign(PrivateKey privateKey)

throws InvalidKeyException

用指定的私钥初始化

参数:privateKey 所进行签名时用的私钥

public final void update(byte data)

throws SignatureException

public final void update(byte[] data)

throws SignatureException

public final void update(byte[] data, int off, int len)

throws SignatureException

添加要签名的信息

public final byte[] sign()

throws SignatureException

返回签名的数组,前提是initSign和update

public final void initVerify(PublicKey publicKey)

throws InvalidKeyException

用指定的公钥初始化

参数:publicKey 验证时用的公钥

public final boolean verify(byte[] signature)

throws SignatureException

验证签名是否有效,前提是已经initVerify初始化

参数: signature 签名数组

*/

import java.security.*;

import java.security.spec.*;

public class testdsa {

public static void main(String[] args) throws java.security.NoSuchAlgorithmException,https://www.360docs.net/doc/9018902165.html,ng.Exception {

testdsa my=new testdsa();

my.run();

}

public void run()

{

//数字签名生成密钥

//第一步生成密钥对,如果已经生成过,本过程就可以跳过,对用户来讲myprikey.dat要保存在本地

//而mypubkey.dat给发布给其它用户

if ((new java.io.File("myprikey.dat")).exists()==false) {

if (generatekey()==false) {

System.out.println("生成密钥对败");

return;

};

}

//第二步,此用户

//从文件中读入私钥,对一个字符串进行签名后保存在一个文件(myinfo.dat)中

//并且再把myinfo.dat发送出去

//为了方便数字签名也放进了myifno.dat文件中,当然也可分别发送

try {

java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));

PrivateKey myprikey=(PrivateKey)in.readObject();

in.close();

// java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec(bX509);

//java.security.spec.X509EncodedKeySpec pubkeyEncode=java.security.spec.X509EncodedKeySpec String myinfo="这是我的信息"; //要签名的信息

//用私钥对信息生成数字签名

java.security.Signature signet=java.security.Signature.getInstance("DSA");

signet.initSign(myprikey);

signet.update(myinfo.getBytes());

byte[] signed=signet.sign(); //对信息的数字签名

System.out.println("signed(签名内容)="+byte2hex(signed));

//把信息和数字签名保存在一个文件中

java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat"));

out.writeObject(myinfo);

out.writeObject(signed);

out.close();

System.out.println("签名并生成文件成功");

}

catch (https://www.360docs.net/doc/9018902165.html,ng.Exception e) {

e.printStackTrace();

System.out.println("签名并生成文件失败");

};

//第三步

//其他人通过公共方式得到此户的公钥和文件

//其他人用此户的公钥,对文件进行检查,如果成功说明是此用户发布的信息.

//

try {

java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat"));

PublicKey pubkey=(PublicKey)in.readObject();

in.close();

System.out.println(pubkey.getFormat());

in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat"));

String info=(String)in.readObject();

byte[] signed=(byte[])in.readObject();

in.close();

java.security.Signature signetcheck=java.security.Signature.getInstance("DSA");

signetcheck.initVerify(pubkey);

signetcheck.update(info.getBytes());

if (signetcheck.verify(signed)) {

System.out.println("info="+info);

System.out.println("签名正常");

}

else System.out.println("非签名正常");

}

catch (https://www.360docs.net/doc/9018902165.html,ng.Exception e) {e.printStackTrace();};

}

//生成一对文件myprikey.dat和mypubkey.dat---私钥和公钥,

//公钥要用户发送(文件,网络等方法)给其它用户,私钥保存在本地

public boolean generatekey()

{

try {

java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance("DSA");

// SecureRandom secrand=new SecureRandom();

// secrand.setSeed("tttt".getBytes()); //初始化随机产生器

// keygen.initialize(576,secrand); //初始化密钥生成器

keygen.initialize(512);

KeyPair keys=keygen.genKeyPair();

// KeyPair keys=keygen.generateKeyPair(); //生成密钥组

PublicKey pubkey=keys.getPublic();

PrivateKey prikey=keys.getPrivate();

java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new

java.io.FileOutputStream("myprikey.dat"));

out.writeObject(prikey);

out.close();

System.out.println("写入对象prikeys ok");

out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat")); out.writeObject(pubkey);

out.close();

System.out.println("写入对象pubkeys ok");

System.out.println("生成密钥对成功");

return true;

}

catch (https://www.360docs.net/doc/9018902165.html,ng.Exception e) {

e.printStackTrace();

System.out.println("生成密钥对失败");

return false;

};

}

public String byte2hex(byte[] b)

{

String hs="";

String stmp="";

for (int n=0;n

{

stmp=(https://www.360docs.net/doc/9018902165.html,ng.Integer.toHexString(b[n] & 0XFF));

if (stmp.length()==1) hs=hs+"0"+stmp;

else hs=hs+stmp;

if (n

}

return hs.toUpperCase();

}

}

2.4. DESede/DES对称算法

首先生成密钥,并保存(这里并没的保存的代码,可参考DSA中的方法)

KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);

SecretKey deskey = keygen.generateKey();

用密钥加密明文(myinfo),生成密文(cipherByte)

Cipher c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.ENCRYPT_MODE,deskey);

byte[] cipherByte=c1.doFinal(myinfo.getBytes());

传送密文和密钥,本文没有相应代码可参考DSA

.............

用密钥解密密文

c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.DECRYPT_MODE,deskey);

byte[] clearByte=c1.doFinal(cipherByte);

相对来说对称密钥的使用是很简单的,对于JCE来讲支技DES,DESede,Blowfish三种加密术

对于密钥的保存各传送可使用对象流或者用二进制编码,相关参考代码如下

SecretKey deskey = keygen.generateKey();

byte[] desEncode=deskey.getEncoded();

javax.crypto.spec.SecretKeySpec destmp=new javax.crypto.spec.SecretKeySpec(desEncode,Algorithm); SecretKey mydeskey=destmp;

相关API

KeyGenerator 在DSA中已经说明,在添加JCE后在instance进可以如下参数

DES,DESede,Blowfish,HmacMD5,HmacSHA1

javax.crypto.Cipher 加/解密器

public static final Cipher getInstance(https://www.360docs.net/doc/9018902165.html,ng.String transformation)

throws java.security.NoSuchAlgorithmException,

NoSuchPaddingException

返回一个指定方法的Cipher对象

参数:transformation 方法名(可用DES,DESede,Blowfish)

public final void init(int opmode, java.security.Key key)

throws java.security.InvalidKeyException

用指定的密钥和模式初始化Cipher对象

参数:opmode 方式(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)

key 密钥

public final byte[] doFinal(byte[] input)

throws https://www.360docs.net/doc/9018902165.html,ng.IllegalStateException,

IllegalBlockSizeException,

BadPaddingException

对input内的串,进行编码处理,返回处理后二进制串,是返回解密文还是加解文由init时的opmode决定注意:本方法的执行前如果有update,是对updat和本次input全部处理,否则是本inout的内容

/*

安全程序DESede/DES测试

*/

import java.security.*;

import javax.crypto.*;

public class testdes {

public static void main(String[] args){

testdes my=new testdes();

my.run();

}

public void run() {

//添加新安全算法,如果用JCE就要把它添加进去

Security.addProvider(new com.sun.crypto.provider.SunJCE());

String Algorithm="DES"; //定义加密算法,可用DES,DESede,Blowfish String myinfo="要加密的信息";

try {

//生成密钥

KeyGenerator keygen = KeyGenerator.getInstance(Algorithm); SecretKey deskey = keygen.generateKey();

//加密

System.out.println("加密前的二进串:"+byte2hex(myinfo.getBytes())); System.out.println("加密前的信息:"+myinfo);

Cipher c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.ENCRYPT_MODE,deskey);

byte[] cipherByte=c1.doFinal(myinfo.getBytes());

System.out.println("加密后的二进串:"+byte2hex(cipherByte));

//解密

c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.DECRYPT_MODE,deskey);

byte[] clearByte=c1.doFinal(cipherByte);

System.out.println("解密后的二进串:"+byte2hex(clearByte));

System.out.println("解密后的信息:"+(new String(clearByte)));

}

catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();} catch (https://www.360docs.net/doc/9018902165.html,ng.Exception e3) {e3.printStackTrace();}

}

public String byte2hex(byte[] b) //二行制转字符串

{

String hs="";

String stmp="";

for (int n=0;n

{

stmp=(https://www.360docs.net/doc/9018902165.html,ng.Integer.toHexString(b[n] & 0XFF));

if (stmp.length()==1) hs=hs+"0"+stmp;

else hs=hs+stmp;

if (n

}

return hs.toUpperCase();

}

}

2.5. Diffie-Hellman密钥一致协议

公开密钥密码体制的奠基人Diffie和Hellman所提出的"指数密钥一致协议"(Exponential Key Agreement Protocol),该协议不要求别的安全性先决条件,允许两名用户在公开媒体上交换信息以生成"一致"的,可以共享的密钥。在JCE的中实现用户alice生成DH类型的密钥对,如果长度用1024生成的时间请,推荐第一次生成后保存DHParameterSpec,以便下次使用直接初始化.使其速度加快

System.out.println("ALICE: 产生DH 对 ...");

KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance("DH");

aliceKpairGen.initialize(512);

KeyPair aliceKpair = aliceKpairGen.generateKeyPair();

alice生成公钥发送组bob

byte[] alicePubKeyEnc = aliceKpair.getPublic().getEncoded();

bob从alice发送来的公钥中读出DH密钥对的初始参数生成bob的DH密钥对

注意这一步一定要做,要保证每个用户用相同的初始参数生成的

DHParameterSpec dhParamSpec = ((DHPublicKey)alicePubKey).getParams();

KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance("DH");

bobKpairGen.initialize(dhParamSpec);

KeyPair bobKpair = bobKpairGen.generateKeyPair();

bob根据alice的公钥生成本地的DES密钥

KeyAgreement bobKeyAgree = KeyAgreement.getInstance("DH"); bobKeyAgree.init(bobKpair.getPrivate());

bobKeyAgree.doPhase(alicePubKey, true);

SecretKey bobDesKey = bobKeyAgree.generateSecret("DES");

bob已经生成了他的DES密钥,他现把他的公钥发给alice,

byte[] bobPubKeyEnc = bobKpair.getPublic().getEncoded();

alice根据bob的公钥生成本地的DES密钥

,,,,,,解码

KeyAgreement aliceKeyAgree = KeyAgreement.getInstance("DH"); aliceKeyAgree.init(aliceKpair.getPrivate());

aliceKeyAgree.doPhase(bobPubKey, true);

SecretKey aliceDesKey = aliceKeyAgree.generateSecret("DES");

bob和alice能过这个过程就生成了相同的DES密钥,在这种基础就可进行安全能信

常用API

java.security.KeyPairGenerator 密钥生成器类

public static KeyPairGenerator getInstance(String algorithm)

throws NoSuchAlgorithmException

以指定的算法返回一个KeyPairGenerator 对象

参数: algorithm 算法名.如:原来是DSA,现在添加了DiffieHellman(DH)

public void initialize(int keysize)

以指定的长度初始化KeyPairGenerator对象,如果没有初始化系统以1024长度默认设置参数:keysize 算法位长.其范围必须在512 到1024 之间,且必须为64 的倍数

注意:如果用1024生长的时间很长,最好生成一次后就保存,下次就不用生成了

public void initialize(AlgorithmParameterSpec params)

throws InvalidAlgorithmParameterException

以指定参数初始化

javax.crypto.interfaces.DHPublicKey

public DHParameterSpec getParams()

返回

java.security.KeyFactory

public static KeyFactory getInstance(String algorithm)

throws NoSuchAlgorithmException

以指定的算法返回一个KeyFactory

参数: algorithm 算法名:DSH,DH

public final PublicKey generatePublic(KeySpec keySpec)

throws InvalidKeySpecException

根据指定的key说明,返回一个PublicKey对象

java.security.spec.X509EncodedKeySpec

public X509EncodedKeySpec(byte[] encodedKey)

根据指定的二进制编码的字串生成一个key的说明

参数:encodedKey 二进制编码的字串(一般能过PublicKey.getEncoded()生成) javax.crypto.KeyAgreement 密码一至类

public static final KeyAgreement getInstance(https://www.360docs.net/doc/9018902165.html,ng.String algorithm) throws java.security.NoSuchAlgorithmException

返回一个指定算法的KeyAgreement对象

参数:algorithm 算法名,现在只能是DiffieHellman(DH)

public final void init(java.security.Key key)

throws java.security.InvalidKeyException

用指定的私钥初始化

参数:key 一个私钥

public final java.security.Key doPhase(java.security.Key key,

boolean lastPhase)

throws java.security.InvalidKeyException,

https://www.360docs.net/doc/9018902165.html,ng.IllegalStateException

用指定的公钥进行定位,lastPhase确定这是否是最后一个公钥,对于两个用户的情况下就可以多次定次,最后确定

参数:key 公钥

lastPhase 是否最后公钥

public final SecretKey generateSecret(https://www.360docs.net/doc/9018902165.html,ng.String algorithm) throws https://www.360docs.net/doc/9018902165.html,ng.IllegalStateException,

java.security.NoSuchAlgorithmException,

java.security.InvalidKeyException

根据指定的算法生成密钥

参数:algorithm 加密算法(可用DES,DESede,Blowfish)

*/

import java.io.*;

import java.math.BigInteger;

import java.security.*;

import java.security.spec.*;

import java.security.interfaces.*;

import javax.crypto.*;

import javax.crypto.spec.*;

import javax.crypto.interfaces.*;

import com.sun.crypto.provider.SunJCE;

public class testDHKey {

public static void main(String argv[]) {

try {

testDHKey my= new testDHKey();

my.run();

} catch (Exception e) {

System.err.println(e);

}

}

private void run() throws Exception {

Security.addProvider(new com.sun.crypto.provider.SunJCE());

System.out.println("ALICE: 产生DH 对 ...");

KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance("DH"); aliceKpairGen.initialize(512);

KeyPair aliceKpair = aliceKpairGen.generateKeyPair(); //生成时间长

// 张三(Alice)生成公共密钥alicePubKeyEnc 并发送给李四(Bob) ,

//比如用文件方式,socket.....

byte[] alicePubKeyEnc = aliceKpair.getPublic().getEncoded();

//bob接收到alice的编码后的公钥,将其解码

KeyFactory bobKeyFac = KeyFactory.getInstance("DH");

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec (alicePubKeyEnc); PublicKey alicePubKey = bobKeyFac.generatePublic(x509KeySpec);

System.out.println("alice公钥bob解码成功");

// bob必须用相同的参数初始化的他的DH KEY对,所以要从Alice发给他的公开密钥,

//中读出参数,再用这个参数初始化他的DH key对

//从alicePubKye中取alice初始化时用的参数

DHParameterSpec dhParamSpec = ((DHPublicKey)alicePubKey).getParams(); KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance("DH"); bobKpairGen.initialize(dhParamSpec);

KeyPair bobKpair = bobKpairGen.generateKeyPair();

System.out.println("BOB: 生成DH key 对成功");

KeyAgreement bobKeyAgree = KeyAgreement.getInstance("DH");

bobKeyAgree.init(bobKpair.getPrivate());

System.out.println("BOB: 初始化本地key成功");

//李四(bob) 生成本地的密钥bobDesKey

bobKeyAgree.doPhase(alicePubKey, true);

SecretKey bobDesKey = bobKeyAgree.generateSecret("DES");

System.out.println("BOB: 用alice的公钥定位本地key,生成本地DES密钥成功");

// Bob生成公共密钥bobPubKeyEnc 并发送给Alice,

//比如用文件方式,socket.....,使其生成本地密钥

byte[] bobPubKeyEnc = bobKpair.getPublic().getEncoded();

System.out.println("BOB向ALICE发送公钥");

// alice接收到bobPubKeyEnc后生成bobPubKey

// 再进行定位,使aliceKeyAgree定位在bobPubKey

KeyFactory aliceKeyFac = KeyFactory.getInstance("DH");

x509KeySpec = new X509EncodedKeySpec(bobPubKeyEnc);

PublicKey bobPubKey = aliceKeyFac.generatePublic(x509KeySpec);

System.out.println("ALICE接收BOB公钥并解码成功");

;

KeyAgreement aliceKeyAgree = KeyAgreement.getInstance("DH"); aliceKeyAgree.init(aliceKpair.getPrivate());

System.out.println("ALICE: 初始化本地key成功");

aliceKeyAgree.doPhase(bobPubKey, true);

// 张三(alice) 生成本地的密钥aliceDesKey

SecretKey aliceDesKey = aliceKeyAgree.generateSecret("DES");

System.out.println("ALICE: 用bob的公钥定位本地key,并生成本地DES密钥");

if (aliceDesKey.equals(bobDesKey)) System.out.println("张三和李四的密钥相同");

//现在张三和李四的本地的deskey是相同的所以,完全可以进行发送加密,接收后解密,达到//安全通道的的目的

/*

* bob用bobDesKey密钥加密信息

*/

Cipher bobCipher = Cipher.getInstance("DES");

bobCipher.init(Cipher.ENCRYPT_MODE, bobDesKey);

String bobinfo= "这是李四的机密信息";

System.out.println("李四加密前原文:"+bobinfo);

byte[] cleartext =bobinfo.getBytes();

byte[] ciphertext = bobCipher.doFinal(cleartext);

/*

* alice用aliceDesKey密钥解密

*/

Cipher aliceCipher = Cipher.getInstance("DES");

aliceCipher.init(Cipher.DECRYPT_MODE, aliceDesKey);

byte[] recovered = aliceCipher.doFinal(ciphertext);

System.out.println("alice解密bob的信息:"+(new String(recovered))); if (!java.util.Arrays.equals(cleartext, recovered))

throw new Exception("解密后与原文信息不同");

System.out.println("解密后相同");

}

}

信息安全 实验五 古典密码算法

实验五古典密码算法 实验目的: 通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 实验环境: 运行Windows 或Linux 操作系统的PC 机,具有gcc(Linux)、VC(Windows)等C 语言编 译环境。 实验原理: 古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法进行文字信息的加密和解密。下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。 1. 替代密码 替代密码算法的原理是使用替代法进行加密,就是将文中的字符用其它字符替代后形成密文。例如,明文字母a、b、c、d,用D、E、F、G 做对应替换后形成密文。 替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替 代密码等。下面我们介绍一种典型的单表替代密码——凯撒(Caesar)密码,又叫循环移位密码。它的加密方法就是将文中的每个字母用此字符在字母表中后面第K 个字母替代。它的加密过程可以表示为下面的函数: E(m)=(m+k) mod n 其中,m 为明文字母在字母表中的位置数;n 为字母表的字母个数;k 为密钥;E(m)为 密文字母在字母表中对应的位置数。 例如,对于明文字母H,其在字母表中的位置数为8,设k=5,则按照上式计算出来的 密文为L,计算过程如下: E(8)=(m+k) mod n=(8+5) mod 26=13=I 2. 置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现 明文信息的加密。置换密码有时又称为换位密码。 矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给定的顺序安排在 一个矩阵中,然后根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。例如,明文为attack begins at five,密钥为cipher,将明文按照每行6 个字母的形式排在矩阵中,形成如 下形式: a t t a c k b e g i n s a t f i v e 根据密钥cipher 中各字母在字母表中出现的先后顺序,给定一个置换:

信息安全 实验一 古典密码算法C语言

信息安全实验报告 课程名称: _ 专业:计算机科学与技术 _2010_级_02班 实验编号:实验项目_ 指导教师_ _ 姓名:闫斌学号: 2010012854 实验成绩:___ 实验一古典密码算法 实验名称:古典密码算法 实验类型: 设计性实验 学时:4 适用对象: 信息安全 1.实验原理 古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。 2.实验目的 通过变成实现替代密码算法和置换密码算法,加深对古典密码体质的了解,为深入学习密码学奠定基础。 3.实验环境 运行windows或linux操作系统的pc机,具有gcc(linux)、VC(Windows)等C语言编译环境。 4.实验内容 4.1替代密码算法 4.1.1 根据实验远离部分对替代密码算法的介绍,创建明文信息,并选择一个密钥k,编写替代密码算法的实现程序,实现加密和解密操作。 替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。 4.1.2 替代密码算法的远离是使用替代法进行加密,就是将明文的字符用其他字符替代后形成密文。例如字母a、b、c、d,用D、E、F、G做对应替换后形成密文。 4.1.3 代码

#include #include #include #define N 500 int main() { /*--------------------------------*/ int i=0,k,m,n,l; char str1[N],str2[N]; /*C=M+K...K is key...*/ clrscr(); /*--------------------------------*/ printf("This is a code password program......\n"); printf("Please input proclaimed in writing(M)::\n"); gets(str1);/*输入要加密的明文M*/ printf("Please input the key(K)(int)::\n"); scanf("%d",&k);/*输入密钥K*/ m=strlen(str1);/*测试明文的长度*/ printf("The M length is %d\n",m); printf("\n *\n *\n *\n***\n *\n"); printf("ciphertext(C) is ::\n\n"); for(i=0;i96&&n<123)/*对小写进行加密*/ { n=(n-97+k)%26; if(n<0) n=26+n; l=(char)(n+97); printf("%c",l); str2[i]=l; } else if(n>64&&n<91)/*对大写进行加密*/ { n=(n-65+k)%26; if(n<0)

古典加密实验报告

古典密码算法 一、实验目的 学习常见的古典密码学算法,通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 二、实验要求 分析替代密码算法和置换密码算法的功能需求,详细设计实现替代密码算法和置换密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。替代密码算法和置换密码算法的实现程序必须提供加密和解密两个接口:int encrypt()和int decrypt()。当加密或者解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR。 三、实验原理 古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。下面介绍两种算法:替代密码和置换密码。 1.替代密码的原理是使用替代法进行加密,就是将明文由其它的字母、数字或符合所代替后形成密文。这里每个明文字母对应的密文字母可能是一个,也可能是多个。接收者对密文进行逆向替换即可得到明文。 2.置换密码算法的原理是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。置换密码有时又称为换位密码。 我实验过程中替代密码是单表替换,用字母的下一个字母代替:for(j = 0; j < i; j++)

{ if(96 < Mingwen[j]&&Mingwen[j] < 123) { Miwen[j] = 'a' + (Mingwen[j] - 'a' + 1) % 26; } else { Miwen[j] = 'A' + (Mingwen[j] - 'A' + 1) % 26; } } 置换加密主要是对密钥进行整理,还有就是动态分配二维数组,将明文和密文填充置的过程,换密码关键代码如下: for(a = 0; a < k; a++) { for(b = 0; b < hang; b++) { Miwen[i] = p[b][ord[j]]; i++; } j++; } for(a = 0; a < 26; a++) { for(b = 0; b < k; b++) { if(key1[b] == alphatable[a]) { ord[b] = ind++; } } } 具体加密见下图:

古典密码算法

实验一古典密码算法 古典密码算法曾经被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要对象是文字信息,利用密码算法实现文字信息的加密和解密。古典密码学可以分为代替密码(也叫做移位密码)和置换密码(也叫做换位密码)两种,其中代替密码典型的有Caesar密码,数乘密码和仿射变换等,置换密码有单表置换和多表置换等。 一、实验目的 1.理解代替密码学加密过程 2.理解置换密码学加密过程 二、实验环境 Windows,交换网络结构,每组2人,VC++6.0,密码工具 三、实验原理 1.Caesar(恺撒)密码 Caesar密码是传统的代替加密法,当没有发生加密(即没有发生移位)之前,其置换表如1-1所示。 加密时每一个字母向前推移k位,例如当k=5时,置换表如1-2所示。 于是对于明文:data security has evolved rapidly 经过加密后就可以得到密文:IFYF XJHZWNYD MFX JATQAJI WFUNIQD 若令26个字母分别对应整数0~25,如表1-3所示。 则Caesar加密变换实际上是: c = (m + k) mod 26

其中m是明文对应的数据,c是与明文对应的密文数据,k是加密用的参数,也称为密钥。 很容易得到相应的Caesar解密变换是: m = D(c) = (c – k) mod 26 例如明文:data security 对应的数据序列: 3 0 19 0 18 4 2 20 17 8 19 24 当k = 5时经过加密变换得到密文序列: 8 5 24 5 23 9 7 25 22 13 24 3 对应的密文为: I F Y F X J H Z W N Y D 2.单表置换密码 单表置换密码也是一种传统的代替密码算法,在算法中维护着一个置换表,这个置换表记录了明文和密文的对照关系。当没有发生加密(即没有发生置换)之前,其置换表如1-4所示。 在单表置换算法中,密钥是由一组英文字符和空格组成的,称之为密钥词组,例如当输入密钥词组:I LOVE MY COUNTRY后,对应的置换表如表1-5所示。 在表1-2中 ILOVEMYCUNTR是密钥词组I LOVE MY COUNTRY略去前面已出现过的字符O 和Y依次写下的。后面ABD……WXZ则是密钥词组中未出现的字母按照英文字母表顺序排列成的,密钥词组可作为密码的标志,记住这个密钥词组就能掌握字母加密置换的全过程。 这样对于明文:data security has evolved rapidly,按照表1-2的置换关系,就可以得到密文:VIKI JEOPHUKX CIJ EQDRQEV HIFUVRX。 四、实验步骤 主机A、B为一组,C、D为一组,E、F为一组。首先使用“快照X”恢复Windows系统环境。 1.Caesar密码 (1)手动完成Caesar密码 1)在实验原理部分我们已经了解了Caesar密码的基本原理,那么请同学们写出当密 钥k=3时,对应明文:data security has evolved rapidly的密文: _______________________________________________________________________。 2)进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点击 “Caesar密码”。在明文输入区输入明文:data security has evolved rapidly。

多表古典密码的乘法加密运算

多表古典密码的乘法加密运算 实验目的: 1. 熟练掌握多表古典密码简单乘法加密算法原理及实现; 2. 掌握多表古典密码简单乘法加密算法的应用; 实验内容: 1、写出多表(双表)古典密码的乘法加密运算的算法、程序设计; 2、输入模q(根据明文确定)及加密密钥k1,k2对下列明文进行加法加密: A graph is finite if both its vertex set and edge set are finite. In this book we study only finite graphs, and so the term ‘graph’ always means ‘finite graph’. (注:标点符号及空格也算一个符号,忽略大小) 3、求出相对应于上述q和k的解密密钥。 实验结果: 1.(1)写出多表古典密码简单乘法加密算法如下: Step1:确定k和q的值; Step2:输入相应的密文; Step3:作变换c=(mi*ki) mod q,字母用ASCII码变为数字后计算; Step4:得到相对应的明文; Step5:逐一输出明文; 程序如下: #include #include #include main() { char M[200]; char C[200]; int K[200],q=26,i,j; srand( (unsigned)time( NULL ) );

for(j=0;j<=200;j++) { K[j]=rand()%50; } printf("please input chars:\n"); gets(M); for(i=0;M[i]!='\0';i++) { if(M[i]>='a'&&M[i]<='z') { C[i]=((M[i]-'a'+1)*K[i])%q+'a'; } else if(M[i]>='A'&&M[i]<='Z') { C[i]=((M[i]-'A'+1)*K[i])%q+'A'; } else C[i]=M[i]; } C[i]='\0'; printf("The result is:\n%s\n",C); getch(); } 2.进行乘法加密后的结果为:

古典加密算法

实习一古典加密算法 一、实习目的 ⒈熟悉Java平台开发环境; ⒉理解常见古典加密算法如:凯撒密码、多码替代密码、多字母替代密码、多表代替密码; ⒊理解古典加密中的替换、置换技术。 二、实习要求 ⒈实习前认真预习相关的内容; ⒉对实习内容中给定的题目上机前先进行程序的编写和数据的准备; ⒊上机编辑、调试、运行程序,并保存最终程序,然后撰写实习报告; ⒋实习报告需按专门的报告纸书写,内容包括:实习名称、实习目的、内容、操作过 程、程序清单、运行结果、实习中出现的问题及解决方法、实习体会等。 三、实习内容 ⒈[问题描述] 凯撒密码是把字母表中的每个字母用该字母后的某个字母进行替代。 凯撒密码的通用加密算法是:C=E(p)=(p+k) mod (26) 0’z’)则减去26。 四、实习参考程序 caeser.java import java.util.Scanner; public class caeser {

实验一 古典密码算法

实验一古典密码算法 实验名称:古典密码算法 实验类型: 设计性实验 学时:4 适用对象: 信息安全 一、实验目的 学习常见的古典密码学算法,通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 二、实验要求 分析替代密码算法和置换密码算法的功能需求,详细设计实现替代密码算法和置换密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。替代密码算法和置换密码算法的实现程序必须提供加密和解密两个接口:int encrypt()和int decrypt()。当加密或者解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR。 三、实验原理 古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。 1.替代密码 替代密码的原理是使用替代法进行加密,就是将明文由其它的字母、数字或符合所代替后形成密文。这里每个明文字母对应的密文字母可能是一个,也可能是多个。接收者对密文进行逆向替换即可得到明文。替代密码有五种表现形式: ○1单表代替 即简单替代密码或者称为单字母代替,明文字母表中的一个字符对应密文字母表中的一个字符。这是所有加密中最简单的方法。 ○2多名码代替 就是将明文字母表中的字符映射为密文字母表中的多个字符。多名码简单代替早在1401年就由DuchyMantua公司使用。在英文中,元音字母出现频率最高,降低对应密文字母出现频率的一种方法就是使用多名码,如e可能被密文5、13或25替代。 ○3多音码代替 就是将多个明文字符代替为一个密文字符。比如将字母“i” 和“j”对应为“K”,“v”和“w”代替为“L”最古老的这种多字母加密始见于1563年由波他的《密写评价》(De furtiois literarum notis)一书。 ○4多表代替 即由多个简单代替组成,也就是使用了两个或两个以上的代替表。比如使用有5个简单代替表的代替密码,明文的第一个字母用第一个代替表,第二个字母用第二个表,第三个字母用第三个表,以此类推,循环使用这五张代替表。多表代替密码由莱昂.巴蒂斯塔于1568年发明,著名的维吉尼亚密码和博福特密码均是多表代替密码。 下面我们介绍一种典型的单表替代密码——凯撒(Caesar)密码,又叫循环移位密码。它的加密方法就是将明文中的每个字母用字母表中该字母后的第R个字母来替换,达到加密的目的。它的加密过程可以表示为下面的函数:

古典密码课程设计

目录 论文摘要 (2) 设计任务及要求 (3) 1、设计任务 (3) 2、设计要求 (3) 第一章凯撒密码 (4) 一、凯撒密码的原理 (4) 二、凯撒密码的改进及评价 (4) 三、凯撒密码的流程图及程序 (6) 第二章仿射密码 (8) 一、仿射密码的原理 (8) 二、仿射密码的流程图及程序 (9) 第三章栅栏置换密码技术 (14) 一、栅栏置换密码技术的原理 (14) 二、栅栏置换密码技术的流程图及程序 (15) 心得体会 (20) 参考文献 (21)

论文摘要 密码技术已被广泛应用到了信息技术的许多领域,是实现信息系统的关键技术之一,在保障网络信息安全的应用中具有重要地位。密码技术的研究内容除传统的信息机密性保护技术外,还包括数字签名、报文和身份鉴别、密钥管理、安全协议等与信息安全密切相关的重要内容。密码学是信息安全、通信工程、计算机科学、信息管理、电子商务等学科的专业基础课程及重要的教学内容。 保护数据的方法属于密码学范畴。密码学是结合数学、计算机科学、电子与通信等诸多科学于一身的交叉学科。它以研究数学保密为目的,对存储或者传输的信息采取秘密的交换以防止第三者对信息的窃取。密码学包括两个领域:密码编码学和密码分析学。 密码系统按将明文转换为密文的操作类型分为:替代密码和置换密码。替代是古典密码中用到的最基本的处理技巧之一,它在现代密码学中也得到广泛的应用。所谓替代就是将明文中的一个字母由其他字母、数字或符号替代的一种方法。置换密码又称为换位密码,这种密码通过改变明文消息个元素的相对位置,但明文消息元素本身的取值或内容形式不变,而替代密码中,可以认为是保持明文的符号顺序,但是将它们用其他符号代替。 本论文将介绍了两种替代密码:凯撒密码和仿射密码,一种置换密码:栅栏置换密码技术。

密码学-实验一 古典密码算法

实验一古典密码算法 1、目的 使学生认识理解古典密码算法:凯撒密码算法,维吉尼亚密码算法。 2、环境 PC 1 台、安装软件VC60、JBuilder8、Delphi7。 3、预备知识 1.凯撒密码的过程: 表1:字母编码表

的原始字母位移加密法(shift cipher):模数计算。E k(x)=(x+k)mod 26,D k(y)=(y –k)mod 26 如:k=5;“hello world”加密为:mjqqt…. 2.维吉尼来密码 维吉尼来方阵:(不区分大小写)

数学表达式: =+ C i P i K i []([][])%26;验证:V[0,0]=0;V[25,25]=24 V[13,12]=25 解密: =- P i C i K i []([][])%26;

如:k=”BEST”;“HELLO WORLD”加密为:IIDE…. 4字符一组: hell OWOR LD BEST BEST BEST 以第一行字母为列标,2行为行标(B,H)=I; 解密: IIDE BEST, 明文字母是B行字母为I 的列号H,或B列=I的行H。 4、方法和步骤

(1)请根据算法的描述和你对算法过程的理解,选用一种编程语言C,C++,Java,Pascal来实现凯撒算法,照实验报告之要求;将解密,将密文为结果写于实验报告上。 (2)请根据算法的描述和你对算法过程的理解,选用一种编程语言C,C++,Java,Pascal来实现维吉尼亚算法,照实验报告之要求;将解密,,将密文为结果写于实验报告上.附参考

源程序:Vigenere.cpp.pdf 5、注意 算法要实现加密过程和解密过程并对正确性设计验证途径。

密码学实验1古典密码算法

密码学实验1古典密码算法 一(实验原理 古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。 1( 替代密码 替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。例如:明文字母 a、b、c、d ,用 D、E、F、G做对应替换后形成密文。 替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。下面我们介绍一种典型的单表替代密码,恺撒(caesar)密码,又叫循环移位密码。它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第 k个字母替代。它的加密过程可以表示为下面的函数: E(m)=(m+k) mod n 其中:m 为明文字母在字母表中的位置数;n 为字母表中的字母个数;k 为密钥;E(m)为密文字母在字母表中对应的位置数。例如,对于明文字母 H,其在字母表中的位置数为 8,设 k=4,则按照上式计算出来的密文为 L: E(8) = (m+k) mod n = (8+4) mod 26 = 12 = L 2( 置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码有时又称为换位密码。

矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。例如,明文为 attack begins at five,密钥为 cipher,将明文按照每行 6 列的形式排在矩阵中,形成如下形式: a t t a c k b e g i n s a t f i v e 根据密钥 cipher中各字母在字母表中出现的先后顺序,给定一个置换: 1 2 3 4 5 6 f = 1 4 5 3 2 6 3 列,根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第 5 列,第第 2列,第 6 列的顺序排列,则有下面形式: a a c t t k b i n g e s a I v f t e 从而得到密文:abatgftetcnvaiikse 其解密的过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。二(实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 三(实验环境 运行 windows 或 linux 操作系统的 PC 机,具有 gcc(linux)、VC(windows)等 C语言编译环境。

古典密码实验报告

哈尔滨工程大学 实验报告 实验名称:古典密码算法 班级: 学号: 姓名: 实验时间:2014年4月 成绩: 指导教师: 实验室名称: 哈尔滨工程大学实验室与资产管理处制

一、实验名称古典密码算法 二、实验目的 通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。 三、实验环境(实验所使用的器件、仪器设备名称及规格) 运行Windows 或Linux 操作系统的PC 机,具有gcc(Linux)、VC(Windows)等C 语言编译环境。 四、实验任务及其要求 (1)根据实验原理部分对移位密码的介绍,自己创建明文信息,并选择一个密钥,编 写移位密码的实现程序,实现加密和解密操作。 (2)根据实验原理部分对维吉尼亚密码的介绍,自己创建明文信息,并选择一个密钥, 编写维吉尼亚密码的实现程序,实现加密和解密操作。 (3)根据实验原理部分对周期置换密码的介绍,自己创建明文信息,并选择一个密钥, 编写周期置换密码的实现程序,实现加密和解密操作。 (4)根据实验原理部分对列置换密码的介绍,自己创建明文信息,并选择一个密钥, 编写列置换密码的实现程序,实现加密和解密操作。 五、实验设计(包括原理图、真值表、分析及简化过程、卡诺图、源代码等) 1.移位密码 移位密码(Shift Cipher)是一种典型的单表替代密码,也称为加法密码。 移位密码的加密方法就是将明文中的每个字母用其在字母表后面的第k 个字母替代,它的加密过程可以表示为: c = (m + k) mod n 其中,m 为明文字母在字母表中的位置数;n 为字母表中的字母总数;k 为密钥; c 为密文字母在字母表中对应的位置数。相应的,移位密码的解密过程可以表示为:m = (c - k) mo d n 移位密码的一个典型代表就是凯撒密码(Ceaser Cipher),它是k=3 时的移位密码。使用英文字母表的撒密码的加(解)密可以表示为:m = (c + 3) mod 26 m = (c - 3) mod 26,例如, 明文:attacks at nine am

两种基本古典密码设计与实现

实验二两种基本古典密码设计与实现 091234 谢锦仪一、实验目的: 该实验为验证性实验。 通过本实验,使学生对于两种基本的古典密码编码方法(“代替”与“移位”)产生深刻的感性认识,体验清楚二者之间的本质差异,为理解和掌握现代密码的相应知识打下良好基础。 二、实验内容: 1.设计一个周期3的多表代换并予以实现,要求:第一个表有密钥字法产生(密钥字自拟),第二个表由洗牌法产生(注意,字母a~z与数字0~25一一对应,洗牌法即相当于实验一的方法1(n=25)),第三个表由公式法产生(数学公式自拟,注意它须是Z26上的一个一一变换)。 2.设计一个周期5的16-置换移位密码并予以实现,要求:5个16-置换至少有一个是由实验一(n=15)提供的两个方法以为、自行设计的其它方法产生。 三、实验要求: 1. 上述两个古典密码的编程实现,须能对下面一段明文进行正确加密(对代 替密码,空格和标点符号保持不动;对移位密码,空格和标点符号也移位): Q is a symmetric block cipher. It is defined for a block size of 128 bits. It allows arbitrary length passwords. The design is fairly conservative. It consists of a simple substitution-permutation network. In this paper we present the cipher, its design criteria and our analysis. The design is based on both Rjindael and Serpent. It uses an 8-bit s-box from Rjindael with the linear mixing layers replaced with two Serpent style bit-slice s-boxes and a linear permutation. The combination of methods eliminates the high level structure inherent in Rjindaelwhile having better speed and avalanche characteristics than Serpent. Speedis improved over Serpent. This version 2.00 contains better analysis, editorialchanges, and an improved key scheduling algorithm. The number ofrecommended rounds is also increased. 2. 抓图显示密文(附页),不能出现明显错误。 四、实验步骤: 1、实验思路 对于代替密码,难点是大小写的转化和保持加密后大小写的不变。这里利用了专门的字符处理函数库ctype。用Tolower函数将大写转化为小写,然后转化为数字。这样才能容易的实现代替加密的过程。在密钥字算法的实现中,利用字符串处理函数的功能,在拼接比较后,录入到choicewords中,最后进入keytab,作为密钥的一部分。洗牌法我用的是实验一自己设计的方法,很简单就融入了这个程序之中。 移位密码:由于老师要求用一种全新的产生全排列的方法,我于是想到了RSA公钥体制。这里面RSA算法是密码学三大算法之一(RSA、MD5、DES),是一种不对称密码算法。

实验1-古典密码算法剖析

实验1-古典密码算法 一、实验目的 通过编程实现替代密码算法和置换密码算法,加深对古典密码体系的了解,为以后深入学习密码学奠定基础。 二、实验原理 古典密码算法曾被广泛应用,大都比较简单。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。其中替代密码和置换密码是具有代表性的两种古典密码算法。 1、替代密码 替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其他字符替代后形成密文。例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。 最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。它的加密过程可以表示为下面的函数: E(m) = (m+k ) mod n 其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。 例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L,计算过程如下: E(8) = (m+k ) mod n = (8+4 ) mod 26 = 12 = L 解密算法是:m = D(L) =(L-k)mod 26 2、置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码又称为换位密码。 矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给定的顺序安排在一个矩阵中,然后又根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。例如,明文为 attack begins at five ,密钥为 cipher ,将明文按照每行6个字母的形式排在矩阵中,形成如下形式: a t t a c k b e g i n s a t f i v e 根据密钥 cipher 中各字母在字母表中出现的先后顺序,得到给定的一个置换: f = 1 4 5 3 2 6 因此有: 密钥: 1 4 5 3 2 6 明文: a t t a c k b e g i n s a t f i v e 根据上面的置换,将原有矩阵中的字母按照第1列、第4列、第5列、第3列、第2列、第6列的顺序排列、则有下面的形式:

实验一古典密码算法_信息安全

第一部分信息保密技术 信息的加密变换是目前实现安全信息系统的主要手段,通过利用不同的加密技术可以对信息进行变换,从而实现信息的保密和隐藏。信息保密技术是信息安全的基础内容,本实验从密码算法和信息隐藏两方面对信息保密技术进行介绍,并通过具体实验加深读者对信息保密技术的理解和掌握。 研究信息加密和解密变换学科称为密码学,密码学是信息保密技术的核心。它是一门古老而深奥的学科,按照发展进程来看,密码学经历了古典密码、对称密钥密码和公开密钥密码三个阶段。本实验分别介绍了古典密码算法的替代加密算法、置换加密算法

实验1 古典密码算法 一.实验原理 古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。 1.替代密码 替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。例如:明文字母a、b、c、d ,用D、E、F、G做对应替换后形成密文。 替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。下面我们介绍一种典型的单表替代密码,恺撒(caesar)密码,又叫循环移位密码。它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代。它的加密过程可以表示为下面的函数: E(m)=(m+k) mod n 其中:m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。 例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L: E(8) = (m+k) mod n = (8+4) mod 26 = 12 = L 2.置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码有时又称为换位密码。 矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。例如,明文为attack begins at five,密钥为cipher,将明文按照每行6列的形式排在矩阵中,形成如下形式: a t t a c k b e g i n s a t f i v e 根据密钥cipher中各字母在字母表中出现的先后顺序,给定一个置换: 1 2 3 4 5 6 f = 1 4 5 3 2 6 根据上面的置换,将原有矩阵中的字母按照第1列,第4列,第5列,第3列,第2列,第6列的顺序排列,则有下面形式: a a c t t k b i n g e s a i v f t e 从而得到密文:aba aiicnvtgftetkse 其解密的过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。

实验一 古典密码算法

练习一Caesar密码 实验目的1.理解替代密码加密过程 实验人数每组2人 系统环境Windows 网络环境交换网络结构 实验工具VC++6.0、密码工具 实验类型综合型 一、实验原理 详见“信息安全实验平台”。 二、实验步骤 本练习主机A、B为一组,C、D为一组,E、F为一组。首先使用“快照X”恢复Windows系统环境。 1. 手动完成Caesar密码 (1)在实验原理部分已经了解了Caesar密码的基本原理,请写出当密钥k=3时,对应明文:data security has evolved rapidly的密文: gdwd vhfxulwb kdv hyroyhg udslgob。 (2)进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点击“Caesar密码”。在明文输入区输入明文:data security has evolved rapidly。将密钥k调节到3,查看相应的密文,并与手动加密的密文进行比较。请根据密钥验证密文与明文对应关系是否正确。 正确 2. Caesar加密

(1)进入“加密解密”|“Caesar密码”视图,在明文输入区输入明文(明文应为英文),单击“加密”按钮进行加密。请将明文记录在这里:el psy congroo。(2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值,并记下该密钥k值用于同组主机的解密。加密工作完成后,单击“导出”按钮将密文默认导出到Caesar共享文件夹(D:\Work\Encryption\Caesar\)中,默认文件名为Caesar密文.txt。 (3)通知同组主机接收密文,并将密钥k通告给同组主机。 (4)单击“导入”按钮,进入同组主机Work\Encryption\Caesar目录(\\同组主机IP\Work\Encryption\Caesar),打开Caesar密文.txt。 (5)调节密钥k的微调按钮或对照表的移位按钮,将k设为同组主机加密时的密钥k值,这时解密已经成功。请将明文写出: el psy congroo。 (6)将解密后的明文与同组主机记录的明文比较,请对比明文是否相同。 3. Caesar密码分析 (1)本机进入“密码工具”|“加密解密”|“Caesar密码”,在明文输入区输入明文(要求明文有一定的意义以便让同组主机分析)。请将明文记录在这里:SteinsGate。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值完成Caesar加密,单击“导出”按钮,将密文默认导出到Caesar共享文件夹中。(3)通告同组主机(不要通告密钥值k)密文已经放在共享文件夹中,让同组主机获取密文。 (4)单击“导入”按钮将同组主机Caesar密文导入。

实验一 古典加密算法

实验一古典加密算法 一、实习目的 1、熟悉java平台的开发环境 2、理解常见古典加密算法:凯撒密码、多字母替代密码、多表替代密码 3、理解古典加密技术中的替换技术、置换技术。 二、实习内容 1、问题描述 凯撒密码是把字母表中的每个字母用该字母后的某个字母进行代替。 凯撒密码的通用加密算法是:C=E(p)=(P+K)mod26 0’z’,则应该减去26,同理c<’A’,则应该加上26,如果 c>’Z’,则应该减去26. 四、实现测试 运行界面如下:

测试一:输入一串字符sdfasdfsd,输入一个正整数5,运行结果如下: 测试二:输入同测试一相同的一串字符sdfasdfsd,输入一个负整数-5,运行结果如下:

测试三:输入一串字符xyzxxxy,输入一个正整数5,此时已经超界,运行结果如下: 测试四:当输入的字符中有数字等非字母字符时例如sdf323,此时加密内容不合理,运行结果如下:

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