public class MyBase64 {
/**
* 执行加密操作
*/
public static byte[] myEncode(byte[] data){
byte[] result; //加密结果
int modulus = data.length % 3;
if (modulus == 0) { //每三位补一位,剩余不为0则不够三位补一位 来确定加密后byte的长度
result = new byte[(4 * data.length) / 3];
} else {
result = new byte[4 * ((data.length / 3) + 1)];
}
int dataLength = (data.length - modulus); // 得到有多少个三位
int datatemp1;
int datatemp2;
int datatemp3;
for (int i = 0, j = 0; i < dataLength; i += 3, j += 4) { //加密前dataLength组三位元数据
datatemp1 = data[i] & 0xff;
datatemp2 = data[i + 1] & 0xff;
datatemp3 = data[i + 2] & 0xff;
result[j] = encodingTable[(datatemp1 >>> 2) & 0x3f];
result[j + 1] = encodingTable[((datatemp1 << 4) | (datatemp2 >>> 4)) & 0x3f];
result[j + 2] = encodingTable[((datatemp2 << 2) | (datatemp3 >>> 6)) & 0x3f];
result[j + 3] = encodingTable[datatemp3 & 0x3f];
}
//下面开始加密剩余不够三位的数据
int resulttemp1;
int resulttemp2;
int resulttemp3;
int datalasttemp1;
int datalasttemp2;
switch (modulus) {
case 0: // nothing left to do
break;
case 1: // left one to do
datalasttemp1 = data[data.length - 1] & 0xff;
resulttemp1 = (datalasttemp1 >>> 2) & 0x3f;
resulttemp2 = (datalasttemp1 << 4) & 0x3f;
result[result.length - 4] = encodingTable[resulttemp1];
result[result.length - 3] = encodingTable[resulttemp2];
result[result.length - 2] = (byte) '=';
result[result.length - 1] = (byte) '=';
break;
case 2: // left two to do
datalasttemp1 = data[data.length - 2] & 0xff;
datalasttemp2 = data[data.length - 1] & 0xff;
resulttemp1 = (datalasttemp1 >>> 2) & 0x3f;
resulttemp2 = ((datalasttemp1 << 4) | (datalasttemp2 >>> 4)) & 0x3f;
resulttemp3 = (datalasttemp2 << 2) & 0x3f;
result[result.length - 4] = encodingTable[resulttemp1];
result[result.length - 3] = encodingTable[resulttemp2];
result[result.length - 2] = encodingTable[resulttemp3];
result[result.length - 1] = (byte) '=';
break;
}
return result;
}
/**
* 执行解密操作
*/
public static byte[] myDecode(String data) {
byte[] result;
byte datatemp1;
byte datatemp2;
byte datatemp3;
byte datatemp4;
data = discardNonBase64Chars(data); //去除非本加密用到的字符
if (data.charAt(data.length() - 2) == '=') { //加密后的字符串倒数第二位为'=' 则原字符串的长度是三的倍数+1
result = new byte[(((data.length() / 4) - 1) * 3) + 1];
} else if (data.charAt(data.length() - 1) == '=') { //加密后的字符串倒数第一位为'=' 则原字符串的长度是三的倍数+2
result = new byte[(((data.length() / 4) - 1) * 3) + 2];
} else {
result = new byte[((data.length() / 4) * 3)]; //加密后的字符串倒数第二位和倒数第二位都不为'=' 则原字符串的长度是三的倍数
}
for (int i = 0, j = 0; i < (data.length() - 4); i += 4, j += 3) { //把前N组四位加密后的字符串转回前N组三位原字符串
datatemp1 = decodingTable[data.charAt(i)];
datatemp2 = decodingTable[data.charAt(i + 1)];
datatemp3 = decodingTable[data.charAt(i + 2)];
datatemp4 = decodingTable[data.charAt(i + 3)];
result[j] = (byte) ((datatemp1 << 2) | (datatemp2 >> 4));
result[j + 1] = (byte) ((datatemp2 << 4) | (datatemp3 >> 2));
result[j + 2] = (byte) ((datatemp3 << 6) | datatemp4);
}
if (data.charAt(data.length() - 2) == '=') { //加密后的字符串倒数第二位为'=' 则原字符串的长度是三的倍数+1 把加密后的字符串的倒数3、4位转回原字符串的最后一位
datatemp1 = decodingTable[data.charAt(data.length() - 4)];
datatemp2 = decodingTable[data.charAt(data.length() - 3)];
result[result.length - 1] = (byte) ((datatemp1 << 2) | (datatemp2 >> 4));
} else if (data.charAt(data.length() - 1) == '=') { //加密后的字符串倒数第一位为'=' 则原字符串的长度是三的倍数+2 把加密后的字符串的倒数2、3、4位转回原字符串的最后二位
datatemp1 = decodingTable[data.charAt(data.length() - 4)];
datatemp2 = decodingTable[data.charAt(data.length() - 3)];
datatemp3 = decodingTable[data.charAt(data.length() - 2)];
result[result.length - 2] = (byte) ((datatemp1 << 2) | (datatemp2 >> 4));
result[result.length - 1] = (byte) ((datatemp2 << 4) | (datatemp3 >> 2));
}
return result;
}
/**
* 去除非本加密用到的字符
*/
private static String discardNonBase64Chars(String data) {
StringBuffer sb = new StringBuffer();
int length = data.length();
for (int i = 0; i < length; i++) {
if (isValidBase64Byte((byte) (data.charAt(i)))) {
sb.append(data.charAt(i));
}
}
return sb.toString();
}
/**
* 判断是否是非本加密用到的字符
*/
private static boolean isValidBase64Byte(byte b) {
if (b == '=') {
return true;
} else if ((b < 0) || (b >= 128)) {
return false;
} else if (decodingTable[b] == -1) {
return false;
}
return true;
}
/**
* 解密用
*/
private static final byte[] decodingTable;
static {
decodingTable = new byte[128];
for (int i = 0; i < 128; i++) {
decodingTable[i] = (byte) -1;
}
for (int i = 'A'; i <= 'Z'; i++) {
decodingTable[i] = (byte) (i - 'A');
}
for (int i = 'a'; i <= 'z'; i++) {
decodingTable[i] = (byte) (i - 'a' + 26);
}
for (int i = '0'; i <= '9'; i++) {
decodingTable[i] = (byte) (i - '0' + 52);
}
decodingTable['+'] = 62;
decodingTable['/'] = 63;
}
/**
* 加密结果中的字符 64个字符
*/
private static final byte[] encodingTable = {
(byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E',
(byte) 'F', (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J',
(byte) 'K', (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O',
(byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T',
(byte) 'U', (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y',
(byte) 'Z', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd',
(byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i',
(byte) 'j', (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n',
(byte) 'o', (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's',
(byte) 't', (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x',
(byte) 'y', (byte) 'z', (byte) '0', (byte) '1', (byte) '2',
(byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7',
(byte) '8', (byte) '9', (byte) '+', (byte) '/'
};
}
/**
* 执行加密操作
*/
public static byte[] myEncode(byte[] data){
byte[] result; //加密结果
int modulus = data.length % 3;
if (modulus == 0) { //每三位补一位,剩余不为0则不够三位补一位 来确定加密后byte的长度
result = new byte[(4 * data.length) / 3];
} else {
result = new byte[4 * ((data.length / 3) + 1)];
}
int dataLength = (data.length - modulus); // 得到有多少个三位
int datatemp1;
int datatemp2;
int datatemp3;
for (int i = 0, j = 0; i < dataLength; i += 3, j += 4) { //加密前dataLength组三位元数据
datatemp1 = data[i] & 0xff;
datatemp2 = data[i + 1] & 0xff;
datatemp3 = data[i + 2] & 0xff;
result[j] = encodingTable[(datatemp1 >>> 2) & 0x3f];
result[j + 1] = encodingTable[((datatemp1 << 4) | (datatemp2 >>> 4)) & 0x3f];
result[j + 2] = encodingTable[((datatemp2 << 2) | (datatemp3 >>> 6)) & 0x3f];
result[j + 3] = encodingTable[datatemp3 & 0x3f];
}
//下面开始加密剩余不够三位的数据
int resulttemp1;
int resulttemp2;
int resulttemp3;
int datalasttemp1;
int datalasttemp2;
switch (modulus) {
case 0: // nothing left to do
break;
case 1: // left one to do
datalasttemp1 = data[data.length - 1] & 0xff;
resulttemp1 = (datalasttemp1 >>> 2) & 0x3f;
resulttemp2 = (datalasttemp1 << 4) & 0x3f;
result[result.length - 4] = encodingTable[resulttemp1];
result[result.length - 3] = encodingTable[resulttemp2];
result[result.length - 2] = (byte) '=';
result[result.length - 1] = (byte) '=';
break;
case 2: // left two to do
datalasttemp1 = data[data.length - 2] & 0xff;
datalasttemp2 = data[data.length - 1] & 0xff;
resulttemp1 = (datalasttemp1 >>> 2) & 0x3f;
resulttemp2 = ((datalasttemp1 << 4) | (datalasttemp2 >>> 4)) & 0x3f;
resulttemp3 = (datalasttemp2 << 2) & 0x3f;
result[result.length - 4] = encodingTable[resulttemp1];
result[result.length - 3] = encodingTable[resulttemp2];
result[result.length - 2] = encodingTable[resulttemp3];
result[result.length - 1] = (byte) '=';
break;
}
return result;
}
/**
* 执行解密操作
*/
public static byte[] myDecode(String data) {
byte[] result;
byte datatemp1;
byte datatemp2;
byte datatemp3;
byte datatemp4;
data = discardNonBase64Chars(data); //去除非本加密用到的字符
if (data.charAt(data.length() - 2) == '=') { //加密后的字符串倒数第二位为'=' 则原字符串的长度是三的倍数+1
result = new byte[(((data.length() / 4) - 1) * 3) + 1];
} else if (data.charAt(data.length() - 1) == '=') { //加密后的字符串倒数第一位为'=' 则原字符串的长度是三的倍数+2
result = new byte[(((data.length() / 4) - 1) * 3) + 2];
} else {
result = new byte[((data.length() / 4) * 3)]; //加密后的字符串倒数第二位和倒数第二位都不为'=' 则原字符串的长度是三的倍数
}
for (int i = 0, j = 0; i < (data.length() - 4); i += 4, j += 3) { //把前N组四位加密后的字符串转回前N组三位原字符串
datatemp1 = decodingTable[data.charAt(i)];
datatemp2 = decodingTable[data.charAt(i + 1)];
datatemp3 = decodingTable[data.charAt(i + 2)];
datatemp4 = decodingTable[data.charAt(i + 3)];
result[j] = (byte) ((datatemp1 << 2) | (datatemp2 >> 4));
result[j + 1] = (byte) ((datatemp2 << 4) | (datatemp3 >> 2));
result[j + 2] = (byte) ((datatemp3 << 6) | datatemp4);
}
if (data.charAt(data.length() - 2) == '=') { //加密后的字符串倒数第二位为'=' 则原字符串的长度是三的倍数+1 把加密后的字符串的倒数3、4位转回原字符串的最后一位
datatemp1 = decodingTable[data.charAt(data.length() - 4)];
datatemp2 = decodingTable[data.charAt(data.length() - 3)];
result[result.length - 1] = (byte) ((datatemp1 << 2) | (datatemp2 >> 4));
} else if (data.charAt(data.length() - 1) == '=') { //加密后的字符串倒数第一位为'=' 则原字符串的长度是三的倍数+2 把加密后的字符串的倒数2、3、4位转回原字符串的最后二位
datatemp1 = decodingTable[data.charAt(data.length() - 4)];
datatemp2 = decodingTable[data.charAt(data.length() - 3)];
datatemp3 = decodingTable[data.charAt(data.length() - 2)];
result[result.length - 2] = (byte) ((datatemp1 << 2) | (datatemp2 >> 4));
result[result.length - 1] = (byte) ((datatemp2 << 4) | (datatemp3 >> 2));
}
return result;
}
/**
* 去除非本加密用到的字符
*/
private static String discardNonBase64Chars(String data) {
StringBuffer sb = new StringBuffer();
int length = data.length();
for (int i = 0; i < length; i++) {
if (isValidBase64Byte((byte) (data.charAt(i)))) {
sb.append(data.charAt(i));
}
}
return sb.toString();
}
/**
* 判断是否是非本加密用到的字符
*/
private static boolean isValidBase64Byte(byte b) {
if (b == '=') {
return true;
} else if ((b < 0) || (b >= 128)) {
return false;
} else if (decodingTable[b] == -1) {
return false;
}
return true;
}
/**
* 解密用
*/
private static final byte[] decodingTable;
static {
decodingTable = new byte[128];
for (int i = 0; i < 128; i++) {
decodingTable[i] = (byte) -1;
}
for (int i = 'A'; i <= 'Z'; i++) {
decodingTable[i] = (byte) (i - 'A');
}
for (int i = 'a'; i <= 'z'; i++) {
decodingTable[i] = (byte) (i - 'a' + 26);
}
for (int i = '0'; i <= '9'; i++) {
decodingTable[i] = (byte) (i - '0' + 52);
}
decodingTable['+'] = 62;
decodingTable['/'] = 63;
}
/**
* 加密结果中的字符 64个字符
*/
private static final byte[] encodingTable = {
(byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E',
(byte) 'F', (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J',
(byte) 'K', (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O',
(byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T',
(byte) 'U', (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y',
(byte) 'Z', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd',
(byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i',
(byte) 'j', (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n',
(byte) 'o', (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's',
(byte) 't', (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x',
(byte) 'y', (byte) 'z', (byte) '0', (byte) '1', (byte) '2',
(byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7',
(byte) '8', (byte) '9', (byte) '+', (byte) '/'
};
}
发表评论
-
临时 myeclipse 配置标识所选变量、源码
2010-05-31 10:11 700标识所选变量见图片。 源码: 1 window Prefer ... -
临时存放 ibatis
2010-04-20 16:36 680a.ksyysj >=#ksyysj:DATE# ... -
was 记录日志问题
2010-02-08 14:48 774需要在/opt/IBM/WebSphere/AppServer ... -
解决 backspace 返回登录页面 问题
2009-07-31 09:00 1514loging.jsp登录到index.jsp 方式:windo ... -
webservice记录
2009-07-23 14:48 731Client client=new Client(new ja ... -
jfreechart
2009-02-17 22:20 764需要两个包:jcommon和jfreechart 去百度一下 ...
相关推荐
普通加密:对本机文件夹进行的一种加密模式,加密后的文件夹不能复制,删除或者改名,不能传递给其它用户使用. 携带加密:将文件夹加密后。通过网络或其他的方法在没有安装[文件夹加密大师]的机器上使用。 自创3种...
注册用户可以使用急救中心恢复数据(但只能恢复使用了“普通加密”的文件,即使是我们也无法恢复使用了“较高或最高加密强度”加密的文件) 2. 加密文件夹内,"lockdir.exe"这个解密程序被删除了,我该怎样才能解密...
lockdir_59103文件夹加密器功能: 加密当前文件夹--加密其他文件夹。...加密速度:普通(每秒50个文件) 加密方法:打乱文件结构,并加密文件头部数据。 安全性:普通 加密速度:最快 加密方法:隐藏锁定。
加密侠软件的操作界面通常简洁易用,允许用户快速选择要加密的文件或文件夹,并提供多种加密模式,例如临时加密、普通加密和隐藏加密。临时加密适用于短时间内保护数据,一旦用户退出软件,加密就会自动解除。普通...
普通线路和加密线路作为两种常见的数据传输方式,它们各有特点,适用于不同的应用场景。 首先,普通线路,也称为非加密线路,是指在数据传输过程中不进行任何加密处理的通信线路。在普通线路中,数据以原始、明文的...
#### 一、普通加密方法 Word文档的安全性对于个人和企业来说至关重要。在日常工作中,我们需要确保文档不被未授权访问或修改。Word提供了多种加密方式来保护文档的安全。 **步骤如下:** 1. **打开Word文档**:...
本文将详细介绍一种图片加密解密系统的三种主要加密方法:普通加密、图片加水印加密以及MD5+DES双重加密,并对这些方法进行对比分析。 #### 二、普通加密 **定义与原理:** 该系统采用了一级加密方式,即通过获取...
ClassFinal字节码加密工具 v1.2.1.zip
域天加密开发算法文档,域天文档加密的各类文档开发
普通加密直接对数据进行散列处理,而密码加密则使用了`FormsAuthentication.HashPasswordForStoringInConfigFile`方法,该方法专门用于安全地存储密码,其内部实现也基于MD5,但会添加额外的盐值以增加破解难度。...
我以前也用过好几个加密软件,加密的资料突然密码不对或加密的文件不见了,更或者系统重装后加密的文件找不到,损失极大,有了本软件你再也不用忍受丢失文件的痛苦 成功解决了以前那些加密软件的不足,使用户不再...
"便携加密器"不仅能够加密文件内容,还能加密文件名和文件夹,这是许多普通加密软件所不具备的功能。文件名和文件夹的加密使得即使数据被非法获取,攻击者也无法根据文件名推测其内容,进一步增强了数据的保密性。这...
本文将详细介绍Word文档的三种加密方式:普通加密、模板加密以及宏自动加密。 #### 二、普通加密 **步骤详解**: 1. **打开文档**:首先,打开需要加密的Word文档。 2. **选择“工具”菜单**:点击菜单栏中的...
综上所述,实现Spring Boot与普通JAR的加密涉及多个环节,包括选择合适的加密算法、编写加密工具、处理JAR文件、解密运行时以及考虑安全性、性能、备份策略和法规合规性。通过精心设计和实施,我们可以有效提升...
js加密 js加密工具 js格式化 evel加解密 普通加密 代码整理
TrueCrypt是一款已停止更新但仍然被许多用户信赖的开源磁盘加密软件,它允许用户创建隐藏或普通加密卷,以保护敏感数据。然而,如果加密密钥被泄露,那么加密的卷也可能变得容易受到攻击。为了增强安全性,可以使用...
【标题】: U盘的加密技术 - 类似加密狗实现 在信息技术领域,数据安全是至关重要的,尤其是在移动存储设备如U盘的使用中。"U盘的加密(类似加密狗)"指的是通过特定的技术手段对U盘进行加密,以保护其中的数据不被...
1. 普通加密:在Mac上,你可以使用“文件保险箱”功能为文件或文件夹设置密码。选择目标文件,点击“文件”菜单,然后选择“共享”>“密码保护”。输入密码并确认,即可创建一个加密的DMG文件。 2. MD5加密:MD5是一...
在提供的代码示例中,展示了如何在ASP.NET中使用MD5对字符串进行加密,分为两种方式:普通加密和密码方式加密。 1. **普通加密**: 在`Page_Load`事件处理程序中,首先获取`source.Text`的Unicode编码形式的字节...
FNC公式密码破解器