2022年实验现代密码归类 .pdf
一、实验室名称:网络工程实验室二、实验项目名称:现代密码算法的实现三、实验学时: 2 学时四、实验原理:现代密码算法的基本原理(DES 算法, AES 算法) ;分组密码就是针对一定大小的明文,做加密解密动作。例如,在DES 系统中,每次加密或解密的分组大小均为 64 位, ,对大于 64 位的明文只要按 64 位一组进行分割,而对于小于 64 位的明文只要在后面补0 即可。五、实验目的:目的:掌握现代对称密码算法(DES 算法)的原理及用法。六、实验内容:a)熟悉 DES 密码算法的基本原理;DES 是典型的现代密码算法,遵循Feistal 结构,经过 IP 置乱、 16 轮不对称变换、 32位左右互换和 IP 逆置乱,输出密文,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - 其中每一轮的变换如下图所示:在单轮变换中, F 函数 是整个 DES 加密算法的 关键部 分,起终点有 在 s 盒:Li-132 位Ri-132 位Ci-128 位Di-128 位左移一位或两位左移一位或两位置换 /紧缩(置换 选择 2)XOR 4848 扩充 /置换(表 E)代换 /选择(S 盒)32XOR 置换(P)32LiRiCiDi48 KiF 初始 置换置换 选择 1 64 位明文64 位密 钥第 1 轮置换 选择 2 循环左移K1 第 2 轮置换 选择 2 循环左移K2 第 16 轮置换 选择 2 循环左移K16 32 位互换逆初始 置换64 位密文名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - F 函数一次运算有两个 输入数据 :一个是 32 位的中 间密文 R,另一个是 48位的中间子密钥 k。32 位的中 间密文先经过扩展置换 E,即扩增为 48 位,接着和另一组输 入 48位的子密钥 k 做位异或运算,所得的结果,平均分配给 8 个 S盒。每个 S 盒经过非线性 的查表运 算,将 6 位输入变换为 4 位输出,所 以经过S 变换后, 总的输出 数据位 32 位,再经过置换 P 后,得到本轮的 32 位输出。b)分析 DES 算法;根据 Java提供的 DES 函数进行编程。七、实验器材(设备、元器件) :PC微机一台八、实验步骤:a)使用 Java提供的安全算法前必须包含import java.io.*; import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; b)异常的处理使用密码 时,会遇到 大量的异常,因此,必须对异常进行处理,例如:public static void main(String args) throws Exception . 或者使用 try catch 语句对语句块 进行处理。c)掌握密 钥的构造KeyGenerator kg=KeyGenerator.getInstance(DESede); kg.init(168); SecretKey k=kg.generateKey( ); Java 中 KeyGenerator 类中提供了创建 对称密 钥的方法。Java中的类一名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - 般使用 new 操作符通过构造器创建 对象,但 KeyGenerator 类不是这样, 它预定义了一个静态方法 getInstance ( ) ,通过它获得 KeyGenerator 类型的对象。这种类成为工厂类或工厂。方法 getInstance ( )的 参数为字符串类型,指定加密算法的 名称。可以是“ Blowfish ” 、 “ DES”、 “ DESede ”、 “ HmacMD5” 或“ HmacSHA1” 等。这些算法都可以实现加密, 这里我们不关心这些算法的 细节,只要知道其使用上的特点即可实现 程序设计 。该步骤 一般指定密钥的长度。如果该步骤省略 的话,会根据 算法自动使用默 kg.init(168);认的密钥长度。指定长度时,若第一步密钥生成器使用的是“ DES” 算法, 则密钥长度必须是 56位; 若是“ DESede”, 则可以是 112或 168位,其中112 位有效;若是“ AES”,可以是 128, 192 或 256 位; 若是“ Blowfish ”,则可以是 32 至 448 之间可以被 8 整除的数; “ HmacMD5”和“ HmacSHA1” 默认的密钥长度都 是 64 个字节。d)掌握密 钥的保存方法序列化 方式保存FileOutputStream f=new FileOutputStream(key1.dat); ObjectOutputStream b=new ObjectOutputStream(f); b.writeObject(k); 按字节保存byte kb=k.getEncoded( ); FileOutputStream f2=new FileOutputStream(keykb1.dat); f2.write(kb); / 打印密钥编码中的 内容for(int i=0;ikb.length;i+) System.out.print(kbi+,); e)掌握使用 Java实现对文 档的加密的 方法名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - - 建议在另一个工程中进行文 件的加解密 处理,否者每运行一次 程序就会随机生成一次密 钥。/首先读出密钥:/以对象方式读取 密钥FileInputStream f2=new FileInputStream(key1.dat); ObjectInputStream b=new ObjectInputStream(f2); Key k=(Key)b.readObject( ); /以字节方式读取 密钥FileInputStream f2=new FileInputStream(keykb1.dat); int num2=f2.available(); byte keykb=new bytenum2; f2.read(keykb); SecretKeySpec k=new SecretKeySpec(keykb,DESede); /加密处理String s=班级 xx x 学号 xxx 姓名 xxx; Cipher cp=Cipher.getInstance(DESede); cp.init(Cipher.ENCRYPT_MODE, k); byte ptext=s.getBytes(UTF8); for(int i=0;iptext.length;i+) System.out.print(ptexti+,); System.out.println(); byte ctext=cp.doFinal(ptext); /在屏幕上显 示密文for(int i=0;ictext.length;i+) System.out.print(ctexti +,); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - - /将密文写入文件中FileOutputStream f2=new FileOutputStream(SEnc.dat); f2.write(ctext); 分析:Cipher 类是一个工厂类, 它不是通过 new 方法创建对象, 而是通过其中预定义的一个静态方法 getInstance ( )获取 Cipher 对象。getInstance ( )方法的参数是一 个字符串,该字符串给出 Cipher 对象应该执行哪些操作,因此 把传入的字符串称为 转换( transformation) 。通常通过它指定加密算法或解密所用的算法的名字,如本例的 DESede。此外还可以同时指定反馈模式 及填充方案等,如DESede/ECB/PKCS5Padding 。反馈模式及填充方案的概念和用途将在后面的 章节介绍 。初始化密码器cp.init(Cipher.ENCRYPT_MODE, k); 分析:该步骤执 行 Cipher 对象的 init()方法对 Cipher 对象进行初始化。该方法包括两个参数,第一个参数指定密码 器准备进行加密 还是解密,若传入 Cipher.ENCRYPT_MODE 则进入加密模式。第二个参数则传入加密或解密所 使用的密 钥,即第 1 步从文件中读取的密钥对象 k。String s=班级 xx x 学号 xxx 姓名 xxx ; byte ptext=s.getBytes(UTF8); 分析:Cipher 对象所作的 操作是针对 字节数组的,因此需要将要加密的内容转 换成字节 数组。本例中要加密的是一 个字符串 s,可以使用字符串的getBytes( )方法获得对应的字节数组。getBytes( )方法中必须使 用参数UTF8指定。byte ctext=cp.doFinal(ptext); 分析:执行 Cipher 对象的 doFinal( )方法,该方法的参数中传入待加密的明文,从而按照前面几步设置的算法及 各种模式 对所传入的明文进行加密操作, 该方法返回加的结 果。f)加密密文的 正确性验证我们使用解密 来验证 密文的 正确性。加密 程序很容易修改 成解密程序,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - 解密程序和加密 程序的主要区别如下:解密程序首先读取密钥/以对象方式读取 密钥FileInputStream f2=new FileInputStream(key1.dat); ObjectInputStream b=new ObjectInputStream(f2); Key k=(Key)b.readObject( ); /以字节方式读取 密钥FileInputStream f2=new FileInputStream(keykb1.dat); int num2=f2.available(); byte keykb=new bytenum2; f2.read(keykb); SecretKeySpec k=new SecretKeySpec(keykb,DESede); /然后读入密文FileInputStream f=new FileInputStream(SEnc.dat); int num=f.available(); byte ctext=new bytenum; f.read(ctext); 最后解密cp.init(Cipher.DECRYPT_MODE, k); byte ptext=cp.doFinal(ctext); String p=new String(ptext,UTF8); System.out.println(p); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 8 页 - - - - - - - - - g)调试及测试九、实验数据及结果分析:构造一段 8 字节倍数的重复明文,分 别用 EBC、CBC 加密,分 析其异同。ECB(即上文实验任务 )与 CBC 模式的主要区别在于密文的分组 链接使用和初始化向量的使用,因此使 用 CBC 模式时,需要在程序中加入下列代码:构造 IV byte rand=new byte8; Random r=new Random( ); r.nextBytes(rand); IvParameterSpec iv=new IvParameterSpec(rand); 密码器的构造Cipher cp=Cipher.getInstance(DESede/CBC/PKCS5Padding); cp.init(Cipher.ENCRYPT_MODE, k, iv); 使用 CBC 模式查看 8字节倍数的重复明文的输出 效果与 ECB 模式下有何区别。十、实验结论:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -