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();

    }
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值