AES( 高级加密标准 ) 实验
对称密钥密码的概念 对称密钥密码也叫传统密钥密码体制,其基本思想就是“加密密钥和解密密钥相同或相近”,由其中一个可推导出另一个。使用时两个密钥均需保密。 传统密钥密码算法有:  DES 、 IDEA 、 TDEA(3DES) 、 MD5 、 RC5 等,典型的算法是 DES 算法。
对称密钥加密技术描述 在对称加密技术中,加密和解密过程采用一把相同的密钥,通信时双方都必须具备这把密钥,并保证密钥不被泄露 . 通信双方采用对称加密技术进行通信时,必须先约定一个密钥,这种约定密钥的过程称为“分发密钥”。有了密钥后,发送方使用这一密钥,并采用合适的加密算法将所要发送的明文转变为密文。密文到达接收方后,接收方用解密算法 ( 通常是发送方所使用的加密算法的逆 ) ,并把密钥作为算法的一个运算因子,将密文转变为原来的明文。
对称密钥图示
对称密钥特点 对称加密技术的安全性依赖于以下两个因素 :  第一,加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的;第二,加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,没有必要确保算法的秘密性,而需要保证密钥的秘密性。对称加密算法的突出优点是实现速度快。对称加密系统的这些特点使其有着广泛的应用。
对称密钥的局限性 因为算法不需要保密,所以制造商可以开发出低成本的芯片以实现数据加密。这些芯片有着广泛的应用,适合于大规模生产。 对称加密系统最大的局限性问题是密钥的分发和管理非常复杂、代价高昂。对称加密算法另一个缺点是不能实现数字签名。
AES 的起源 1997 年 9 月, NIST 征集 AES 方案,以替代传统对称密钥技术 DES 。 1999 年 8 月,以下 5 个方案成为最终候选方案: MARS,  RC6,  Rijndael,  Serpent,  Twofish 。 2000 年 10 月,由比利时的 Joan  Daemen 和 Vincent Rijmen 提出的 Rijndael 算法最终胜出。  Rijndael 是一个分组密码算法,其分组长度和密钥长度相互独立,都可以改变。
AES 的设计原则 能抵抗所有已知的攻击; 在各种平台上易于实现,速度快; 设计简单。
使用 Java 技术实现荣戴尔算法 在 Jdk1.5 之后, Sun 公司在 Java 中添加了实现荣戴尔算法的类和接口,使得使用 java 语言来进行对称加密变的简单了。 由于其它语言目前尚没有太完善的解决方案,所以本次实验建议使用 Java 语言来实现。
加密过程 1- 生成密钥 String st = keyPanel.getText();// 取得系统自动生成密钥 // 判断是否满足 32 位密钥的要求,如果小于 32 则要增加到 32 位 if (st.length() < 32) {// 如果密钥小于 32 位,则系统提示需要增加 JOptionPane.showMessageDialog(this, &quot; 秘钥长度不符合要求,这里对输入秘钥进行随机填充,以使得秘钥达到 128 比特! &quot;); char[] charset = { ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’,‘6’, ‘7’, ‘8’, ‘9’, ‘A’ ,‘ B’, ‘C’, ‘D’,‘E’, ‘F’ };// 填充进来的数据 while (st.length() < 32) {// 循环增加,直到满足 32 位要求 char ch = charset[(int) (Math.random() * 16)]; st = st + ch;} keyPanel.setText(st);// 增加结束后,把新的密钥添加到密钥面板上。
加密过程 1- 生成密钥(续) // 如果自动生成的密钥大于 32 位,则截取 32 位( 128 比特) } else if ((st.length() != 32) && (st.length() != 48) && (st.length() != 64)) { JOptionPane.showMessageDialog(this, &quot; 秘钥长度不符合要求,这里截取输入数据前 128 比特作为秘钥! &quot;); st = st.substring(0, 32);// 进行截取,求字串 keyPanel.setText(st); }
使用 java 类进行加密运算 st = inputPanel.getText();// 提取明文 SecretKeySpec key = new  // 创建 AES 加密对象 SecretKeySpec(Tool .string2bytes(&quot;AES&quot;); Cipher cipher = Cipher.getInstance(&quot;AES&quot;); // 进行 AES 加密 cipher.init(Cipher.ENCRYPT_MODE, key); byte[] result = cipher.doFinal(st.getBytes());
解密 解密过程是加密过程的逆序,代码完全一直,不再累述。 参考代码 AES.java 。

Aes实验