数据加密算法---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值作为密码数据存储起来.而在其他的情况下,也会使用加密和解密的功能. 常见的加密算法分为对称 ...
随机推荐
- [Javascript] Advanced Reduce: Common Mistakes
Take away: Always check you ruturn the accumulator Always pass in the inital value var data = [" ...
- STL之Iterator(迭代器)
概述 根据迭代器功能的不同,将迭代器分为以下几类: Iterator Category Ability Providers Input iterator Reads forward istream O ...
- 【转载】python:特殊函数使用方式
[转载]廖雪峰的官方网站 可变参数 在Python函数中,还可以定义可变参数.顾名思义,可变参数就是传入的参数个数是可变的. 我们以数学题为例子,给定一组数字a,b,c……,请计算a2 + b2 + ...
- Debian耳机声音问题
Debian耳机声音问题 关于Debian声音问题 debian testing基本系统安装无声音问题解决 耳机声音问题 之前耳机声音一直正常,使用部分软件更改声卡设置后,计算机可以播放外音,但是耳机 ...
- AS 断点调试 debug
debug面板 点击下图工具栏开启调试会话 此种调试方式是通过冻结应用运行的状态,仿佛时间停止了一般,然后我们逐一观察此时程序的各个参数是否符合我们的预期. 这种调试方法适用于对时间不敏感的程序.也就 ...
- java09数组的使用
/** * 数组:存储相同数据类型的一组数据! * 声明一个数组就是在内存中开辟了一连串的连续空间! * * 数组和String 都是 引用数据类型 * 数组的使用 */ @Test public v ...
- 小学生之SpringMVC
1. Springmvc是什么? Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基 ...
- 程序员必备英语.net版(.net菜鸟的成长之路-零基础到精通)
通过一段时间的.NET学习,我发现英文不好是我的软肋~我觉得好好补习一下英文单词水平.可是要背哪些单词呢? 经过一段时间的整理,终于整理出来了一套比较完整的.NET程序员必备单词文档.单词加详细说明. ...
- C#之Linq学习笔记【转】
写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...
- ADSL拨号连接
dotras是一个提供远程访问服务的组件,使用它可以方便的 进行宽带拨号连接 由于不同的系统中dotras调用的底层api可能不同,所以使用时要根据不同的系统使用不同的dotras. dotras目前 ...