Java实现DES加密解密

Java实现DES加密解密DES DataEncrypti 是一种对称加密算法 所谓对称加密就是加密和解密都是使用同一个密钥 加密原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位 产生最大 64 位的分组大小 这是一个迭代的分组密码 使用称为 Feistel 的技术 其中将加密的文本块分成两半 使用子密钥对其中一半应用循环功能 然后将输出与另一半进行 异或 运算 接着交换这

DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥

加密原理:

DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用 Feistel 技术,将其中加密的文本块分成两半,实现了子密钥对其中一半应用循环功能,然后将输出与另一半进行”异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。

不过,DES已可激活成功教程,所以针对保密级别特别高的数据推荐使用非对称加密算法。

下面介绍基于Java实现的DES加解密方法,该方法同样适用于Android平台,使用的是JDK1.8。

public class DESUtil { / * 偏移变量,固定占8位字节 */ private final static String IV_PARAMETER = ""; / * 密钥算法 */ private static final String ALGORITHM = "DES"; / * 加密/解密算法-工作模式-填充模式 */ private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding"; / * 默认编码 */ private static final String CHARSET = "utf-8"; / * 生成key * * @param password * @return * @throws Exception */ private static Key generateKey(String password) throws Exception { DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET)); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); return keyFactory.generateSecret(dks); } / * DES加密字符串 * * @param password 加密密码,长度不能够小于8位 * @param data 待加密字符串 * @return 加密后内容 */ public static String encrypt(String password, String data) { if (password== null || password.length() < 8) { throw new RuntimeException("加密失败,key不能小于8位"); } if (data == null) return null; try { Key secretKey = generateKey(password); Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); byte[] bytes = cipher.doFinal(data.getBytes(CHARSET)); //JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder //Android平台可以使用android.util.Base64 return new String(Base64.getEncoder().encode(bytes)); } catch (Exception e) { e.printStackTrace(); return data; } } / * DES解密字符串 * * @param password 解密密码,长度不能够小于8位 * @param data 待解密字符串 * @return 解密后内容 */ public static String decrypt(String password, String data) { if (password== null || password.length() < 8) { throw new RuntimeException("加密失败,key不能小于8位"); } if (data == null) return null; try { Key secretKey = generateKey(password); Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); return new String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))), CHARSET); } catch (Exception e) { e.printStackTrace(); return data; } } / * DES加密文件 * * @param srcFile 待加密的文件 * @param destFile 加密后存放的文件路径 * @return 加密后的文件路径 */ public static String encryptFile(String password, String srcFile, String destFile) { if (password== null || password.length() < 8) { throw new RuntimeException("加密失败,key不能小于8位"); } try { IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, generateKey(key), iv); InputStream is = new FileInputStream(srcFile); OutputStream out = new FileOutputStream(destFile); CipherInputStream cis = new CipherInputStream(is, cipher); byte[] buffer = new byte[1024]; int r; while ((r = cis.read(buffer)) > 0) { out.write(buffer, 0, r); } cis.close(); is.close(); out.close(); return destFile; } catch (Exception ex) { ex.printStackTrace(); } return null; } / * DES解密文件 * * @param srcFile 已加密的文件 * @param destFile 解密后存放的文件路径 * @return 解密后的文件路径 */ public static String decryptFile(String password, String srcFile, String destFile) { if (password== null || password.length() < 8) { throw new RuntimeException("加密失败,key不能小于8位"); } try { File file = new File(destFile); if (!file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, generateKey(key), iv); InputStream is = new FileInputStream(srcFile); OutputStream out = new FileOutputStream(destFile); CipherOutputStream cos = new CipherOutputStream(out, cipher); byte[] buffer = new byte[1024]; int r; while ((r = is.read(buffer)) >= 0) { cos.write(buffer, 0, r); } cos.close(); is.close(); out.close(); return destFile; } catch (Exception ex) { ex.printStackTrace(); } return null; } } 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208268.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:58
下一篇 2026年3月19日 上午11:59


相关推荐

  • 千问App全面接入阿里生态:淘宝、闪购,测试AI购物,月活已突破1亿

    千问App全面接入阿里生态:淘宝、闪购,测试AI购物,月活已突破1亿

    2026年3月13日
    2
  • Python day字符串所有使用

    Python day字符串所有使用字符串所有的操作 name dio names my tnameis Name andiama job print name capitalize 首字母大写 print names count a 数字符里面有几个重复的指定字母 print names center 50 前一个数字表示一共要打印 50 个位置 不够的地方用后面双引号内的内

    2026年3月17日
    1
  • 2020-10-24 今年的1024

    2020-10-24 今年的1024作为一个伪程序员,写下自己的感受吧1.想靠编程这个饭碗吃饭,就要把这个技术搞扎实,说其他都都没有用;2.找到自己的用武之地,有自己的特点,有自己的能力才可以。3.坚持每天学习,每天总结,这是一生的好习惯【我是做不到】;4.考虑自己的年龄,找到自己年龄段该有的能力,该做的事情;…

    2022年6月24日
    26
  • Android系统签名以及生成keystore秘钥

    Android系统签名以及生成keystore秘钥Android11系统签名以及keystore一、什么是系统签名Android下所有APP都要进行签名,而有些权限,只有系统签名了的APP可以拥有。而且需要在APP的AndroidManifest中添加以下IDandroid:sharedUserId=”android.uid.system”二、使用signapk.jar签名2.1找到对应文件(1)在根目录下创建keystore文件夹以方便工作(2)查找密钥和证书build/target/product/security/plat

    2022年6月21日
    86
  • 如何查看tomcat版本_tomcat修改端口号

    如何查看tomcat版本_tomcat修改端口号一、通过tomcat版本文件查看  找到tomcat目录,进入”xxx/tomcat/bin”目录,执行”shversion.sh”。如果没有设置JAVA_HOME和JRE_HOME环境变量则会报如下错误:[jieyu.ljy@tripco011182064160.na62xxx/tomcat/bin]$shversion.shNeithertheJAVA_HOMEn…

    2026年3月12日
    7
  • Mac PyCharm 打不开处理

    Mac PyCharm 打不开处理1 第一步 先输入 cd Applications PyCharm app Contents MacOS2 第二步 查看无法打开 pycharm 的原因 需要输入 c pycharm3 第三步 下面就是展示的分析日志 其中许多小伙伴都找不到网上说的这个地址 cd Users 用户名 Library Preferences PyCharm2019 1 其实地址不是这个 而是 Users liuxiaoming Library ApplicationS JetBrain

    2025年6月28日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号