简介

  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的更多相关文章

  1. 介绍对称加密算法,最常用的莫过于DES数据加密算法

    DES DES-Data Encryption Standard,即数据加密算法.是IBM公司于1975年研究成功并公开发表的.DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个 ...

  2. 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

  3. Android 数据加密算法 Des,Base64详解

    一,DES加密: 首先网上搜索了一个DES加密算法工具类: import java.security.*;import javax.crypto.*; public class DesHelper { ...

  4. 目前常用的加密算法有DES(Data Encryption Standard)和IDEA(International Data Encryption Algorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。提交该系统的代码,该系统务必是一个可以能够直接使用的系统,查阅资料完成相应加密算法的实现;

    1.加密算法的类图结构 2.源代码 2.1代码运行截图 2.2代码的目录结构 2.3具体代码 MethodFactory.java package jiami; public interface Me ...

  5. 数据加密算法--详解DES加密算法原理与实现

    DES算法简介 DES(Data Encryption Standard)是目前最为流行的加密算法之一.DES是对称的,也就是说它使用同一个密钥来加密和解密数据. DES还是一种分组加密算法,该算法每 ...

  6. 适用于单片机的数据加密算法:xxtea

    转:https://www.cnblogs.com/LittleTiger/p/4384741.html 各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加 ...

  7. xxtea---单片机数据加密算法

    转:https://www.cnblogs.com/LittleTiger/p/4384741.html 各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加 ...

  8. c++Builder XE6 MD5 加密算法 BASE64 URL 编码

    xe6,xe7 BASE64XE6 MD5 加密算法Delphifunction MD5(const texto: string): string; var idmd5: TIdHashMessage ...

  9. 【asp.net core 系列】12 数据加密算法

    0. 前言 这一篇我们将介绍一下.net core 的加密和解密.在Web应用程序中,用户的密码会使用MD5值作为密码数据存储起来.而在其他的情况下,也会使用加密和解密的功能. 常见的加密算法分为对称 ...

随机推荐

  1. XML自己定义检查器语法+约束(1)

    每次使用它检查xml文件时,仅仅需改动xmldoc.load("xml文件名称");中的文件名称,然后将该文件放在浏览器中执行就可以. 依据浏览器弹出的对话框进行推断自己写的xml ...

  2. POJ 2001 Shortest Prefixes(字典树)

    题目地址:POJ 2001 考察的字典树,利用的是建树时将每个点仅仅要走过就累加.最后从根节点開始遍历,当遍历到仅仅有1次走过的时候,就说明这个地方是最短的独立前缀.然后记录下长度,输出就可以. 代码 ...

  3. [Typescript] Introduction to Generics in Typescript

    If Typescript is the first language in which you've encountered generics, the concept can be quite d ...

  4. 无法连接vCenter Server清单https://IP:10443

    VMware vCenter Server服务器安装系统的时候使用一个IP,安装完VMware vCenter后来更换了另外一个IP,当使用vSphere Web Client登陆VMware vCe ...

  5. awk命令简单学习

    请执行命令取出linux中eth0的IP地址(请用cut,有能力者也可分别用awk,sed命令答). 解答: 说明:此题解答方法已经给大家讲解了不下15种,还可以有很多,在这里给大家着重讲下awk的技 ...

  6. 如何在Eclipse中给main方法加参数

    在main方法中有一个args参数,那么如何给args参数赋值呢? public class TestMain { public static void main(String[] args) { f ...

  7. 磁盘阵列RAID

                                                                                  磁盘阵列RAID 年提出的.RAID名为独立 ...

  8. 移植openssh到nuc951 evb板

    移植openssh到nuc951 evb板 一 应用环境: 硬件:nuc951evb 软件:linux2.6.35 bsp 二 交叉编译openssl openssh 1.下载 openssl-1.0 ...

  9. li的border无法和上边对齐

    如果利用border设置四周的border,如果一边的边框比较长无法对齐 解决办法: .test{ position: relative; border: 1px solid #808080; hei ...

  10. java虚拟机内存分析

    1.大致来说java虚拟机分为:堆  栈 栈在数据结构就是那个先进后出的栈.堆...这名字我一听就觉得大..毕竟我们形容东西多又没什么大多的组织的时候就是一堆一堆的....(原谅我发散性的思维,我是妹 ...