1.背景
LoRaWAN通信过程中,网关传至服务器端Json数据中data字段数据为经过编码和加密的数据(应用数据)。编码方式为Base64,加密方式为AES_128,具体加密方式可阅览LoRaWAN协议。data数据如下
"data":"VEVTVF9QQUNLRVRfMTIzNA=="
题外话 Base64 是一种加密方式吗???那是在很久很久以前我听过Base64加密,Base64编码,真是傻傻分不清楚,那是几脸懵批呀。后来得一高僧指点(没有头发,应该是剃度了),有钥匙才能开的那叫加密,没钥匙就能开的那是编码。我想在了解了Base64原理之后每个人心里都会有个结论。
2.原理
首先请大家看张表:
我当时就在想为啥是Base64而不是Base120。看到这个表我的心静了下来。
Base64编码是基于上表64个字母进行编码的(还有个=,严格来说是Base65)。Base64要求把 每三个8Bit的字节转换为四个6Bit的字节 (3x8 = 4x6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
这个64个字符可以通过0~63来表示,总共会占6b。
VEVTVF9QQUNLRVRfMTIzNA== 我们看下这串如何操作
- 在编码表中寻找对应字符数值。比如V 21,E 4,T 19
- 转二进制
高两位肯定是0啦 - 去掉高位两0,重排(这个才是Base64的核心)
下边那栏就是你想要的数据。
完美吧!
不好意思,还有个 = 没唠清楚,等号只会出现在末尾处,是补零的产物,请在上述第二步骤中以0000 0000替代。
3.代码咋整
在Java实现有:commons-codec.jar 和 sun.misc.BASE64Encoder
public void decoder(){
String base64String="VEVTVF9QQUNLRVRfMTIzNA==";
BASE64Decoder base64Decoder = new BASE64Decoder();
try {
base64Decoder.decodeBuffer(base64String);
} catch (IOException e) {
e.printStackTrace();
}
byte[] result = Base64.encodeBase64(base64String.getBytes());
}
注:Base64 是可逆的,咋整过来就可以咋整过去。在编解码的过程中注意编码集问题。
撒扬娜拉