`
luliangy
  • 浏览: 95248 次
  • 性别: 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;
	}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics