`
Mossad
  • 浏览: 82171 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Base64的加密和解密

 
阅读更多

Base64加密的方法是:将字节(bytes)序列转换为字符(character)序列,每3个字节转换为4个字符(3 * 8 = 4 * 6),像这样:|11111122|22223333|33444444| >> |00111111|00222222|00333333|00444444|,不足三个字节的用'='填充,所以最后的字符序列数一定是4的倍数。解密就是加密的逆过程咯!

 

下面的Java代码有三种实现方式:

Simple:最简单直接的实现方法;

Grace:比较优雅的实现方法;

Official:JDK自带的实现方法;

 

首先定义接口:

 

package com.hp.it.mossad.algorithms.base64;

public interface IBase64 {
	String encode(byte[] code);

	String decode(char[] code);
}
 

然后是实现类:

 

package com.hp.it.mossad.algorithms.base64;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.InvalidParameterException;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public enum Base64Type {
	
	GRACE(new IBase64() {
		public String encode(byte[] data) {
			int length = (int)Math.ceil(data.length / 3.0) * 4;
			char[] out = new char[length];
			for (int i = 0, j = 0; i < data.length ; i += 3, j += 4) {
				boolean quad = false;
				boolean trip = false;
				int val = 0xff & data[i];
				val <<= 8;
				if (i + 1 < data.length) {
					val |= 0xff & data[i + 1];
					trip = true;
				}
				val <<= 8;
				if (i + 2 < data.length) {
					val |= 0xff & data[i + 2];
					quad = true;
				}
				out[j + 3] = alphabet[quad ? (0x3f & val) : 64];
				val >>= 6;
				out[j + 2] = alphabet[trip ? (0x3f & val) : 64];
				val >>= 6;
				out[j + 1] = alphabet[0x3f & val];
				val >>= 6;
				out[j] = alphabet[0x3f & val];
			}
			return new String(out);
		}
		
		public String decode(char[] data) {
			if (data.length % 4 != 0) throw new InvalidParameterException("Invalid length of array : " + data.length);
			int length = data.length / 4 * 3;
			if (data.length > 0 && data[data.length - 1] == '=') length--;
			if (data.length > 1 && data[data.length - 2] == '=') length--;
			byte[] out = new byte[length];
			int shift = 0;
			int valley = 0x00;
			int index = 0;
			for (int i = 0; i < data.length; i++) {
				int value = codes[data[i]];
				if (value >= 0) {
					valley <<= 6;
					valley |= value;
					shift += 6;
					if (shift >= 8) {
						shift -= 8;
						out[index++] = (byte)((valley >> shift) & 0xff);
					}
				}
			}
			return new String(out);
		}
	}),
	
	SIMPLE(new IBase64() {
		public String encode(byte[] bs) {
			int count = bs.length / 3;
			int rm = bs.length % 3;
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			for (int i = 0; i < count; i++) {
				int index = i * 3;
				baos.write(alphabet[(bs[index] & 0xfc) >> 2]);
				baos.write(alphabet[((bs[index] & 0x03) << 4 | (bs[index + 1] & 0xf0) >> 4)]);
				baos.write(alphabet[(bs[index + 1] & 0x0f) << 2 | (bs[index + 2] & 0xc0) >> 6]);
				baos.write(alphabet[bs[index + 2] & 0x3f]);
			}
			if (rm == 1) {
				baos.write(alphabet[(bs[bs.length - 1] & 0xfc) >> 2]);
				baos.write(alphabet[(bs[bs.length - 1] & 0x03) << 4]);
				baos.write('=');
				baos.write('=');
			} else if (rm == 2) {
				baos.write(alphabet[(bs[bs.length - 2] & 0xfc) >> 2]);
				baos.write(alphabet[(bs[bs.length - 2] & 0x03) << 4 | (bs[bs.length - 1] & 0xf0) >> 4]);
				baos.write(alphabet[(bs[bs.length - 1] & 0x0f) << 2]);
				baos.write('=');
			}
			return baos.toString();
		}
		
		public String decode(char[] data) {
			if (data.length % 4 != 0) throw new InvalidParameterException("The lengh is invalid!");
			int count = data.length / 4;
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			for (int i = 0; i < count - 1; i++) {
				int index = i * 4;
				baos.write((codes[data[index]] & 0x3f) << 2 | (codes[data[index + 1]] & 0x30) >> 4);
				baos.write((codes[data[index + 1]] & 0x0f) << 4 | (codes[data[index + 2]] & 0x3c) >> 2);
				baos.write((codes[data[index + 2]] & 0x03) << 6 | codes[data[index + 3]] & 0x3f);
			}
			if (data[data.length - 2] == '=') {
				baos.write((codes[data[data.length - 4]] & 0x3f) << 2 | ((codes[data[data.length - 3]] & 0x30) >> 4));
			} else if (data[data.length - 1] == '=') {
				baos.write((codes[data[data.length - 4]] & 0x3f) << 2 | ((codes[data[data.length - 3]] & 0x30) >> 4));
				baos.write((codes[data[data.length - 3]] & 0x0f) << 4 | ((codes[data[data.length - 2]] & 0x3c)) >> 2);
			}
			return baos.toString();
		}
	}),
	
	OFFICIAL(new IBase64() {

		@Override
		public String encode(byte[] code) {
			return encoder.encode(code);
		}

		@Override
		public String decode(char[] code) {
			try {
				return new String(decoder.decodeBuffer(new String(code)));
			} catch (IOException e) {
				e.printStackTrace();
			}
			return null;
		}
		
		private BASE64Encoder encoder = new BASE64Encoder();
		private BASE64Decoder decoder = new BASE64Decoder();
	});
	
	private Base64Type(IBase64 ib) {
		this.ib = ib;
	}
	
	private IBase64 ib;
	
	public String encode(byte[] code) {
		return this.ib.encode(code);
	}
	
	public String decode(char[] code) {
		return this.ib.decode(code);
	}
	
	private static char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharArray();
	private static byte[] codes = new byte[128];
	static {
		for (int i = 0; i < codes.length; i++) {
			codes[i] = -1;
		}
		for (int i = 'A'; i <= 'Z'; i++) {
			codes[i] = (byte)(i - 'A');
		}
		for (int i = 'a'; i <= 'z'; i++) {
			codes[i] = (byte)(26 + i - 'a');
		}
		for (int i = '0'; i <= '9'; i++) {
			codes[i] = (byte)(52 + i - '0');
		}
		codes['+'] = 62;
		codes['/'] = 63;
	}
}

  最后是测试类:

 

package com.hp.it.mossad.algorithms.base64;

import org.junit.Test;

public class Base64Test {
	
	@Test
	public void grace() {
		test(Base64Type.GRACE);
	}
	
	@Test
	public void simple() {
		test(Base64Type.SIMPLE);
	}
	
	@Test
	public void official() {
		test(Base64Type.OFFICIAL);
	}
	
	private void test(Base64Type type) {
		String s = "Keep calm and carry on.";
		String encode = type.encode(s.getBytes());
		String decode = type.decode(encode.toCharArray());
		System.out.println(type.name() + " : " + s.equals(decode));
	}
}
分享到:
评论

相关推荐

    PB BASE64加密和解密DEMO

    PB BASE64加密和解密DEMO是一种在PowerBuilder(PB)环境中实现的基于BASE64编码技术的加密和解密方法。BASE64是一种常见的数据编码方式,它将二进制数据转换为可打印的ASCII字符,常用于在网络上传输包含二进制的...

    C# Base64加密解密

    总的来说,C#中的Base64加密解密提供了简单且安全的方法来处理二进制数据,特别是在需要在文本环境(如邮件、网页)中传输时。在WinForm应用中,开发者可以结合UI设计,创建用户友好的工具,方便地进行Base64编码和...

    base64加密和解密算法完整事例代码

    无论是在Python还是Java,或者其他支持Base64的编程语言中,实现Base64的加密和解密都非常直观和便捷。需要注意的是,Base64并不是一种安全的加密算法,因为它只是数据的编码,不能防止数据被窃取或篡改。在需要安全...

    Ansi 和 Unicode的base64 加密和解密

    base64 加密和解密,encode、decode,包括 Ansi 和 Unicode。

    PB关于字符进制数转化及base64加密、解密,nvo_base64.sru

    在IT领域,尤其是在编程...理解并掌握字符进制转换和Base64加密解密对于提升软件的安全性和数据处理能力至关重要。在PowerBuilder这样的开发环境中,熟练运用这些技术能够帮助开发者更好地处理数据,保障系统的安全性。

    将文件进行zip压缩并base64加密和解密

    以下是如何使用BASE64对文件进行加密和解密的示例: ```java import java.nio.file.Files; import java.nio.file.Paths; import java.util.Base64; public class Base64Util { public static String ...

    base64加密解密的hive udf函数

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

    BASE64加密解密

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

    C语言实现Base64编解码(加密和解密).zip

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二...本资源使用C语言实现Base64加密和解密,可以实现数据的加密和文件的加密,不借助任何的第三方工具,便于移植。

    java 图片base64 加密解密

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

    Base64加密解密_C语言实现和VC实现

    在本文中,我们将深入探讨Base64加密解密的概念,以及如何使用C语言和VC(Visual C++)实现这两种功能。 Base64的基本原理是将每3个字节的数据(24位)转换成4个6位的Base64字符,每个Base64字符代表6位二进制数,...

    Java Base64加密解密方法工具类

    Java Base64加密解密方法工具类

    C#base64加密解密工具(有源码)

    总结来说,C#的Base64加密解密工具提供了对二进制数据的简单编码和解码,方便在各种环境中传递和存储数据。源码的分析有助于开发者理解和掌握这一基础但实用的技术,进一步提高编程能力。在使用过程中,注意正确处理...

    Base64加密解密.zip

    以下是对Base64加密解密的详细讲解以及如何在C# WinForm应用中实现。 首先,理解Base64的基本原理。Base64使用64个不同的字符(包括大小写字母、数字以及"+"和"/")来表示二进制数据,每个字符代表6位二进制数。...

    Sql Server Base64加密解密角本

    非常实用的Base64加密,解密角本。基于UTF8,支持中文加解密。

    java_base64加密解密实例

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

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

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

    VC base64加密 解密

    在VC++(Visual C++)编程中,实现Base64的加密和解密功能是常见的需求,特别是在处理如图片、文件或敏感数据时。下面将详细讲解VC++中Base64编码与解码的原理和实现方法。 Base64编码原理: 1. 将每3个字节(24位...

    Base64加密&解密工具

    Base64加密&解密工具,可以用以验证咱编写Base64加密&解密程序的正确性。

    sqlserver2005的base64加密解密函数

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

Global site tag (gtag.js) - Google Analytics