`
arcticfox9902
  • 浏览: 108575 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

Java加密与解密 - Base64算法

 
阅读更多

1 Base64算法的由来

    Base64算法最早应用于解决电子邮件传输的问题。早期,由于“历史问题”,电子邮件只允许ASCII码字符,如果邮件中包含非ASCII码字符,当它通过有“历史问题”的网关时,这个网关会对该字符的二进制位进行调整,即将其8位二进制码的最高位置0,这样用户收到的邮件就会是一封乱码。为了解决这个问题,产生了Base64算法。

 

2 Base64算法的定义

    RFC 2045中定义:Base64内容传输编码是一种以8位字节序列组合的描述形式,这种形式不易被人直接识别。

    RFC 2045中规定,在电子邮件中,每行为76个字符,每行末需添加一个回车换行符("\r\n"),不管每行是否够76个字符,都要添加一个回车换行符。不过在实际应用中,根据实际需要,这一要求往往被忽略。

 

    Base64算法的转换方式类似于古典加密算法里的单表置换算法 。RFC 2045中给出了Base64的字符映射表,如下图所示。

 

 

    这张字符映射表中,Value是十进制编码,Encoding是字符,共映射了64个字符,这也是Base64算法命名的由来。映射表的最后一个字符“=”是用来补位的。

    Base64算法的编码和解码操作可用作加密解密,但是Base64的字符映射表是公开的,因此并不能叫做加密算法。

    Url Base64算法是由Base64算法衍生出来的,用于在http请求中传递二进制数据。将Base64中的“+”、“/”替换为“-”和“_”符号,对于补位符“=”,Bouncy Castle使用“.”替换,而Commons Codec则不使用补位符。

 

 

3 基本原理

    Base64算法主要是将给定的字符以字符编码(如ASCII、UTF-8等)对应的十进制数为基准,做编码操作:

  1.     将给定的字符串以字符为单位,转换为对应的字符编码。
  2.     将获得的字符编码转换为二进制串。
  3.     将获得的二进制串做分组转换操作,每3个8位的二进制串为一组,将这样的一组再转换为4个6位二进制串,不足6位时低位补0。
  4.     对每组4个6位二进制串补位,即向6位二进制串的高位补两个0,生成4个8位二进制串。
  5.     将获得的4-8二进制码转换为十进制码。
  6.     将获得的十进制码用Base64字符映射表中对应的字符替换。

    经过Base64编码后的数据会比原始数据略长,为原来的4/3倍,编码后的字符数是4的倍数。

    编码后的字符串最多有2个补位的“=”,因为原始数据的二进制串的分组是以3个8位为一组的,余数 = 原始数据字节数 mod 3,余数只能为0、1、2。如果余数为0,3个8位转换为4个6位,高位补0之后是4个8位,则不需要补位符;如果余数为1,1个8位只能转换为2个6位,高位补0之后是2个8位,为了让编码之后的字符数是4的倍数,要补两个补位符;同理,如果余数为2,要补一个补位符。

    ASCII码进行Base64编码的例子如下图,字符“A”编码之后的字符串为“QQ==”。

    非ASCII码如GBK、UTF-8等编码,一个字符包含多个字节,如UTF-8用3个字节表示一个汉字,GBK用2个字节表示一个汉字。以字符串“密”为例,对应的UTF-8编码是-27、-81、-122,用Base64编码如下图,编码后的字符串为“5a+G”。

 

4 Base64算法的Java实现和使用

    Java API中没有Base64的实现,实际上Sun也有Base64算法的实现,但是没有公布。Bouncy Castle提供了一般Base64算法的实现,Commons Codec提供了基于RFC 2045相关定义的Base64算法实现。

    Bouncy Castle遵循的是一般Base64算法,就是根据字符映射表做了编码转换。Commons Codec中既支持RFC 2045定义的Base64算法,也支持一般的Base64算法。这两种的差异是RFC 2045定义的算法要求在编码后的字符串中换行和末尾添加回车换行符。

 

 

分享到:
评论

相关推荐

    java实现SHA1、SHA、MD5、AES加密、AES解密、BASE64解密、BASE64加密,以及BASE64 jar和源码

    在压缩包中的"java加密、解密"文件中,很可能包含了实现这些加密解密操作的Java代码示例,包括类、方法和可能的测试用例。通过阅读和学习这些代码,开发者可以更好地理解和应用上述加密算法,同时了解如何在实际项目...

    c++实现base64算法加密解密

    c++实现base64算法加密解密,不需要修改,直接运行即可

    jquery-base64加密解密

    总的来说,`jQuery-base64` 提供的加密解密功能与Java的Base64工具结合使用,为Web应用提供了客户端数据加密和服务器端安全解析的一种解决方案。这种技术在需要保护敏感信息的Web应用中尤为适用,但需要注意的是,它...

    用Java实现BASE64加密解密

    总之,Java提供了方便的`java.util.Base64`工具类来处理Base64编码和解码,使得在Java项目中实现Base64加密解密变得简单且高效。这个基础的加密解密机制虽然简单,但在很多场景下已经足够满足基本的数据保护需求。

    Base64加密解密java/js

    参照网上Base64 js加密解密写的java实现,网上没看到出现过,可能大神都不屑写这种小东东,只好自己写了。弄了好几天,总算弄好了。 因为是参照 js Base64写的java实现,所以代码可实现前台js,后台java的加密,...

    Java加密与解密的艺术.pdf

    BouncyCastle和CommonsCodec是Java开发者常用的加密库和工具,它们提供了丰富的API和算法支持,能够帮助开发人员解决复杂的加密与解密问题。 书中还提到了数字签名、散列函数等加密技术,这些都是构建安全应用不可...

    JAVA加密解密-3

    本教程"JAVA加密解密-3"聚焦于如何在Java环境中实现文件的加密和解密功能。以下是一些核心知识点: 1. **加密的基本概念**:加密是将明文数据转化为不可读的密文,以防止未经授权的访问。解密则是将密文还原为原始...

    java加密解密研究3、Base64算法

    java加密解密研究3、Base64算法

    3des加密解密base64编码解码完全与ASP.NET,JAVA,兼容的js

    本资源提供的是一套完整的JavaScript实现,能够与ASP.NET和JAVA平台的3DES加密解密及Base64编码解码功能保持兼容。 首先,3DES的工作原理是在DES的基础上增加了一次加密过程,即使用同一个密钥进行三次加密,这大大...

    认证码Token加密解密代码

    该代码使用Java语言编写,主要涉及到DESede加密算法、SHA-1哈希算法和Base64编码等技术。 一、DESede加密算法 DESede加密算法是一种三重DES加密算法,使用三个不同的密钥对数据进行加密和解密操作。该算法的key ...

    Base64 加密解密小工具

    下面,我们将深入探讨Base64加密解密的基本原理、用途以及如何使用工具进行操作。 1. Base64的基本原理 Base64是基于64个可打印字符来表示二进制数据的编码方法。这64个字符包括大小写字母(A-Z, a-z)、数字(0-9...

    android工具类:基于javaBase64的加密解密工具类

    本文将详细介绍一个基于Java Base64的Android加密解密工具类,该工具类支持公钥加密和私钥解密,具有高度的解耦性,方便集成到项目中。 一、Base64加密解密基础 Base64是一种编码方式,它将任意二进制数据转换为可...

    JS端与java(android)端3DES加密解密和Base64编码解码文件

    总结来说,JS端与Java(Android)端3DES加密解密和Base64编码解码是确保数据安全传输的关键步骤。通过使用像CryptoJS和jsencrypt.js这样的库,开发者可以在客户端和服务器之间建立安全的数据通道,保护用户的隐私和...

    java密码加密解密算法代码实现

    例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码...

    base64转码解密成明文加密成Java密文

    本主题将深入探讨“Base64转码解密成明文”以及“Base64加密成Java密文”的过程,并介绍相关的Java实现。 首先,我们来看Base64解码。Base64编码的基本原理是将每3个字节的数据(24位)分成4组,每组6位,然后将这6...

    java实现base64加密

    下面我们将详细探讨如何在Java中实现Base64加密和解密: 1. **Base64编码**: 使用`java.util.Base64.Encoder`接口的`encodeToString()`方法可以将字节数组编码为Base64字符串。例如: ```java byte[] bytes = ...

    Base64And3Des(C++3Des加密解密结合Base64加密解密).rar

    在这个项目中,"Base64And3Des(C++3Des加密解密结合Base64加密解密).rar" 提供了一个C++实现,用于结合3DES(Triple Data Encryption Standard)加密算法与Base64编码进行数据的加解密。下面我们将详细探讨3DES和...

    Delphi XE2+标准AES加解密算法(AES/EBC,CBC/PKCS5Padding-base64)

    本源码从CSDN一位前辈的源码基础上做了更改,增加支持加密返回BASE64,更加完善。在此感谢原作者: http://download.csdn.net/download/qiaohaidong/9477264 需要注意的是仅在XE及以上版本支持Base64返回结果,...

    易语言Base64支持密码加密

    易语言Base64支持密码加密是一项在易语言编程环境下实现数据加密与解密的技术,它主要涉及到了两个关键概念:Base64编码和密码加密。Base64是一种用于将二进制数据转换为可打印字符的编码方式,而密码加密则是为了...

    sqlserver2005的base64加密解密函数

    总结,虽然SQL Server 2005本身并不提供内置的Base64加密解密功能,但通过创建自定义函数,我们可以实现类似的功能。需要注意的是,上述函数仅适用于简单场景,对于更复杂的需求,可能需要更完善的Base64编码解码...

Global site tag (gtag.js) - Google Analytics