`

算法原理

 
阅读更多

Base64算法的原理:传输8bie字节代码的编码方式之一,采用base64编码不具有可读性,编码后数据不会直接被肉眼所见到。

例子:

比如有三个字节首先将其转成ascii码然后取其二进制,取6个一组(这样就有4组),然后在前面自动补两个高位0,得到对应ascii码,再对照表还原字符。

对于JAVA base64 和js base64的代码(无论是编码还是解码,gbk,utf8,unicode不同格式结果不一样,现在代码这三个都能实现可以在参数中添加chartset)

编码为了保证在个数是3的倍数所以最后加一个或者两个”=“号最后两个:

在工作当中都是在jsp中进行加密然后参数传到后台后进行解密所以在这里 给出代码(ps:借鉴的代码可用)

package com.ailk.helios.admin.common.util;

import java.io.UnsupportedEncodingException;

/**
 * 
 * Copyright: Copyright (c) 2016 Asiainfo-Linkage
 * 
 * @ClassName: Base64Util.java
 * @Description: base64解密算法
 *
 * @version: v1.0.0
 * @author: Administrator
 * @date: 2016年3月15日 下午5:13:18
 *
 *        Modification History: Date Author Version Description
 *        ---------------------------------------------------------* 2016年3月15日
 *        Administrator v1.0.0 创建
 */
public class Base64Util {

	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;
	}

	public static byte[] decode(byte[] data) {
		byte[] bytes;
		byte b1;
		byte b2;
		byte b3;
		byte b4;
		data = discardNonBase64Bytes(data);
		if (data[data.length - 2] == '=') {
			bytes = new byte[(((data.length / 4) - 1) * 3) + 1];
		} else if (data[data.length - 1] == '=') {
			bytes = new byte[(((data.length / 4) - 1) * 3) + 2];
		} else {
			bytes = new byte[((data.length / 4) * 3)];
		}
		for (int i = 0, j = 0; i < (data.length - 4); i += 4, j += 3) {
			b1 = decodingTable[data[i]];
			b2 = decodingTable[data[i + 1]];
			b3 = decodingTable[data[i + 2]];
			b4 = decodingTable[data[i + 3]];
			bytes[j] = (byte) ((b1 << 2) | (b2 >> 4));
			bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2));
			bytes[j + 2] = (byte) ((b3 << 6) | b4);
		}
		if (data[data.length - 2] == '=') {
			b1 = decodingTable[data[data.length - 4]];
			b2 = decodingTable[data[data.length - 3]];
			bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4));
		} else if (data[data.length - 1] == '=') {
			b1 = decodingTable[data[data.length - 4]];
			b2 = decodingTable[data[data.length - 3]];
			b3 = decodingTable[data[data.length - 2]];
			bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4));
			bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2));
		} else {
			b1 = decodingTable[data[data.length - 4]];
			b2 = decodingTable[data[data.length - 3]];
			b3 = decodingTable[data[data.length - 2]];
			b4 = decodingTable[data[data.length - 1]];
			bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4));
			bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2));
			bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4);
		}
		return bytes;
	}

	public static byte[] decode(String data) {
		byte[] bytes;
		byte b1;
		byte b2;
		byte b3;
		byte b4;
		data = discardNonBase64Chars(data);
		if (data.charAt(data.length() - 2) == '=') {
			bytes = new byte[(((data.length() / 4) - 1) * 3) + 1];
		} else if (data.charAt(data.length() - 1) == '=') {
			bytes = new byte[(((data.length() / 4) - 1) * 3) + 2];
		} else {
			bytes = new byte[((data.length() / 4) * 3)];
		}
		for (int i = 0, j = 0; i < (data.length() - 4); i += 4, j += 3) {
			b1 = decodingTable[data.charAt(i)];
			b2 = decodingTable[data.charAt(i + 1)];
			b3 = decodingTable[data.charAt(i + 2)];
			b4 = decodingTable[data.charAt(i + 3)];
			bytes[j] = (byte) ((b1 << 2) | (b2 >> 4));
			bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2));
			bytes[j + 2] = (byte) ((b3 << 6) | b4);
		}
		if (data.charAt(data.length() - 2) == '=') {
			b1 = decodingTable[data.charAt(data.length() - 4)];
			b2 = decodingTable[data.charAt(data.length() - 3)];
			bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4));
		} else if (data.charAt(data.length() - 1) == '=') {
			b1 = decodingTable[data.charAt(data.length() - 4)];
			b2 = decodingTable[data.charAt(data.length() - 3)];
			b3 = decodingTable[data.charAt(data.length() - 2)];
			bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4));
			bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2));
		} else {
			b1 = decodingTable[data.charAt(data.length() - 4)];
			b2 = decodingTable[data.charAt(data.length() - 3)];
			b3 = decodingTable[data.charAt(data.length() - 2)];
			b4 = decodingTable[data.charAt(data.length() - 1)];
			bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4));
			bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2));
			bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4);
		}
		return bytes;
	}

	private static byte[] discardNonBase64Bytes(byte[] data) {
		byte[] temp = new byte[data.length];
		int bytesCopied = 0;
		for (int i = 0; i < data.length; i++) {
			if (isValidBase64Byte(data[i])) {
				temp[bytesCopied++] = data[i];
			}
		}
		byte[] newData = new byte[bytesCopied];
		System.arraycopy(temp, 0, newData, 0, bytesCopied);
		return newData;
	}

	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;
	}

	public static String decode(String data, String charset) {
		if (data == null || data.length() == 0){
			return data;
		}
		String decode = null;
		try {
			decode = new String(decode(data), charset);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return decode;
	}
}

 

 

//js base64

var keyStr = "ABCDEFGHIJKLMNOP" + 
             "QRSTUVWXYZabcdef" + 
             "ghijklmnopqrstuv" + 
             "wxyz0123456789+/" + 
             "=";
/**
 * js base64 加密
 * @param input
 * @returns {String}
 */
function base64_encode(input) { 
   input = unicodetoBytes(input); 
   var output = ""; 
   var chr1, chr2, chr3 = ""; 
   var enc1, enc2, enc3, enc4 = ""; 
   var i = 0;

   do { 
      chr1 = input[i++]; 
      chr2 = input[i++]; 
      chr3 = input[i++];

      enc1 = chr1 >> 2; 
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 
      enc4 = chr3 & 63;

      if (isNaN(chr2)) { 
         enc3 = enc4 = 64; 
      } else if (isNaN(chr3)) { 
         enc4 = 64; 
      }

      output = output + 
         keyStr.charAt(enc1) + 
         keyStr.charAt(enc2) + 
         keyStr.charAt(enc3) + 
         keyStr.charAt(enc4); 
      chr1 = chr2 = chr3 = ""; 
      enc1 = enc2 = enc3 = enc4 = ""; 
   } while (i < input.length);

   return output; 
}

function unicodetoBytes(s) 
{ 
   var result=new Array(); 
   if(s==null || s=="") return result; 
   result.push(255);
   result.push(254); 
   for(var i=0;i<s.length;i++) 
   { 
     var c=s.charCodeAt(i).toString(16); 
     if(c.length==1) i="000"+c; 
     else if(c.length==2) c="00"+c; 
     else if(c.length==3) c="0"+c; 
     var var1=parseInt( c.substring(2),16); 
     var var2=parseInt( c.substring(0,2),16); 
     result.push( var1); 
     result.push(var2) ; 
   } 
   return result; 
}

 

分享到:
评论

相关推荐

    上海交大算法原理课件

    上海交通大学算法原理的课件 第一章:算法分析的基本概念 二分搜索 合并排序 MERGE比较次数在 到n-1之间,赋值次数为2n 选择排序 SELECTIONSORT比较次数为n(n-1)/2,赋值次数为0到3(n-1)之间 插入排序 INSERTIONSORT...

    遗传算法原理及应用pdf

    遗传算法原理及应用遗传算法原理及应用遗传算法原理及应用

    Halcon机器视觉算法原理与编程实战.zip

    《Halcon机器视觉算法原理与编程实战》是针对Halcon这一全球知名机器视觉软件的一本实践教程。Halcon,由德国MVTec公司开发,是一款功能强大的机器视觉软件,广泛应用于工业自动化、质量控制、医学成像等领域。本书...

    Halcon机器视觉算法原理与编程实战.pptx

    "Halcon机器视觉算法原理与编程实战" 机器视觉是一种人工智能技术,利用计算机技术和图像处理技术来感知和理解现实世界中的各种图像和场景。机器视觉的应用范围非常广泛,包括工业自动化、智能交通、医疗诊断、安全...

    SM3算法原理

    SM3算法原理,朋友亲自整理的,供大家交流学习。

    LMS算法原理及推导

    ### LMS算法原理及推导 #### 一、引言 LMS(Least Mean Squre,最小均方)算法作为一种广泛应用于自适应滤波领域的核心算法,被普遍应用于信号处理和通信系统中。该算法的核心目标是通过不断调整滤波器的权重系数...

    遗传算法原理及应用 周明 孙树栋 编著

    由周明和孙树栋编著的《遗传算法原理及应用》是一本系统介绍遗传算法基本概念、原理、实现技术、应用以及数学理论的专著。 书籍内容涵盖了遗传算法的基本理论和应用实例,其中绪论部分简要介绍了遗传算法的生物学...

    ADMM算法原理及实例讲解PPT教学课件.pptx

    ADMM算法原理及实例讲解 ADMM算法原理: 1. Alternating Direction Method of Multipliers (ADMM) 交替方向乘子法:一种用于解决大规模分布式凸优化问题的算法,于1970年代设计。 2. 凸优化:目标函数和约束均为凸...

    朴素贝叶斯分类算法原理与Python实现与使用方法案例

    本文实例讲述了朴素贝叶斯分类算法原理与Python实现与使用方法。分享给大家供大家参考,具体如下: 朴素贝叶斯分类算法 1、朴素贝叶斯分类算法原理 1.1、概述 贝叶斯分类算法是一大类分类算法的总称 贝叶斯分类算法...

    深度学习CNN算法原理 深度学习原理.pdf

    "深度学习CNN算法原理" 深度学习CNN算法原理是神经网络中的一种前馈神经网络,通常包含数据输入层、卷积计算层、ReLU激活层、池化层、全连接层(INPUT-CONV-RELU-POOL-FC)。卷积神经网络(CNN)是一种前馈神经网络...

    实验四 链路状态路由算法原理实验报告.doc

    【实验报告】——链路状态路由算法原理 链路状态路由算法是计算机网络中的一种核心路由选择机制,尤其在大型网络如OSPF(Open Shortest Path First)和ISIS(Intermediate System to Intermediate System)协议中...

    算法原理与编程实践算法原理与编程实践

    算法原理与编程实践算法原理与编程实践算法原理与编程实践

    AES密码算法算法原理与实现

    AES密码算法原理与实现,帮助新手应用AES加密原理,AES密码算法算法原理与实现AES密码算法算法原理与实现

    CRC算法原理及C语言实现.pdf

    CRC算法原理及C语言实现:CRC计算与普通的除法计算有所不同。普通的除法计算是借位相减的,而CRC计算则是异或运算。任何一个除法运算都需要选取一个除数,在CRC运算中我们称之为poly,而宽度W就是poly最高位的位置。...

    FASTICA算法原理

    FASTICA算法原理 FASTICA算法是独立分量分析(ICA)的一种常用算法,它基于负熵最大化的原理,旨在将观测信号分离成独立的源信号。 FASTICA算法的主要步骤包括数据预处理、白化处理、FastICA算法和独立分量提取。 ...

    基于遗传算法原理系统代码.zip

    遗传算法原理基于遗传算法原理系统代码.zip基于遗传算法原理系统代码.zip基于遗传算法原理系统代码.zip基于遗传算法原理系统代码.zip基于遗传算法原理系统代码.zip基于遗传算法原理系统代码.zip基于遗传算法原理系统...

    遗传算法原理与应用

    该资料详细介绍了遗传算法的理论原理,可以很好帮助理解遗传算法原理

    【老生谈算法】Harris角点检测算法原理及其MATLAB编程实现.doc

    【老生谈算法】Harris角点检测算法原理及其MATLAB编程实现.doc

    【老生谈算法】AP近邻传播聚类算法原理及Matlab实现.docx

    【老生谈算法】AP近邻传播聚类算法原理及Matlab实现.docx

    遗传算法原理及应用

    经典书籍遗传算法原理及应用,内容包括遗传算法的原理及应用

Global site tag (gtag.js) - Google Analytics