• java 对视频和图片进行加密解密


    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.RandomAccessFile;

    public class FileEncryptAndDecrypt {

        public static void main(String[] args) throws Exception {

            String filename = "奔马.avi";

            String flag = readFileLastByte("c:\" + filename, 6);
            if (flag.indexOf("hello") > 0) {
                // 加密过了;
            } else {
                // 没有加密
                new FileEncryptAndDecrypt().encrypt("c:\" + filename, "hello");
            }
            System.out.println(new FileEncryptAndDecrypt().decrypt("c:\"
                    + filename, "c:\" + filename, 6));
            // System.out.println(readFileLastByte("c:\3.jpg", 6));
        }

        /**
         * 文件file进行加密
         * 
         * @param fileUrl
         *            文件路径
         * @param key
         *            密码
         * @throws Exception
         */
        public static void encrypt(String fileUrl, String key) throws Exception {
            File file = new File(fileUrl);
            String path = file.getPath();
            if (!file.exists()) {
                return;
            }
            int index = path.lastIndexOf("\");
            String destFile = path.substring(0, index) + "\" + "abc";
            System.out.println(destFile);
            File dest = new File(destFile);
            InputStream in = new FileInputStream(fileUrl);
            OutputStream out = new FileOutputStream(destFile);
            byte[] buffer = new byte[1024];
            int r;
            byte[] buffer2 = new byte[1024];
            while ((r = in.read(buffer)) > 0) {
                for (int i = 0; i < r; i++) {
                    byte b = buffer[i];
                    buffer2[i] = b == 255 ? 0 : ++b;
                }
                out.write(buffer2, 0, r);
                out.flush();
            }
            in.close();
            out.close();
            file.delete();
            dest.renameTo(new File(fileUrl));
            appendMethodA(fileUrl, key);
            System.out.println("加密成功");
        }

        /**
         * 
         * @param fileName
         * @param content
         *            密钥
         */
        public static void appendMethodA(String fileName, String content) {
            try {
                // 打开一个随机访问文件流,按读写方式
                RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
                // 文件长度,字节数
                long fileLength = randomFile.length();
                // 将写文件指针移到文件尾。
                randomFile.seek(fileLength);
                randomFile.writeBytes(content);
                randomFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        /**
         * 解密
         * 
         * @param fileUrl
         *            源文件
         * @param tempUrl
         *            临时文件
         * @param ketLength
         *            密码长度
         * @return
         * @throws Exception
         */
        public static String decrypt(String fileUrl, String tempUrl, int keyLength)
                throws Exception {
            File file = new File(fileUrl);
            if (!file.exists()) {
                return null;
            }
            File dest = new File(tempUrl);
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }

            InputStream is = new FileInputStream(fileUrl);
            OutputStream out = new FileOutputStream(tempUrl);

            byte[] buffer = new byte[1024];
            byte[] buffer2 = new byte[1024];
            byte bMax = (byte) 255;
            long size = file.length() - keyLength;
            int mod = (int) (size % 1024);
            int div = (int) (size >> 10);
            int count = mod == 0 ? div : (div + 1);
            int k = 1, r;
            while ((k <= count && (r = is.read(buffer)) > 0)) {
                if (mod != 0 && k == count) {
                    r = mod;
                }

                for (int i = 0; i < r; i++) {
                    byte b = buffer[i];
                    buffer2[i] = b == 0 ? bMax : --b;
                }
                out.write(buffer2, 0, r);
                k++;
            }
            out.close();
            is.close();
            return tempUrl;
        }

        /**
         * 判断文件是否加密
         * 
         * @param fileName
         * @return
         */
        public static String readFileLastByte(String fileName, int keyLength) {
            File file = new File(fileName);
            if (!file.exists())
                return null;
            StringBuffer str = new StringBuffer();
            try {
                // 打开一个随机访问文件流,按读写方式
                RandomAccessFile randomFile = new RandomAccessFile(fileName, "r");
                // 文件长度,字节数
                long fileLength = randomFile.length();
                // 将写文件指针移到文件尾。
                for (int i = keyLength; i >= 1; i--) {
                    randomFile.seek(fileLength - i);
                    str.append((char) randomFile.read());
                }
                randomFile.close();
                return str.toString();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

    }

  • 相关阅读:
    Winform中怎样设置ContextMenuStrip右键菜单的选项ToolStripMenuItem添加照片
    JavaScript垃圾回收机制
    前端如何处理内存泄漏
    前端缓存
    深入理解vue-router之keep-alive
    (淘宝无限适配)手机端rem布局详解
    mysql不会使用索引,导致全表扫描情况
    MYSQL性能优化的最佳20+条经验
    深拷贝与浅拷贝的区别,实现深拷贝的几种方法
    vue组件通信方式总结
  • 原文地址:https://www.cnblogs.com/zhwl/p/3655898.html
Copyright © 2020-2023  润新知