对称加密算法的加密密钥和解密密钥相同,用密钥对原数据加密得到密文,对密文解密密得到明文,解密算法是加密算法的逆运算。
DES是最具代表性的对称加密算法,DESede是DES算法的变种又称3DES。DES算法有ecb和cbc两种模式。 AES算法作为DES的替代,更安全,性能更好。
- DES算法
模型图如下
这里采用单DES的ECB模式用代码实现
/** * DES ECB模式加解密 * @param key * @param data * @param mode 0-加密,1-解密 * @return */ public static String desecb(String key, String data, int mode) { try { DESKeySpec dks = new DESKeySpec(Hex.decodeHex(key.toCharArray())); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(dks); Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); if(mode==0){ cipher.init(Cipher.ENCRYPT_MODE, secretKey); }else{ cipher.init(Cipher.DECRYPT_MODE, secretKey); } return Hex.encodeHexString(cipher.doFinal(Hex.decodeHex(data.toCharArray()))); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (DecoderException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeySpecException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return null; }
测试代码
String key = "404142434445464748494a4b4c4d4e4f"; String data = "404142434445464748494a4b4c4d4e4f"; String encode = desecb(key, data, 1); System.out.println("DES加密后的密文:"+encode); String decode = desecb(key, encode, 0); System.out.println("DES解密后的明文:"+decode);
运行结果
DES加密后的密文:f2db549c724485f5eff4e2f84fd31835 DES解密后的明文:404142434445464748494a4b4c4d4e4f
注意:DES算法中key和data必须为8字节整数倍的HexString
- PBE算法
PBE——Password Based Encryption,基于口令加密。
DES算法密钥长度是16字节,3DES密钥长度是32字节,不方便记忆。PBE算法用口令替代密钥,口令方便记忆。比如我们登录windows操作系统就要输入一个口令。
PBE算法可以看成是消息摘要算法+对称加密算法。我们需要一个口令和盐,盐是一个随机信息。通过消息摘要算法,对口令+盐生成密钥,该密钥用于对称加密。
模型如下
PBEWITHMD5andDES模式的PBE算法实现代码
/** * 基于口令加密PBE算法 * @param password 口令 * @param data 数据 * @param salt 盐 * @param mode * 0-加密,1-解密 * @return */ public static String pbe(String password, String data, byte[] salt, int mode){ try { //转换密码 PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWITHMD5andDES"); SecretKey secretKey = keyFactory.generateSecret(keySpec); PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100); Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES"); if (mode == 0) { cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec); } else { cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec); } return Hex.encodeHexString(cipher.doFinal(Hex.decodeHex(data .toCharArray()))); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeySpecException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (DecoderException e) { e.printStackTrace(); } return null; }
测试代码
String password = "yel"; System.out.println("口令:"+password); String data = "404142434445464748494a4b4c4d4e4f"; System.out.println("原始数据:"+data); byte[] salt = new SecureRandom().generateSeed(8); System.out.println("盐:"+Hex.encodeHexString(salt)); String encode = pbe(password, data, salt, 0); System.out.println("PBE加密后的密文:" + encode); String decode = pbe(password, encode, salt, 1); System.out.println("PBE解密后的明文:" + decode);
运行结果
口令:yel 原始数据:404142434445464748494a4b4c4d4e4f 盐:d6bae74f476d8f6f PBE加密后的密文:290fae52e24e874146ca2dad8986876cc117730f09ec46ac PBE解密后的明文:404142434445464748494a4b4c4d4e4f
相关推荐
常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结
完整实验报告,共31页 包括实验目的,实验内容,实验步骤,运行结果,实验总结 附上了源码。 部分内容可见https://blog.csdn.net/guansheng123/article/details/123029969
深入浅出密码学——常用加密技术原理与应用Cryptanalysis in simple terms -- principle and application of common encryption technology
深入浅出密码学——常用加密技术原理与应用Christof Paar,Jan Pelzl 本书拥有的诸多特征使得它成为密码学从业者和学生独一无二的资源—本书介绍了绝大多数实际应用中使用的加密算法,并重点突出了它们的实用性。...
《深入浅出密码学——常用加密技术原理与应用》教程书籍,学习资源,供学术交流使用。
有DES的整个编码实现,包括明文的不限定长度,密码必须为8位,有加密和解密的全过程
DES算法为密码体制中的对称密码体制,是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。 这里以Java代码实现DES算法。
此资源包含完整代码和完整实验报告(加上你的学号姓名即可提交)
DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。
ECC非对称加密算法, 最快,最安全的加密算法
此资源包含完整代码和完整实验报告(加上你的学号姓名即可提交)
Java密码学架构中利用对称密钥加解密的一个小Demo。
内容概要:nacos1.1.4版本修改源码使用非对称加密算法RSA进行用户名和密码加密传输。 适用人群:需要适用nacos作为项目注册中心的相关人员、内网用户。 适用场景:linux或者windows系统,使用nacos作为注册中心,...
现代密码学——古典密码算法(实验报告).doc
、实验原理 信息加密根据采用的密钥类型可以划分为对称密码算法和非对称密码算法。...在对称密码算法的发展历史中曾出现过多种优秀的算法,包括DES、3DES、AES等。下面我们以DES算法为例介绍对称密码算法的实现机制。
非对称密码技术的实现 (1)熟悉RSA相关函数(公私钥生成函数,加密/解密函数); (2)利用公钥加密特定文件(test-1.txt),并用私钥进行解密;反过来,再利用私钥加密特定文件,并用公钥进行解密。对比解密后的...
信息安全与密码学范畴的RSA对称加密和解密算法
设计DES对称加密算法,利用它对简单的密码序列进行对称加密
C语言实现非对称密码算法RSA,其中RSA计算采用的是平方乘算法
现代密码学~DES加密算法实验报告.doc