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是一种在PowerBuilder(PB)环境中实现的基于BASE64编码技术的加密和解密方法。BASE64是一种常见的数据编码方式,它将二进制数据转换为可打印的ASCII字符,常用于在网络上传输包含二进制的...
总的来说,C#中的Base64加密解密提供了简单且安全的方法来处理二进制数据,特别是在需要在文本环境(如邮件、网页)中传输时。在WinForm应用中,开发者可以结合UI设计,创建用户友好的工具,方便地进行Base64编码和...
无论是在Python还是Java,或者其他支持Base64的编程语言中,实现Base64的加密和解密都非常直观和便捷。需要注意的是,Base64并不是一种安全的加密算法,因为它只是数据的编码,不能防止数据被窃取或篡改。在需要安全...
base64 加密和解密,encode、decode,包括 Ansi 和 Unicode。
在IT领域,尤其是在编程...理解并掌握字符进制转换和Base64加密解密对于提升软件的安全性和数据处理能力至关重要。在PowerBuilder这样的开发环境中,熟练运用这些技术能够帮助开发者更好地处理数据,保障系统的安全性。
以下是如何使用BASE64对文件进行加密和解密的示例: ```java import java.nio.file.Files; import java.nio.file.Paths; import java.util.Base64; public class Base64Util { public static String ...
本文将详细探讨如何在Hive中自定义User Defined Function(UDF)来实现Base64的加密和解密。 首先,我们需要了解Base64的基本原理。Base64是一种将任意二进制数据转化为ASCII字符集的方法,它通过将每3个字节转换为...
另外,`BASE64加密解密 方法.txt`很可能是详细介绍了如何在Java中实现BASE64加密解密的步骤和技术细节。 综上所述,BASE64加密解密在Java开发中是一个实用的技术,它允许开发者轻松地在二进制数据和ASCII字符串之间...
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二...本资源使用C语言实现Base64加密和解密,可以实现数据的加密和文件的加密,不借助任何的第三方工具,便于移植。
在Java编程中,图片Base64加密解密是一种常见的数据处理技术,特别是在网络传输和存储时,由于Base64编码可以将二进制数据转换为可打印的ASCII字符,因此非常适用。`sun.misc.BASE64Encoder`和`sun.misc.BASE64...
在本文中,我们将深入探讨Base64加密解密的概念,以及如何使用C语言和VC(Visual C++)实现这两种功能。 Base64的基本原理是将每3个字节的数据(24位)转换成4个6位的Base64字符,每个Base64字符代表6位二进制数,...
Java Base64加密解密方法工具类
总结来说,C#的Base64加密解密工具提供了对二进制数据的简单编码和解码,方便在各种环境中传递和存储数据。源码的分析有助于开发者理解和掌握这一基础但实用的技术,进一步提高编程能力。在使用过程中,注意正确处理...
以下是对Base64加密解密的详细讲解以及如何在C# WinForm应用中实现。 首先,理解Base64的基本原理。Base64使用64个不同的字符(包括大小写字母、数字以及"+"和"/")来表示二进制数据,每个字符代表6位二进制数。...
非常实用的Base64加密,解密角本。基于UTF8,支持中文加解密。
在给定的"java_base64加密解密实例"中,我们将探讨如何使用Apache Commons库进行Base64的加密和解密操作,并设置自定义密钥来增强安全性。 Apache Commons Codec库提供了Base64工具类,它包含了Base64编码和解码的...
c++实现base64算法加密解密,不需要修改,直接运行即可
在VC++(Visual C++)编程中,实现Base64的加密和解密功能是常见的需求,特别是在处理如图片、文件或敏感数据时。下面将详细讲解VC++中Base64编码与解码的原理和实现方法。 Base64编码原理: 1. 将每3个字节(24位...
Base64加密&解密工具,可以用以验证咱编写Base64加密&解密程序的正确性。
总结,虽然SQL Server 2005本身并不提供内置的Base64加密解密功能,但通过创建自定义函数,我们可以实现类似的功能。需要注意的是,上述函数仅适用于简单场景,对于更复杂的需求,可能需要更完善的Base64编码解码...