java实现js的btoa加密算法
首先,讲一下btoa算法的原理:
1.bota算法是将字符串3个为一组进行分组
2.然后将字符串转换为其对应的ASCII码,将ASCII码再转换为二进制
ASCII码参考表:
https://baike.baidu.com/item/ASCII/309296?fr=aladdin&fromid=19660475&fromtitle=ascii%E7%A0%81%E8%A1%A8
3.再将二进制数从第一个开始,六个为一组进行分组,比如:CAT,转换为ASCII,是3*8,然后6位为一组划分后为4*6
4.分组完成后,左边都添加两个0,补齐到8位
5.然后将每一个转换为10进制,对照bash64找其对应的字符,连接起来就是加密后的字符串
注:1. 要求被编码字符是8bit的,所以须在ASCII编码范围内,\u0000-\u00ff,中文就不行。
2. 如果被编码字符长度不是3的倍数的时候,则都用0代替,对应的输出字符为=
原理讲完了,现在来看一下怎么用java实现:
js实现方式参考:
java实现方式如下:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class BtoaEncode { //btoa加密方法 public static String base64hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; public static void main(String args[]){ String rs = botaEncodePassword("TOM"); System.out.println(rs); } /* str:要匹配的数据 reg:正则匹配的规则 */ public static boolean isMatcher(String str,String reg){ //编译成一个正则表达式模式 Pattern pattern = Pattern.compile(reg); //匹配模式 Matcher matcher = pattern.matcher(str); if(matcher.matches()){ return true; } return false; } public static String botaEncodePassword(String pwd){ if(pwd==null||isMatcher(pwd,"([^\\u0000-\\u00ff])")){ throw new Error("INVALID_CHARACTER_ERR"); } int i = 0,prev=0,ascii,mod=0; StringBuilder result = new StringBuilder(); while (i<pwd.length()){ ascii = pwd.charAt(i); mod = i%3; switch (mod){ //第一个6位只需要让8位二进制右移两位 case 0: result.append(base64hash.charAt(ascii>>2)); break; //第二个6位=第一个8位的后两位+第二个八位的前四位 case 1: result.append(base64hash.charAt((prev&3)<<4|(ascii>>4))); break; //第三个6位=第二个8位的后四位+第三个8位的前两位 //第四个6位 = 第三个8位的后6位 case 2: result.append(base64hash.charAt((prev & 0x0f)<<2|(ascii>>6))); result.append(base64hash.charAt(ascii&0x3f)); break; } prev = ascii; i++; } //循环结束后看mod, 为0 证明需补3个6位,第一个为最后一个8位的最后两位后面补4个0。另外两个6位对应的是异常的“=”; // mod为1,证明还需补两个6位,一个是最后一个8位的后4位补两个0,另一个对应异常的“=” if(mod == 0){ result.append(base64hash.charAt((prev&3)<<4)); result.append("=="); }else if(mod == 1){ result.append(base64hash.charAt((prev&0x0f)<<2)); result.append("="); } return result.toString(); } }