DES加密解密

  • 使用Base64(加密字符串)
  • new String,通过String.getBytes(加密文件)
  • 错误: Input length must be multiple of 8 when decrypting with padded cipher

使用Base64(加密字符串)

import cn.hzjykj.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.security.Key;
import java.security.Security;
private static byte[] iv = new byte[8];private static String _KEY = "Jinyi-hz";public static String encryptDES(String encryptString) throws Exception{IvParameterSpec zoreIv = new IvParameterSpec(iv);SecretKeySpec key = new SecretKeySpec(_KEY.getBytes(),"DES");Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE,key,zoreIv);byte[] encryptedData = cipher.doFinal(encryptString.getBytes("UTF-8"));return Base64.encode(encryptedData);}public static String decryptDES(String decryptString) throws Exception{new Base64();byte[] byteMi = Base64.decode(decryptString);IvParameterSpec zeroIv = new IvParameterSpec(iv);SecretKeySpec key = new SecretKeySpec(_KEY.getBytes("UTF-8"),"DES");Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE,key,zeroIv);byte decryptedData[] = cipher.doFinal(byteMi);return new String(decryptedData,"UTF-8");}public static void main(String[] args) throws Exception {String gbkStr = new String("������GBK���ַ�".getBytes("GBK"), "GBK");System.out.println("GBK:" + gbkStr);String utf8Str = new String(gbkStr.getBytes("GBK"), "ISO8859_1");utf8Str = new String(utf8Str.getBytes("ISO8859_1"), "UTF-8");System.out.println("UTF-8:" + utf8Str);String t = new String(utf8Str.getBytes("UTF-8"), "ISO8859_1");t = new String(t.getBytes("ISO8859_1"), "GBK");System.out.println("GBK:" + t);String tt = encryptDES(t);System.out.println(tt);System.out.println(decryptDES(tt));}

new String,通过String.getBytes(加密文件)

import javax.crypto.Cipher;
import java.io.*;
import java.security.Key;
import java.security.Security;/*** 获取秘钥* @author zrx* @date 2020/4/22*/
public class MySecurity {private static String strDefaultKey = "hnztzwma";private Cipher encryptCipher = null;private Cipher decryptCipher = null;private Key getKey(byte[] arrBTmp) throws Exception{// 创建一个空的8位字节数组,默认值为0byte[] arrB = new byte[8];// 将原始字节数组转化为8位for (int i=0;i<arrBTmp.length;i++){arrB[i] = arrBTmp[i];}// 生成秘钥Key key = new javax.crypto.spec.SecretKeySpec(arrB,"DES");return key;}public MySecurity() throws Exception{this(strDefaultKey);}public MySecurity(String strKey) throws Exception{Security.addProvider(new com.sun.crypto.provider.SunJCE());Key key = getKey(strKey.getBytes());encryptCipher = Cipher.getInstance("DES");encryptCipher.init(Cipher.ENCRYPT_MODE,key);decryptCipher = Cipher.getInstance("DES");decryptCipher.init(Cipher.DECRYPT_MODE,key);}public byte[] encrypt(byte[] arrB) throws Exception{return encryptCipher.doFinal(arrB);}public byte[] decrypt(byte[] arrB) throws Exception{return decryptCipher.doFinal(arrB);}/*** 文件加密* @param file* @return* @throws Exception*/public static byte[] getBytesFromFile(java.io.File file) throws Exception{InputStream is = new FileInputStream(file);// 获取文件大小long length = file.length();// 限制要读取的文件的大小不能能超过Integer.MAX_VALUEif (length>Integer.MAX_VALUE){return null; // 文件太大,退出程序}// 创建字节数组byte[] bytes = new byte[(int)length];// 将文件信息读入数组int offset = 0;int numRead = 0;while (offset<bytes.length && (numRead = is.read(bytes,offset,bytes.length-offset))>=0){offset+=numRead;}// 确认是否将所有信息读入数组if (offset<bytes.length){throw new IOException("Could not completely read file "+file.getName());}// 关闭流is.close();return bytes;}/*** 将字节数组写入文件* @param inByte* @param pathAndNameString* @return* @throws IOException*/public static File writeBytesToFile(byte[] inByte,String pathAndNameString) throws IOException{File file = null;try {file = new File(pathAndNameString);file.createNewFile();FileOutputStream fos = new FileOutputStream(file);fos.write(inByte);fos.close();}catch (Exception e){e.printStackTrace();}return file;}/*** 文件加密* @param srcFile 要加密的源文件* @param destFile 加密后的文件* @throws Exception*/public void encryptFile(String srcFile,String destFile) throws Exception{File infile = new File(srcFile); // 加密前文件byte[] myFileA = getBytesFromFile(infile);writeBytesToFile(encrypt(myFileA),destFile);}/*** 文件解密* @param srcFile 要解密的源文件* @param destFile 解密后的文件* @throws Exception*/public void decryptFile(String srcFile,String destFile) throws Exception{File infile = new File(srcFile);byte[] myfileA = getBytesFromFile(infile);writeBytesToFile(decrypt(myfileA),destFile);}public static void main(String[] args) throws Exception {try {MySecurity des = new MySecurity();// 加密文件测试des.encryptFile("D:\\file.txt","D:\\enFile.txt");// 解密文件测试des.decryptFile("D:\\enFile.txt","D:\\deFile.txt");}catch (Exception e){e.printStackTrace();}}}

错误: Input length must be multiple of 8 when decrypting with padded cipher

