原阳网站建设哪家好,山东高端网站建设服务商,不允许网站建设协议,适合女生做的网站hi#xff0c;大家好#xff0c;从今天开始我们介绍加密算法中的对称加密算法。相信大家看了前几篇文章#xff0c;已经对摘要算法的使用已经有了比较深的认识#xff0c;摘要算法由于其算法特性#xff0c;只能单向加密#xff0c;无法对数据反向解密#xff0c;这时对…hi大家好从今天开始我们介绍加密算法中的对称加密算法。相信大家看了前几篇文章已经对摘要算法的使用已经有了比较深的认识摘要算法由于其算法特性只能单向加密无法对数据反向解密这时对称加密算法就出现了。对称算法主要有DES、3DES 和 AES今天我们重点介绍一下对称加密算法中的DES 算法。
DES 算法介绍
DES (Data Encryption Standard)算法是世界上最常用的加密算法。在很长时间内许多人心目中“密码生成”与DES一直是个同义词。尽管后来有个叫Electronic Frontier Foundation的组织造了台价值22万的机器尝试破解DES加密的数据直到现在DES和它的变种3DES三重数据加密算法仍然在政府和银行中被广泛使用。 注在2001年AES算法成为了DES算法的替代品。 国家标准局催生了DES
1973年5月在尼克松任期美国国家标准局下发了红头文件征求加密算法来保护传输过程中的数据。国家标准局等了很久一直没有人投标一直到1974年8月6日尼克松卸任前三天IBM才拿出了自己家开发的一套代号LUCIFER金星的东西。美国安全局评估后在1977年7月15日采用了LUCIFER的一个变种作为数据加密标准DES。
DES很快被非数字媒体采用比如电话线中的信号加密。在那些年里国际香料组织IFF曾用DES来加密那些用电话线传输的秘密配方。“With Data Encryption, Scents Are Safe at IFF,” Computerworld 14, No. 21, 95 (1980)
同时作为政府之后第二大急需加密的银行业也将DES作为广泛应用的标准美国国家标准协会ANSI制定了整个银行业的加密规范。1980年采用的ANSI X3.92指定了DES算法的应用。
DES 算法特点 DES加密算法属于对称加密加密与解密用的是同一个密钥。 DES加密算法要求密钥必须是8个字节即64bit长度有效秘钥长度为56位每个字节第8位用作奇偶校验。 因为密钥是byte[8]代表字符串也可以是非可见的字节可以与Base64编码算法一起使用。 加密、解密都需要通过字节数组作为数据和密钥进行处理。 DES 算法是两种加密技术的组合混乱和扩散。先替代后置换。 易于实现DES 算法只是使用了标准的算术和逻辑运算其作用的数最多也只有64 位因此用70年代末期的硬件技术很容易实现。
DES 算法的优缺点
优点 效率高算法简单系统开销小 适合加密大量数据 明文长度和密文长度相等
缺点 需要以安全方式进行秘钥交换 秘钥管理复杂
DES算法具有很高的安全性到目前为止除了用穷举搜索法对DES算法进行攻击外还没有发现更有效的办法。而56位长的密钥的穷举空间为256这意味着如果一台计算机的速度是每一秒种检测一百万个密钥则它搜索完全部密钥就需要将近2285年的时间可见这是难以实现的当然随著科学技术的发展当出现超高速计算机后我们可考虑把DES密钥的长度再增长一些以此来达到更高的保密程度。
DES 加密原理
DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位产生最大 64 位的分组大小。这是一个迭代的分组密码使用称为 Feistel 的技术其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能然后将输出与另一半进行异或运算接着交换这两半这一过程会继续下去但最后一个循环不交换。DES 使用 16 个循环使用异或置换代换移位操作四种基本运算。
DES的加密过程 64位密钥经子密钥产生算法产生出16个48位子密钥K1,K2,…,K16分别供第1次第2次…第16次加密迭代使用。 64位明文首先经过初始置换IP将数据打乱重新排列并分成左右两半左边32位构成L0右边32位构成R0。 第i次加密迭代由轮函数f实现子密钥Ki对Ri-1的加密结果为32位的数据组f ( Ri-1 , Ki )。f ( Ri-1 , Ki )再与Li-1模2相加又得到一个32位的数据组Li-1 ⊕ f ( Ri-1 , Ki )。以Li ⊕ f ( Ri-1 , Ki )作为下一次加密迭代的Ri以Ri-1作为下一次加密迭代的Li ( i 1,2,…,16)。 按照上一步的规则进行16次加密迭代。 第16次加密迭代结束后以R16为左L16为右合并产生一个64位的数据组。再经过逆初始置换IP-1将数据重新排列便得到64位密文。
DES的解密过程 64位密钥经子密钥产生算法产生出16个48位子密钥K1,K2,…,K16分别供第1次第2次…第16次解密迭代使用。 64位密文首先经过初始置换IP将数据打乱重新排列并分成左右两半左边32位构成R16右边32位构成L16。 第17-i次解密迭代由轮函数f实现子密钥Ki对Li的解密结果为32位的数据组f ( Li , Ki )。f ( Li , Ki )再与Ri模2相加又得到一个32位的数据组Ri ⊕ f ( Li , Ki )。以Ri ⊕ f ( Li , Ki )作为下一次解密迭代的Li-1以Li作为下一次解密迭代的Li-1 ( i 16,15,…,1)。 按照上一步的规则进行16次解密迭代。 第16次解密迭代结束后以L0为左R0为右合并产生一个64位的数据组。再经过逆初始置换IP-1将数据重新排列便得到64位明文。
DES 算法实现
对称加密算法会有不同的分组模式和填充方式这里我们使用的分组模式是ECB填充模式为NoPadding目前这种方式是比较常见的应用场景实现代码示例如下
private static final String DES_ALGORITHM DES;private static final String DES_CIPHER DES/ECB/NoPadding;// des 加密
public static byte[] encryptDES(String data, String key) throws Exception {// 生成SecretKey对象SecretKey secretKey desKeyGenerator(key);// Cipher对象实际完成加密操作Cipher cipher Cipher.getInstance(DES_CIPHER);// 用密匙初始化Cipher对象cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 执行加密操作return cipher.doFinal(data.getBytes());
}// des 解密
public static byte[] decryptDES(byte[] data, String key) throws Exception {// 生成SecretKey对象SecretKey secretKey desKeyGenerator(key);// Cipher对象实际完成解密操作Cipher cipher Cipher.getInstance(DES_CIPHER);// 用密匙初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE, secretKey);// 执行解密操作return cipher.doFinal(data);
}/*** DES Key 生成方法** param key* return
*/
private static SecretKey desKeyGenerator(String key) {try {// 创建一个DESKeySpec对象DESKeySpec desKey new DESKeySpec(key.getBytes());// 创建一个密匙工厂SecretKeyFactory keyFactory SecretKeyFactory.getInstance(DES_ALGORITHM);// 将DESKeySpec对象转换成SecretKey对象return keyFactory.generateSecret(desKey);} catch (InvalidKeyException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (InvalidKeySpecException e) {e.printStackTrace();}return null;
}/*** Nopadding填充时,明文不是8位的倍数时需补足这里补位0x00** param b* return*/
private static byte[] fillZero(byte[] b) {int len b.length;//data不足8位以0补足8位if (b.length % 8 ! 0) {len b.length - b.length % 8 8;} else {return b;}byte[] needData null;needData new byte[len];for (int i 0; i len; i) {needData[i] 0x00;}System.arraycopy(b, 0, needData, 0, b.length);return needData;
}查看完整代码请访问 https://github.com/ForTheDevelopers/JavaSecurity 应用场景
DES算法最常用的场景是银行业如银行卡收单信用卡持卡人的PIN的加密传输IC卡与POS间的双向认证、金融交易数据包的MAC校验等均用到DES算法。另外在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域DES算法也被广泛应用以此来实现关键数据的保密。
总结
上面介绍了一下DES 算法的和DES的实现3DES算法是DES的变种并不是一种新的算法这里就不做过多介绍了实现方式可以去下载完整源码查看。关于对称加密算法我们还没有完整的讨论对称加密中的分组模式以及填充模式虽然代码实现中也涉及了分组和填充下一节我们会详细介绍这部分内容。
DES算法虽然有被破解的可能但是目前依然在一些金融系统中被广泛使用尤其工作是在金融方面的小伙伴们也是需要大家去了解和掌握的以便于工作中遇到时可以有的放矢。
创作不易如果大家喜欢本文欢迎点赞转发你的关注是我们继续前进的动力_