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

Base64加密解密java实现

阅读更多

关于Base64编码规则详情请看这里:

http://baike.baidu.com/view/469071.htm

 

代码实现:

/**
 * 实现Base64的编码以及解码;
 * @author dell 
 *
 */
public class SelfBase64 {
	
	/**
	 * 码表;
	 */
	public static char[] encodeTable={'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', '+', '/'};
	
	/**
	 * Base64的编码;
	 * @param value
	 * @return
	 */
	public static String encoderBase64(byte[] value){
		StringBuilder sb=new StringBuilder();
		//获取编码字节是3的倍数;
		int len=value.length;
		int len3=len/3;
		//先处理没有加换行符;
		for(int i=0;i<len3;i++){
			
			//得到第一个字符;
			int b1=(value[i*3]>>2)&0x3F;
			char c1=encodeTable[b1];
			sb.append(c1);
			
			//得到第二个字符;
			int b2=((value[i*3]<<4&0x3F)+(value[i*3+1]>>4))&0x3F;
			char c2=encodeTable[b2];
			sb.append(c2);
			
			//得到第三个字符;
			int b3=((value[i*3+1]<<2&0x3C)+(value[i*3+2]>>6))&0x3F;
			char c3=encodeTable[b3];
			sb.append(c3);
			
			//得到第四个字符;
			int b4=value[i*3+2]&0x3F;
			char c4=encodeTable[b4];
			sb.append(c4);
			
		}
		
		//如果有剩余的字符就补0;
		//剩余的个数;
		int less=len%3;
		if(less==1){//剩余一个字符--补充两个等号;;
			
			//得到第一个字符;
			int b1=value[len3*3]>>2&0x3F;
			char c1=encodeTable[b1];
			sb.append(c1);
			
			//得到第二个字符;
			int b2=(value[len3*3]<<4&0x30)&0x3F;
			char c2=encodeTable[b2];
			sb.append(c2);      
			sb.append("==");
			
		}else if(less==2){//剩余两个字符--补充一个等号;
			
			//得到第一个字符;
			int b1=value[len3*3]>>2&0x3F;
			char c1=encodeTable[b1];
			sb.append(c1);
			
			//得到第二个字符;
			int b2=((value[len3*3]<<4&0x30)+(value[len3*3+1]>>4))&0x3F;
			char c2=encodeTable[b2];
			sb.append(c2);
			
			//得到第三个字符;
			int b3=(value[len3*3+1]<<2&0x3C)&0x3F;
			char c3=encodeTable[b3];
			sb.append(c3);
			sb.append("=");
			
		}
		
		return sb.toString();
	}
	
	/**
	 * Base64的解码;
	 * @param value
	 * @return
	 */
	public static String decoderBase64(byte[] value){
	    
		//每四个一组进行解码;
		int len=value.length;
		int len4=len/4;
		StringBuilder sb=new StringBuilder();
		//除去末尾的四个可能特殊的字符;
		int i=0;
		for(i=0;i<len4-1;i++){
			
			//第一个字符;
			byte b1=(byte) ((char2Index((char)value[i*4])<<2)+(char2Index((char)value[i*4+1])>>4));
			sb.append((char)b1);
			//第二个字符;
		    byte b2=(byte) ((char2Index((char)value[i*4+1])<<4)
					+(char2Index((char)value[i*4+2])>>2));
			sb.append((char)b2);
			//第三个字符;
			byte b3=(byte) ((char2Index((char)value[i*4+2])<<6)+(char2Index((char)value[i*4+3])));
			sb.append((char)b3);
			
		}
		
 		//处理最后的四个字符串;
		for(int j=0;j<3;j++){
			int index=i*4+j;
			if((char)value[index+1]!='='){
				
				if(j==0){
					byte b=(byte) ((char2Index((char)value[index])<<2)
							+(char2Index((char)value[index+1])>>4));
					System.out.println(">>>>>>"+b);
					sb.append((char)b);
				}else if(j==1){
					byte b=(byte) ((char2Index((char)value[index])<<4)
							+(char2Index((char)value[index+1])>>2));
					System.out.println(">>>>>>"+b);
					sb.append((char)b);
				}else if(j==2){
					byte b=(byte) ((char2Index((char)value[index])<<6)
							+(char2Index((char)value[index+1])));
					System.out.println(">>>>>>"+b);
					sb.append((char)b);
				}
				
			}else{
				break;
			}
		}
		
		return sb.toString();
	}
	
