数据加密算法---base64
简介
base64是把8位字符打散,转换成不被人直接识别的形式,严格来说它并不是加密算法,只能算做一种编码方式
原理
- 首先准备64个字符数组做为“数组库”
['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
- 把传入的参数每三个字符分组,每组为8*3=24bit,把24个字节每6个一组,共四个字符(高位补00),计算第个字符的十进制值做下标从“数组库”中取得字符

- 如果最后一组不满三个字符,就用\x00 补上,最后在加上一个或二个= 表示补了多少字符,解码时会去掉
java的实现
/**
* BASE64解密
*
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
} /**
* BASE64加密
*
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}
我的实现
package com.gbz.lemon.util; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class MyBase64 { private static Logger log = LoggerFactory.getLogger(MyBase64.class); private static final int SIGN_GREP_SIZE = 3; private static final int UNSIGN_GREP_SIZE = 4; private static final String HIGH_FILL = "0" ; private static final String COVER = "="; public static final String[] BASE_CHARS = { "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", "+", "/" }; /**
* 加密
*
* @param src
* @return
*/
public static String encoder(String src) {
String[][] grepString = signGrepString(src);
if ( grepString == null) {
return null;
}
StringBuffer ret = new StringBuffer();
String end = "";
int grepi = grepString. length;
log.debug( "字符串 {} 被分成了 {} 份" , src , grepi);
for ( int j = 0; j < grepi; j++) {
String[] strings = grepString[ j];
String grepStrToBinary = grepStrToBinary(strings);
int indexOf = grepStrToBinary.indexOf(COVER );
if ( indexOf > 0) {
end = grepStrToBinary.substring(indexOf );
grepStrToBinary = grepStrToBinary.substring(0, indexOf );
}
String[][] targat = grepString(grepStrToBinary, 6);
log.debug( "{}-->{},分组:{}" , strings , grepStrToBinary, targat );
int targatSize = targat. length; for ( int i = 0; i < targatSize; i++) {
String[] strings2 = targat[ i];
StringBuffer sb = new StringBuffer();
for ( int h = 0; h < strings2. length; h++) {
sb.append( strings2[ h]);
}
String s = sb.toString();
int index = Integer. parseInt(s, 2);
ret.append( BASE_CHARS[index ]);
} } return ret.toString() + end;
} public static String decoder(String src) {
int coverIndex = src.indexOf( COVER);
String noCoverSrc = src;
String cover = "";
if ( coverIndex > 0) {
cover = src.substring( coverIndex);
noCoverSrc = src.substring(0, coverIndex);
} else {
coverIndex = 0;
} String[][] nusignGrepString = nusignGrepString(noCoverSrc);
if ( nusignGrepString == null) {
return null;
}
StringBuffer indexs = new StringBuffer();
int strlen = nusignGrepString. length;
log.debug( "待解密字符串被 分为{}组" , strlen ); for ( int i = 0; i < strlen; i++) {
String[] strings = nusignGrepString[ i];
String index = signStrToBaseChasreIndex(strings);
indexs.append( index);
log.debug( "{}-->{}", strings , index );
} StringBuffer decoderStr = new StringBuffer();
String[][] targat = grepString(indexs.toString(), 8);
String[] tar = null;
int maxlen = targat. length - cover.length();
for ( int i = 0; i < maxlen; i++) {
tar = targat[ i];
String stringFromBinary = binaryToString(tar);
decoderStr.append( stringFromBinary);
} return decoderStr.toString();
} private static String binaryToString(String[] tar) {
StringBuffer str = new StringBuffer();
for (String c : tar) {
str.append( c);
}
char c = ( char) Integer.parseInt(str.toString(),2); return c + "";
} /**
* 把待解密字符转换成字符库下标
*
* @param str
* @return
*/
private static String signStrToBaseChasreIndex(String[] str ) {
StringBuffer sb = new StringBuffer();
int len = str. length;
int baseLen = BASE_CHARS.length ;
for ( int i = 0; i < len; i++) {
String string = str[ i];
for ( int j = 0; j < baseLen; j++) {
if ( BASE_CHARS[j ].equals(string )) {
String binaryString = Integer.toBinaryString(j);
String highFILL = highFILL(binaryString, 6);
sb.append( highFILL);
}
}
} return sb.toString();
} /**
* 把字符数组转成二进制形式
*
* @param grepStr
* @return
*/
private static String grepStrToBinary(String[] grepStr) {
String endStr = "";
String binaryStr = "";
String str = "";
for ( int i = 0; i < SIGN_GREP_SIZE; i ++) {
str = grepStr[ i];
if ( str == null) {
str = HIGH_FILL;
endStr += COVER;
}
char charAt = str.charAt(0);
String binaryString = Integer.toBinaryString(charAt);
binaryString = highFILL(binaryString);
binaryStr += binaryString;
}
return binaryStr + endStr;
} /**
* 对二进制补码
*
* @param binaryStr
* @param size
* @return
*/
private static String highFILL(String binaryStr, int size) { int length = binaryStr.length();
for (; length < size; length = binaryStr.length()) {
binaryStr = HIGH_FILL + binaryStr ;
}
return binaryStr;
} /**
* 对二进制码,不足8位的进行补充
*
* @param binaryStr
* @return
*/
private static String highFILL(String binaryStr) {
return highFILL(binaryStr, 8);
} private static String[][] nusignGrepString(String str) {
return grepString(str, UNSIGN_GREP_SIZE);
} private static String[][] signGrepString(String str) {
return grepString(str, SIGN_GREP_SIZE);
} /**
* 将字符串n个一组
*
* @param str
* @param grepSize
* @return
*/
private static String[][] grepString(String str, int grepSize) {
if ( str == null || "".equals( str)) {
log.error( "待分组数组为空" );
return null;
} int size = str.length();
int grepArraySize = size / grepSize;
if ( size % grepSize > 0) {
grepArraySize++;
}
String[][] grep = new String[ grepArraySize][];
int grepi = 0; for ( int i = 0; i < size;) {
grep[ grepi] = new String[ grepSize];
for ( int subGrepi = 0; subGrepi < grepSize && i < size ; subGrepi ++) {
grep[ grepi][ subGrepi] = str.substring( i, ++ i);
}
grepi++;
} return grep;
} public static void main(String[] args) {
String s = encoder("aasdg44asgs");
System. out.println( s);
System. out.println( decoder(s));
}
}
数据加密算法---base64的更多相关文章
- 介绍对称加密算法,最常用的莫过于DES数据加密算法
DES DES-Data Encryption Standard,即数据加密算法.是IBM公司于1975年研究成功并公开发表的.DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个 ...
- 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
- Android 数据加密算法 Des,Base64详解
一,DES加密: 首先网上搜索了一个DES加密算法工具类: import java.security.*;import javax.crypto.*; public class DesHelper { ...
- 目前常用的加密算法有DES(Data Encryption Standard)和IDEA(International Data Encryption Algorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。提交该系统的代码,该系统务必是一个可以能够直接使用的系统,查阅资料完成相应加密算法的实现;
1.加密算法的类图结构 2.源代码 2.1代码运行截图 2.2代码的目录结构 2.3具体代码 MethodFactory.java package jiami; public interface Me ...
- 数据加密算法--详解DES加密算法原理与实现
DES算法简介 DES(Data Encryption Standard)是目前最为流行的加密算法之一.DES是对称的,也就是说它使用同一个密钥来加密和解密数据. DES还是一种分组加密算法,该算法每 ...
- 适用于单片机的数据加密算法:xxtea
转:https://www.cnblogs.com/LittleTiger/p/4384741.html 各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加 ...
- xxtea---单片机数据加密算法
转:https://www.cnblogs.com/LittleTiger/p/4384741.html 各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加 ...
- c++Builder XE6 MD5 加密算法 BASE64 URL 编码
xe6,xe7 BASE64XE6 MD5 加密算法Delphifunction MD5(const texto: string): string; var idmd5: TIdHashMessage ...
- 【asp.net core 系列】12 数据加密算法
0. 前言 这一篇我们将介绍一下.net core 的加密和解密.在Web应用程序中,用户的密码会使用MD5值作为密码数据存储起来.而在其他的情况下,也会使用加密和解密的功能. 常见的加密算法分为对称 ...
随机推荐
- Lucene自定义扩展QueryParser
Lucene版本:4.10.2 在使用lucene的时候,不可避免的需要扩展lucene的相关功能来实现业务的需要,比如搜索时,需要在满足一个特定范围内的document进行搜索,如年龄在20和30岁 ...
- 使用MFC读写Excel
_Application m_ExlApp; //组件服务器的各个classes _Workbook m_ExlBook; Workbooks m_ExlBooks; _W ...
- 配置NFS服务器
一.配置NFS服务器 1.安装软件包 [root@wjb10000 ~]# yum -y install nfs-utils.x86_64 2.修改配置文件[root@wjb10000 ~]# vim ...
- NYOJ-129 并查集
这个题基本上是并查集稍微一变, 只是加了一些判断条件而已,就是将点合并成树, 最后遍历一下, 统计一下有多少棵树, 如果不是1的话, 肯定不是树,所以,可以根据这个来判断 #include <s ...
- 【转】node-webkit:开发桌面+WEB混合型应用的神器
顾名思义,node-webkit就是nodejs+webkit. 这样做的好处显而易见,核心奥义在于,用nodejs来进行本地化调用,用webkit来解析和执行HTML+JS. 快速上手 下载node ...
- svn和git比较
svn有哪些优点和缺点? git有哪些优点和缺点? git最突然的优点就是gitflow,开发新的功能都是开一个新分支feature,完成开发新特性,合并到develop分支:提交测试也是新增一个分支 ...
- 初级班 Linux使用
ifconfig 查看IP地址 重新启动网卡服务 service network restart 笔记 1.通过远程工具登陆到linux后,所在的位置是当前登录用户的家目录(home director ...
- oracle单行函数之数字函数
round--四舍五入函数 trunc--截断函数 mod--求余函数 round和trunc除了可以操作数字外还可以操作日期. Demo SQL),),),),) from dual ; ) ) ) ...
- PULL生成XML文件
package xmlpulldemo; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...
- 使用2to3转换python代码
如果要把python2编译器下的代码转换升级到python3编译器,可以使用python自带的 2to3工具进行转化: windows下转化: doc 命令窗口: >> python C ...