Java和go加密,解密,Base64失败
在客户端和go后台对接口的时候,加解密出现了问题记录。
问题主要出现在base64上,刚开始Android使用
import android.util.Base64;public class AesUtil {public static String encryptEcb(String content, String key) {if (TextUtils.isEmpty(content) || TextUtils.isEmpty(key)) return "";try {byte[] raw = key.getBytes("UTF-8");SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");Cipher cipher = Cipher.getInstance(format);
// IvParameterSpec iv = new IvParameterSpec(getIv(key));// go后台没有使用向量cipher.init(Cipher.ENCRYPT_MODE, skeySpec);byte[] encrypted = cipher.doFinal(content.getBytes("UTF-8"));return Base64.encodeToString(encrypted, Base64.URL_SAFE);} catch (Exception e) {e.printStackTrace();return "";}}
}
go的解密如下:
这里的URLEncoding对应Java的Base64.URL_SAFE,我们知道加密结果中含有3种特殊URL字符/,+,=(只有使用Base64.NO_PADDING模式加密的才没有=),所以这里使用URL_SAFE模式做替换,它是用-替换+,_替换/,=省略,替换好还原,但是=号不只一个找回就比较难了,上面第二张图就是go用来找回我们舍弃掉的=;其中的来龙去脉介绍完了,出问题的地方是Java的Base64.encodeToString出来的结果,go拿到之后decode失败,重点来了,为什么呢?
原因:Java的Base64的结果有一个特殊操作其他语言没有,下面这是Java的Base64结果
ZSDSpCpVGsZf6OAMDaIsyC1Ni2yOnYN1GT9MBTowuGcrYnrL0378CiJWR08lCSvSjnVqF_Bdg7xmZHsP1QGRBKZUBoJJmepryh3jjNhlX9dLRweWIDqjvgZizmucw7NS3MvznJnaAdUkbB8rOcJWB3dbNWqCTkYQB1AzUyzYky4oJYUJEtBx-RUhXCfYiMqGJ6_V53Xlbky8onJIkHgzmVopa7luko9ihLJYLPnOL65SrotvSAHHi_yRIjj2TprZtLH3X_mPjS9GLDoX6dAR-4vfuMwdeSCSpwKP8sq2XxOXXKVbr6xmIeVNY-miqBFEDSktj15KxnKADTWQDLJm6NW7tiwq6d0UkLIl0c9u7ViIxBbF3jCfWFulsCG57kvyaE1jDHUjN-R7U0idW5WYLlyBPUvAoQnoXYZZPK2a9jgVoGB-OJpF99_HLbFPoJjN5nJMvPNqKCPXiqpkEgF1objdjJjq0JZNw5LhuxZoDPUrmhMlFYrhueyrIjh4rugDlnqp2uZig-ksQocKCQjgpGOZ6B_lWHWE5U_FZrhFLYE5hjBNcBiYn1qHV64Z2zkjKm6s5V7wBTXVZQKX6ahvzS4wJzzoarNFaStoxG4KM7q1Luv2tQU5ZjYvxYnE3ijJQqOl2UiYd2pv9fPF0eJche0R77tyViVBGrp7Fj79RBrPeTsZVnEQ14JojLSTHMiGkk88s8CiP1Mr0kKr6rtnXZsKgXc-8DlafrKfpU2aw1WfjlSFOrMkqF9Vvs1Y5I3kuIzFBlyXf-9Akku4bNS1raVboYl3W8AefPcW3IF8QlZ904NCGwOwtNfIty0W0vKm
它里面包含换行符,这个就是go使用decode失败的原因,所以我们在和这些语言调试加解密之类的时候可以给换行符去掉,测试发现trim()
不可以,使用replace("\n", "")
可以,这里自己写了一个Base64的工具类实现此功能:
import android.text.TextUtils;
import android.util.Base64;public class Base64UrlSafe {private static char[] base64EncodeChars = new char[]{'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', '-', '_'};private LzBase64() {}public static String base64Encode(String data) {if (TextUtils.isEmpty(data)) {return "";}byte[] dataBytes = data.getBytes();return encode(dataBytes);}public static String base64Decode(String data) {if (TextUtils.isEmpty(data)) {return "";}return new String(decode(data));}public static String encode(byte[] data) {StringBuffer sb = new StringBuffer();int len = data.length;int i = 0;int b1, b2, b3;while (i < len) {b1 = data[i++] & 0xff;if (i == len) {sb.append(base64EncodeChars[b1 >>> 2]);sb.append(base64EncodeChars[(b1 & 0x3) << 4]);sb.append(""); // "=="break;}b2 = data[i++] & 0xff;if (i == len) {sb.append(base64EncodeChars[b1 >>> 2]);sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);sb.append(""); // "="break;}b3 = data[i++] & 0xff;sb.append(base64EncodeChars[b1 >>> 2]);sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]);sb.append(base64EncodeChars[b3 & 0x3f]);}return sb.toString();}private static byte[] decode(String str) {return Base64.decode(str, Base64.URL_SAFE);}}
Java和go加密,解密,Base64失败相关推荐
- Java常见的加密解密
Java常见的加密解密 不可逆加密 介绍 应用场景 一致性验证 MD5 可以为文件传输场景中,提供文件的一致性验证. 例如,文件服务器预先提供一个 MD5 校验值,用户下载完文件以后,用 MD5 算法 ...
- 条理清晰的入门:使用Java实现RSA加密解密
条理清晰的入门:使用Java实现RSA加密解密 什么是RSA 使用Java 需要导入的头文件 生成公钥.私钥 进行加密解密 密钥的存储 密文的存储.读取 什么是RSA 翻一下以前的密码学笔记,找到了! ...
- php与java的des加密解密
与第三方接口对接des加密.解密,第三方提供java的des加密解密demo,特记录PHP与java加密解密. import javax.crypto.*; import javax.crypto.s ...
- python 加密解密 rc4_python实现rc4加密解密,base64输出
这里将告诉您python实现rc4加密解密,base64输出,具体实现方法:from Crypto.Cipher import ARC4 as rc4cipher import base64 def ...
- java 文件进行加密解密,java 对文件加密解密,该如何解决
java 对文件加密解密 本帖最后由 Hong_1993 于 2014-09-03 10:51:35 编辑 我现在想做一个基于spring mvc 模式的 实现对 文件或目录文件 的加解密(de ...
- java 3des_如何用Java进行3DES加密解密 java实现3des加密解密教程
3des,全称为3DESede或TripleDES,中文解释为是三重数据加密,用户可以通过通过对DES算法进行改进,针对每个数据块进行三次DES加密,下面小编为你带来java实现3des加密解密教程! ...
- Java实现DES加密解密
DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥. 加密原理: DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位, ...
- Java使用AES加密解密
AES加密机制: 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准. 这个标准用来替代原先的 ...
- Java使用RSA加密解密签名及校验
RSA加密解密类: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; i ...
- Android平台和java平台 DES加密解密互通程序及其不能互通的原因
为什么80%的码农都做不了架构师?>>> 网上的demo一搜一大堆,但是,基本上都是一知半解(包括我).为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DE ...
最新文章
- 红帽linux终端快捷键,二、回忆redhat各种基本命令
- 小科知道20211202
- 前端学习(1971)vue之电商管理系统电商系统之完成参数的添加操作
- 自动化要不要学python-老男孩linux自动化运维|做人工智能为什么要学Python呢?
- 自考--运筹学--计算题总结
- 根据两个日期字符串,格式为(YYYY-MM-DD),获取年龄,保留两位小数但不四舍五入...
- OpenCV积分图函数:integral ()介绍
- 一题多解 —— linux 日志文件(log)reload 重新载入
- python实现嵌套列表按指定位置元素排序、按子列表长度、子列表之和、绝对值和、最大/最小值排序
- 多变量遗传算法python代码_遗传算法介绍并附上Python代码
- 网络工程师十个常见面试问题
- Error querying database. Cause: java.sql.SQLException: ORA-01008: 并非所有变量都已绑定
- qualcomm QSD MSM APQ区别
- proteus编程、仿真AVR单片机
- Linux下根据关键字搜索最后一条日志
- 为什么amd显卡便宜却买的人少_为什么不推荐人选择AMD?
- HTML+CSS静态页面游戏网站设计——腾讯游戏(页)学生HTML个人网页作业作品下载 个人网页设计制作 大学生个人网站作业模板 简单个人网页制作
- MySQL 表查询关键字
- 俯瞰·明统系列·落霞与孤鹜齐飞、南征与北伐并举
- 公式编辑神器-MathType