1、base64加密算法

1、加密算法简述

base64:因为HTTP协议是文本协议,传输信息时只支持可打印字符,所以为了使HTTP协议能够支持传输图片、文件等等数据,只能先将数据转换成base64的字符串来保存。
可打印字符:ASCII码中一共有128个字符(0-127),其中只有32-126这95个字符属于可打印字符,base64选取的64个字符是A-Z,a-z,0-9,+ 和 /。如下所示,1就是B,63就是/,另外还有一个 = 号用于标识结尾(不一定都有,后面会解释)。

        /*** This array is a lookup table that translates 6-bit positive integer* index values into their "Base64 Alphabet" equivalents as specified* in "Table 1: The Base64 Alphabet" of RFC 2045 (and RFC 4648).*/private static final char[] toBase64 = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M','N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm','n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};

原理:算法将这64个字符通过6位来一一对应起来,表示为000000-111111。然后将三个字节的数据拆分成4份分别使用这64个字符来表示。也就是说通过base64加密后,每三个字符都会最终变成四个字符。

2、使用方法

使用的是java.util.Base64提供的方法,加解密分别对应的是Base64中的两个内部类,需要jdk版本至少大于等于1.8。
加密:

//从流中获取到的字节数组
byte[] bytes = new byte[3072];
Base64.getEncoder().encodeToString(bytes);

解密:

//使用base64将流加密之后的字符串
StringBuilder encode = new StringBuilder();
Base64.getDecoder().decode(encode.toString());

