在客户端和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失败相关推荐

  1. Java常见的加密解密

    Java常见的加密解密 不可逆加密 介绍 应用场景 一致性验证 MD5 可以为文件传输场景中,提供文件的一致性验证. 例如,文件服务器预先提供一个 MD5 校验值,用户下载完文件以后,用 MD5 算法 ...

  2. 条理清晰的入门:使用Java实现RSA加密解密

    条理清晰的入门:使用Java实现RSA加密解密 什么是RSA 使用Java 需要导入的头文件 生成公钥.私钥 进行加密解密 密钥的存储 密文的存储.读取 什么是RSA 翻一下以前的密码学笔记,找到了! ...

  3. php与java的des加密解密

    与第三方接口对接des加密.解密,第三方提供java的des加密解密demo,特记录PHP与java加密解密. import javax.crypto.*; import javax.crypto.s ...

  4. python 加密解密 rc4_python实现rc4加密解密,base64输出

    这里将告诉您python实现rc4加密解密,base64输出,具体实现方法:from Crypto.Cipher import ARC4 as rc4cipher import base64 def ...

  5. java 文件进行加密解密,java 对文件加密解密,该如何解决

    java 对文件加密解密 本帖最后由 Hong_1993 于 2014-09-03 10:51:35 编辑 我现在想做一个基于spring mvc 模式的 实现对  文件或目录文件   的加解密(de ...

  6. java 3des_如何用Java进行3DES加密解密 java实现3des加密解密教程

    3des,全称为3DESede或TripleDES,中文解释为是三重数据加密,用户可以通过通过对DES算法进行改进,针对每个数据块进行三次DES加密,下面小编为你带来java实现3des加密解密教程! ...

  7. Java实现DES加密解密

    DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥. 加密原理: DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位, ...

  8. Java使用AES加密解密

    AES加密机制: 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准. 这个标准用来替代原先的 ...

  9. Java使用RSA加密解密签名及校验

    RSA加密解密类: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; i ...

  10. Android平台和java平台 DES加密解密互通程序及其不能互通的原因

    为什么80%的码农都做不了架构师?>>>    网上的demo一搜一大堆,但是,基本上都是一知半解(包括我).为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DE ...

最新文章

  1. 红帽linux终端快捷键,二、回忆redhat各种基本命令
  2. 小科知道20211202
  3. 前端学习(1971)vue之电商管理系统电商系统之完成参数的添加操作
  4. 自动化要不要学python-老男孩linux自动化运维|做人工智能为什么要学Python呢?
  5. 自考--运筹学--计算题总结
  6. 根据两个日期字符串,格式为(YYYY-MM-DD),获取年龄,保留两位小数但不四舍五入...
  7. OpenCV积分图函数:integral ()介绍
  8. 一题多解 —— linux 日志文件(log)reload 重新载入
  9. python实现嵌套列表按指定位置元素排序、按子列表长度、子列表之和、绝对值和、最大/最小值排序
  10. 多变量遗传算法python代码_遗传算法介绍并附上Python代码
  11. 网络工程师十个常见面试问题
  12. Error querying database. Cause: java.sql.SQLException: ORA-01008: 并非所有变量都已绑定
  13. qualcomm QSD MSM APQ区别
  14. proteus编程、仿真AVR单片机
  15. Linux下根据关键字搜索最后一条日志
  16. 为什么amd显卡便宜却买的人少_为什么不推荐人选择AMD?
  17. HTML+CSS静态页面游戏网站设计——腾讯游戏(页)学生HTML个人网页作业作品下载 个人网页设计制作 大学生个人网站作业模板 简单个人网页制作
  18. MySQL 表查询关键字
  19. 俯瞰·明统系列·落霞与孤鹜齐飞、南征与北伐并举
  20. 公式编辑神器-MathType

热门文章

  1. GDOI2021赛后总结高一赛季总结
  2. POST请求和PUT请求的区别
  3. Arcgis影像镶嵌数据集色彩平衡遇到的问题
  4. HUST-多媒体基础PPT目录
  5. 记录一次租房经历一(1)
  6. 计算机视觉学习路线—计算机视觉入门必读的20本书
  7. 软件测试学习笔记与思考(2)---软件测试策略
  8. 马云:房价熄火,2020年或再现一个“暴利”行业,将造就一波新的财富传奇
  9. 扩展easyUI样式,全新的easyUI体验样式
  10. Mac 卸载重装 brew