`
arcticfox9902
  • 浏览: 108382 次
  • 性别: 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...

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

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

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

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

    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...

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

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

    sqlserver2005的base64加密解密函数

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

    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和...

    JAVA实现AES加密和解密

    在Java编程环境中,AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它以其高效性和安全性而被广泛应用。本文将详细介绍如何使用Java实现AES的加密和解密过程,特别是针对16位长度的秘钥,并解决...

Global site tag (gtag.js) - Google Analytics