3、简单实现

    public static void main(String[] args) {long t1 = System.currentTimeMillis();BufferedInputStream bis = null;BufferedOutputStream bos = null;try {bis = new BufferedInputStream(new FileInputStream("F:\\1.pdf"));  //读取数据bos = new BufferedOutputStream(new FileOutputStream("F:\\6.pdf")); //写数据byte[] bytes = new byte[3072];        //字节数组byte[] decode;StringBuilder encode = new StringBuilder();while (bis.read(bytes) != -1) { //读取到字节数组中System.out.println("读取...");encode.append(Base64.getEncoder().encodeToString(bytes));  //每次将加密后的字符串追加到encode中}decode = Base64.getDecoder().decode(encode.toString());     //将encode解密bos.write(decode);   //写到文件中System.out.println("end...");} catch (IOException e) {e.printStackTrace();} finally {try {if (bis != null) {bis.close();}if (bos != null) {bos.close();}} catch (IOException e) {e.printStackTrace();}}long t2 = System.currentTimeMillis();System.out.println(t2 - t1);}

4、注意事项

如果加密的字节数不是3的倍数呢?

比如最后只剩下一个字节了。base64首先将后面两个字节全部使用0来代替,将这个字节前6位放入一个空间,后两位放入一个空间,然后低位补0。并且使用 = 号来标识,如果刚好是3的倍数的话就不需要补0操作,自然也就不会有 = 号。

一个字节
11111111先补成三个字节
11111111 00000000 00000000分割成四个6位的字符
111111 110000 000000 000000
63      48      0       0加密后的结果
\w==
能不能分批加密

可以发现,上面的简单测试用例就是使用的分批加密,然后统一解密的方式。主要为了防止文件过大,转换成byte数组后超出了常数的大小而报错。而使用分批加密必须要注意的点就是需要以3的倍数来获取流的数据,否则加密出来的结果带有=号,在解密时会出现解密出错的情况。

byte[] bytes = new byte[3072]; //每次取用的大小必须是3的倍数
加解密的大小不一致

如果不是分批读取的话,是不会存在这种情况的,查看是否对文件的写操作是追加情况。
如果是分批操作,如果数据源是使用多个字节代替一位字符的情况,就有可能取数据的时候取得不完整而导致加解密后得大小不一致,推荐使用1024的倍数来取数据。

base64加密算法详解,以及使用时可能出现的问题相关推荐

  1. scanf()函数的详解以及使用时需要注意的一些细节-C语言基础

    这篇文章要探讨的是"scanf()函数的详解以及使用时需要注意的一些细节".涉及scanf()函数的应用和需要注意的问题.属于C语言基础篇(持续更新). scanf()(函数原型: ...

  2. fgets()函数的详解以及使用时需要注意的一些细节-C语言基础

    这篇文章要探讨的是"fgets()函数的详解以及使用时需要注意的一些细节".涉及fgets()函数的应用和需要注意的问题.属于C语言基础篇(持续更新). fgets()(函数原型: ...

  3. posix_memalign函数详解以及使用时的注意事项

    前言 在编写可移植的代码的时候,所有的类型都该自然对齐,因为不对齐会导致性能下降,在大多数情况下,编译器和C库透明地帮你处理对齐问题.POSIX 标明了通过malloc( ), calloc( ), ...

  4. Base64编码详解及其变种(解决加号在URL变空格问题)

    Base64编码详解及其变种(解决加号在URL变空格问题) 参考文章: (1)Base64编码详解及其变种(解决加号在URL变空格问题) (2)https://www.cnblogs.com/life ...

  5. kali中steghide命令工具教程;7z命令详解;kali中base64命令详解

    目录 kali中steghide命令工具教程 7z命令详解 kali中base64命令详解 例:解码文本里的base64编码 kali中steghide命令工具教程 根据此博客学习(12条消息) 隐写 ...

  6. 密码学:RSA加密算法详解

    概述 本文旨在说明RSA加密算法的原理及实现,而其相关的数学部分的证明则不是本文内容. 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Q-WHai 发表日期: ...

  7. 【HTML5】------- 图片Base64编码详解

    引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的 base64 编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的 base64 编码.标题略大,不过只是希望通过一些浅显 ...

  8. openssl_sign() 语法+RSA公私钥加密解密,非对称加密算法详解

    其实有时候觉得写博客好烦,就个函数就开篇博客.很小的意见事情而已,知道的人看来多取一举,或者说没什么必要,浪费时间,不知道的人就会很郁闷.技术就是这样的,懂的人觉得真的很简单啊,不知道的人真的好难.. ...

  9. 网易云音乐登录信息加密算法详解

    原文地址:网易云音乐新登录API分析 网易云音乐登录 加密算法 核心过程如下: text = {'username': username,'password': password,'rememberL ...

最新文章

  1. 17 Java面试之css
  2. python自动化开发教程_Python自动化开发实战视频课程-全新基础篇_Python教程
  3. 【uni-app】uParse 富文本解析插件遇到长图、大图宽高比异常问题
  4. python 坐标连线_从具有和角度的坐标绘制线 - python
  5. 热电偶校验仪_热电偶校验方法_烟台一等热电偶,干湿两用温度校验炉公司
  6. kotlin 查找id_Kotlin程序查找给定范围内的素数
  7. uniapp 输入框防抖节流_拉动一下控制台大小,后台请求数量爆炸,竟是没做好防抖与节流...
  8. jquery 父元素相邻元素_Jquery中几种查找节点的方法
  9. Ubuntu 默认启动到字符界面
  10. 使用jQuery播放/暂停 HTML5视频
  11. 16年的长度 记录中国独立游戏
  12. 阿里年薪百万的P7架构师简历都长什么样?他们都是怎么学习的?
  13. 百度云离线下载含有违规内容检測方法分析
  14. 自然语言处理系列五》新词发现与短语提取》短语提取
  15. 计算机内存和外存的主要区别是什么,计算机的存储系统一般有内存和外存,试述内存与外存的主要区别。...
  16. Windows桌面端录屏采集实现
  17. 『The Book of Why』导言:思维胜于数据
  18. quartusii生成FIFO
  19. 设计模式 - 创建型设计模式小结
  20. 计算机仿真相关文献有哪些,计算机仿真技术研究论文

热门文章

  1. 蔚来的“未来”有多远?
  2. html优化显示器,iPhone 4中HTML5 Canvas优化Retina屏幕
  3. clipboard复制粘题问题
  4. CouchDB漏洞复现
  5. Java开发者福音 阿里巴巴宣布连任Java全球管理组织席位
  6. Windows10系统使用密钥登录Linux
  7. Structured Streaming详解
  8. 决策树——三种基本算法
  9. 《创业大讲堂》第二讲:市场空间的测算
  10. SOA标准化国际论坛即将在京召开