  1. 为什么数组转字符串,字符串然后转数组会出现前后两个字节数组的值会有不同,因为并不是每个字节数和编码集上的字符都有对应关系,如果一个字节数在编码集上没有对应编码,new String(byte[])后,往往解出来的会是一些乱码无意义的符号,例如:��
    但是解码的时候�这个字符也是一个字符,在编码表中也有固定的字节数用来表示,所有解码出来的值必定是编码表中对应的值,除非你的字节数组中的字节数正好在编码表中有对应的值,否则编码解码后的字节数组会不一样。

【解决办法】

  1. 可以用base64对参生成的数组进行编码,然后再解码,这样不会想new String(byte[]).getBytes()那样造成数组前后不一致,base64对数据的处理是不会造成误差的。
  2. 直接返回数组,然后再用数组解密

DES解密解密文件和字符串及报错解决相关推荐

  1. 在ts文件中使用pinia报错解决

    在ts文件中使用pinia(getActivePinia was called with no active Pinia. Did you forget to install pinia)报错解决 一 ...

  2. Pycharm如何导入python文件,及出现报错解决办法

    导入及解决报错 导入py文件 解决报错问题 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女 ...

  3. linux cant open file for writing,linux 安装rz sz lrz lsz sftp: cannot open 文件名称 to write 报错解决...

    安装包路径 链接:https://pan.baidu.com/s/1yD_ESscbMmyDYQH2-n6bqg 提取码:4x72 复制这段内容后打开百度网盘手机App,操作更方便哦 安装命令: wg ...

  4. 在ts文件中使用require报错解决

    直接在项目终端输入该指令: npm i --save-dev @types/node

  5. oracle拼接字符串报错,Oracle 中wmsys.wm_concat拼接字符串,结果过长报错解决

    备忘:这个函数最大是4000,根据拼接列的长度,通过限制拼接条数来防止拼接字符串过长错误 --这个情况是从子表中读取出具,这里直接把它当做查询字段处理,在子表中有所有数据 select info.id ...

  6. hive导出数据到本地文件报错解决方法

    hive导出数据到本地文件报错解决方法 参考文章: (1)hive导出数据到本地文件报错解决方法 (2)https://www.cnblogs.com/yaopeiyun/p/12232251.htm ...

  7. zabbix服务器没有.pid文件,PID file /run/zabbix/zabbix_server.pid not readable (yet?) after start. 报错解决...

    报错如下: [root@localhost zabbix]# systemctl start zabbix-server Job for zabbix-server.service failed be ...

  8. .vue文件在webstorm中es6语法报错解决方法

    .vue文件在webstorm中es6语法报错解决方法 参考文章: (1).vue文件在webstorm中es6语法报错解决方法 (2)https://www.cnblogs.com/yuqing6/ ...

  9. eclipse中maven项目pom文件第一行报错解决方法

    eclipse中maven项目pom文件第一行报错解决方法 参考文章: (1)eclipse中maven项目pom文件第一行报错解决方法 (2)https://www.cnblogs.com/wxym ...

最新文章

  1. 数值分析 使用c语言 源码_分析源码,学会正确使用 Java 线程池
  2. 【APICloud系列|33】移动应用软件加固步骤,适合所有的安卓应用市场
  3. php 编写mysql_php编写数据写入mysql问题
  4. 第十二届 2021年1月 蓝桥杯青少年组省赛C++组 第1题--第3题(python3实现)
  5. 2万月薪招聘名校学生养猪:不好好学习,养猪都不要你
  6. 新大陆java工程师笔试题_完美世界,中兴,新大陆支付面经
  7. 计算机绘图说课视频,电气工程制图说课ppt课件
  8. U-Boot源码之串口驱动
  9. 基于新浪微博api的微博分享功能实现
  10. 如何0成本搭建外卖CPS返利小程序
  11. 关于Msocache文件夹
  12. 【组图】韩国美女明星蔡研---精彩写真
  13. Windows的sc命令详解
  14. 2017 ACM/ICPC 北京赛区小结 By jsb @Reconquista
  15. HTML作业简单注册界面
  16. S32K144烧写程序记录
  17. java上传文件至阿里云oss工具类
  18. Non-Reflecting Boundary Conditions in OpenFOAM
  19. 机器学习之决策树(Decision Tree)
  20. 想用c做能存档的小游戏?来学习文件操作吧。

热门文章

  1. Unity环境光、Skybox和环境光遮挡
  2. 毕业设计 大数据电商用户行为分析 -python 大数据
  3. LINUX学习------3.6 Linux中的火墙策略优化
  4. 游戏的分类(光盘版和硬盘版)
  5. 果 iPhone 4 手机拆机组图,看看 iPhone 4 的内部构造与零件(一)_打杂的_新浪博客...
  6. WebClient-Reactor风格的异步调用
  7. Redis 基础 -- 数据类型实践案例(限制每个用户每分钟最多发起10次调用、微信接收消息顺序)
  8. ipad iphone开发_如何在iPhone或iPad上截图
  9. Visio中输入希腊字母
  10. php cms 代码注入,PHPCMS全版本通杀SQL注入漏洞