DES算法源代码-JAVA_第1页
DES算法源代码-JAVA_第2页
DES算法源代码-JAVA_第3页
DES算法源代码-JAVA_第4页
DES算法源代码-JAVA_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DES算法提供CBC, OFB, CFB, ECB四种模式,MAC是基于ECB实现的。一、 数据补位DES数据加解密就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,按照需求补足8个字节(通常补00或者FF,根据实际要求不同)进行计算,之后按照顺序将计算所得的数据连在一起即可。这里有个问题就是为什么要进行数据补位?主要原因是DES算法加解密时要求数据必须为8个字节。二、ECB模式DES ECB(电子密本方式)其实非常简单,就是将数据按照8个字节一段进行DES加 密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,按照需求补足8个 字节

2、进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。三、CBC模式DES CBC(密文分组链接方式)有点麻烦,它的实现机制使加密的各段数据之间有了 联系。其实现的机理如下:加密步骤如下:1) 首先将数据按照8个字节一组进行分组得到D1D2.Dn(若数据不是8的整数倍, 用指定的PADDING数据补位)2)第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初 始化向量I为全零)3)第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二 组密文C24)之后的数据以此类推,得到Cn5)按顺序连为C1C2C3.Cn即为加密结果。解密是加

3、密的逆过程,步骤如下:)首先将数据按照8个字节一组进行分组得到C1C2C3.Cn2)将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:一定是先解密再异或)3)将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D24)之后依此类推,得到Dn5)按顺序连为D1D2D3.Dn即为解密结果。这里注意一点,解密的结果并不一定是我们原来的加密数据,可能还含有你补得位,定要把补位去掉才是你的原来的数据。* DES算法*/public class DES (/* return DES算法密钥*/public static byte generateKey() (try (/

4、DES算法要求有一个可信任的随机数源SecureRandom sr = new SecureRandom();/生成一个DES算法的KeyGenerator对象KeyGenerator kg = KeyGenerator.getInstance(DES);kg.init(sr);/生成密钥SecretKey secretKey = kg.generateKey();/获取密钥数据byte key = secretKey.getEncoded();return key; catch (NoSuchAlgorithmException e) (System.err.println(DES算法,生成

5、密钥出错!”);e.printStackTrace();return null;/*加密函数* param data*加密数据* param key*密钥* return返回加密后的数据*/public static byte encrypt(byte data, byte key) (try (/ DES算法要求有一个可信任的随机数源SecureRandom sr = new SecureRandom();/从原始密钥数据创建DESKeySpec对象DESKeySpec dks = new DESKeySpec(key);/创建一个密匙工厂,然后用它把DESKeySpec转换成/一个Secr

6、etKey对象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);SecretKey secretKey = keyFactory.generateSecret(dks);/ using DES in ECB modeCipher cipher = Cipher.getInstance(DES/ECB/PKCS5Padding);/用密匙初始化Cipher对象cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);/执行加密操作byte encryptedData口= ciphe

7、r.doFinal(data);return encryptedData; catch (Exception e) System.err.println(DES算法,加密数据出错!);e.printStackTrace();return null;/*解密函数* param data*解密数据* param key*密钥* return返回解密后的数据*/public static byte decrypt(byte data, byte key) try (/ DES算法要求有一个可信任的随机数源SecureRandom sr = new SecureRandom();/ byte rawK

8、eyData口= /*用某种方法获取原始密匙数据*/;/从原始密匙数据创建一个DESKeySpec对象DESKeySpec dks = new DESKeySpec(key);/创建一个密匙工厂,然后用它把DESKeySpec对象转换成/一个SecretKey对象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);SecretKey secretKey = keyFactory.generateSecret(dks);/ using DES in ECB modeCipher cipher = Cipher.getIn

9、stance(DES/ECB/PKCS5Padding);/用密匙初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);/正式执行解密操作byte decryptedData口= cipher.doFinal(data);return decryptedData; catch (Exception e) (System.err.println(DES算法,解密出错。);e.printStackTrace();return null;*加密函数* param data*加密数据* param key*密钥* return返回加密后的

10、数据*/public static byte CBCEncrypt(byte data, byte key, byte iv) (try (/从原始密钥数据创建DESKeySpec对象DESKeySpec dks = new DESKeySpec(key);/创建一个密匙工厂,然后用它把DESKeySpec转换成/一个SecretKey对象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);SecretKey secretKey = keyFactory.generateSecret(dks);/ Cipher对象实际

11、完成加密操作Cipher cipher = Cipher.getInstance(DES/CBC/PKCS5Padding);/若采用NoPadding模式,data长度必须是8的倍数/ Cipher cipher = Cipher.getInstance(DES/CBC/NoPadding);/用密匙初始化Cipher对象IvParameterSpec param = new IvParameterSpec(iv);cipher.init(Cipher.ENCRYPT_MODE, secretKey, param);/执行加密操作byte encryptedData = cipher.doF

12、inal(data);return encryptedData; catch (Exception e) System.err.println(DES算法,加密数据出错!);e.printStackTrace();return null;/*解密函数* param data*解密数据* param key*密钥* return返回解密后的数据*/public static byte CBCDecrypt(byte data, byte key, byte iv) try /从原始密匙数据创建一个DESKeySpec对象DESKeySpec dks = new DESKeySpec(key);/

13、创建一个密匙工厂,然后用它把DESKeySpec对象转换成/一个SecretKey对象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);SecretKey secretKey = keyFactory.generateSecret(dks);/ using DES in CBC modeCipher cipher = Cipher.getInstance(DES/CBC/PKCS5Padding);/若采用NoPadding模式,data长度必须是8的倍数/ Cipher cipher = Cipher.getIns

14、tance(DES/CBC/NoPadding);/用密匙初始化Cipher对象IvParameterSpec param = new IvParameterSpec(iv);cipher.init(Cipher.DECRYPT_MODE, secretKey, param);/正式执行解密操作byte decryptedData口= cipher.doFinal(data);return decryptedData; catch (Exception e) System.err.println(DES算法,解密出错。);e.printStackTrace();return null;publ

15、ic static void main(String args) try byte key = 11111111.getBytes();byte iv = 22222222”.getBytes();byte data = DES.encrypt(ebc mode test.getBytes(), key);System.out.print(EBC mode:);System.out.println(new String(DES.decrypt(data, key);System.out.print(CBC mode:);data = DES.CBCEncrypt(cbc mode test.getBytes(), key, iv);System.out.println(new String(DES.CBCDecrypt(data, key, iv); catch (Exception e) e.printStackTrace();DES的几种填补方式DES是对64位数据的加密算法,如数据位数不足64位的倍数,需要填充,补充到64位的倍数。NoPaddingAPI或算法本身不对数据进行处理,加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密,可以补充0或者空格,然后trimPKCS5Padding加密前:数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论