	/**
	 * 将码表中的字符映射到索引值;
	 * @param ch
	 * @return
	 */
	public static int char2Index(char ch){
		if(ch>='A'&&ch<='Z'){
			return ch-'A';
		}else if(ch>='a'&&ch<='z'){
			return 26+ch-'a';
		}else if(ch>='0'&&ch<='9'){
			return 52+ch-'0';
		}else if(ch=='+'){
			return 62;
		}else if(ch=='/'){
			return 63;
		}
		return 0;
	}
		

}

 

注意在电子邮件中编码时每76个字符需要加回车换行符,此时修改代码如下:

/**
	 * 电子邮件中的base64编码方式;
	 * @param value
	 * @return
	 */
	public static String encodeEmailBase64(byte[] value){
		//每76个字符需要加上一个换行符;
		String v=new String(value);
		StringBuilder sb = new StringBuilder();
		int len=value.length;
		int len76=len/76;
		int i=0;
		for(i=0;i<len76;i++){
			sb.append(v.substring(i*76, i*76+76));
			sb.append("\r\n");
		}
	    sb.append(v.substring(i*76));
		return encoderBase64(sb.toString().getBytes());
	}
	
	/**
	 * 电子邮件中的base64解码方式;
	 * @param value
	 * @return
	 */
	public static String decoderEmailBase64(byte[] value){
		//解密之后去掉回车换行符;
		String decResult=decoderBase64(value);
		String result=decResult.replaceAll("\r\n", " ");
		return result;
	}

 

 

分享到:
评论

相关推荐

    java 图片base64 加密解密

    在Java编程中,图片Base64加密解密是一种常见的数据处理技术,特别是在网络传输和存储时,由于Base64编码可以将二进制数据转换为可打印的ASCII字符,因此非常适用。`sun.misc.BASE64Encoder`和`sun.misc.BASE64...

    Java Base64加密解密方法工具类

    Java Base64加密解密方法工具类

    Base64加密解密java/js

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

    BASE64加密解密

    另外,`BASE64加密解密 方法.txt`很可能是详细介绍了如何在Java中实现BASE64加密解密的步骤和技术细节。 综上所述,BASE64加密解密在Java开发中是一个实用的技术,它允许开发者轻松地在二进制数据和ASCII字符串之间...

    用Java实现BASE64加密解密

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

    Base64加密解密工具类

    java开发使用base64进行加密解密,开发人员只需调用其中方法即可完成加密解密操作!

    base64加密解密的hive udf函数

    本文将详细探讨如何在Hive中自定义User Defined Function(UDF)来实现Base64的加密和解密。 首先,我们需要了解Base64的基本原理。Base64是一种将任意二进制数据转化为ASCII字符集的方法,它通过将每3个字节转换为...

    java_base64加密解密实例

    在给定的"java_base64加密解密实例"中,我们将探讨如何使用Apache Commons库进行Base64的加密和解密操作,并设置自定义密钥来增强安全性。 Apache Commons Codec库提供了Base64工具类,它包含了Base64编码和解码的...

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

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

    Base64 加密解密小工具

    总的来说,Base64是一种在不同系统之间传输二进制数据的便捷手段,而“Base64 加密解密小工具”则为用户提供了一个方便快捷的实现这一功能的平台。通过理解和熟练运用这类工具,可以更好地处理各种涉及二进制数据...

    AES加密解密 Base64加密解密

    java代码实例 AES加密解密 Base64加密解密

    Base64加密解密java工具类

    Base64加密解密java工具类

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

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

    jquery-base64加密解密,支持中文

    `jQuery`的Base64实现解决了这个问题,使得包含中文的字符串也可以安全地进行Base64转换。 描述中提到,加密发生在前端,使用`jQuery`,然后解密在后台,可能是Java环境中的Servlet。`jQuery`的`$.ajax`方法用于...

    pb和java对称base64加密解密

    在标题"pb和java对称base64加密解密"中,涉及到了两个编程语言——PowerBuilder(pb)和Java,以及一种常用的编码方式——Base64。同时,描述中提到了MD5加密,这又是一种常见的哈希加密算法。下面我们将详细探讨...

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

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

    Base64加密解密

    Base64加密与解密的实现,用java代码实现,下载即可放入工程中。

    java实现base64加密

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

    BASE64加密解密_源文件_jar文件.zip

    总的来说,这个资源为Android开发者提供了一套完整的BASE64加密解密解决方案,无论你是想要学习BASE64的工作原理,还是希望快速集成到项目中,这个压缩包都能满足需求。通过理解并应用这些知识,开发者能够更好地...

    base64的js与java相互解密.rar

    在项目开发中,会遇到前台js接收后台java传递的加密字符串,然后由js解密...或是后端java接收前台由js进行base64加密后的字符串,然后由java解密后进行处理。本文针对这种情况给出一种可行方法,且解决了中文乱码问题。

Global site tag (gtag.js) - Google Analytics