如下的java代码,手动对block进行填充后,使其为16的整数倍后,加密的时候竟然强行再填充了16位,我在尝试用golang实现这段加密时,反复修改了很久,发现golang版的总是比java加密出来并base64的结果少了20位,于是把各个步骤中间结果打出来,发现并没有什么不同,然后尝试在golang后面强行追加了16个填充,那么填充什么呢?没错,我就是从0x0到0x10一个一个试出来的,最后发现当填充16个0x10时,golang跟java的加密结果就完全一样了,其实是按照pkcs5的填充规则的,例如需要填充n位,那么填充的值就是n,下面贴出golang跟java的两个代码:

PS: iv和key都是一模一样的。得到一个教训,当golang跟java在两种相同的模式下面如果加密出来的密文不同的时候就去尝试修改填充的方法吧,多尝试几次总是可以的。

java:

public static String aesEncrypt2(String appsecret, String data) throws Exception
{
//设置加密密钥
String key = appsecret.substring(16);
System.out.println(key);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
//初始化向量
System.out.println("md5: " + DigestUtils.md5Hex(appsecret).substring(0, 16));
String iv = DigestUtils.md5Hex(appsecret).substring(0, 16);
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
//设置加密模式
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//填充算法
int blockSize = cipher.getBlockSize();
byte[] dataBytes = data.getBytes();
int plaintextLength = dataBytes.length;
if (plaintextLength % blockSize != 0) {
plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
}
byte[] plaintext = new byte[plaintextLength];
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
System.out.println("填充后长度=" + plaintext.length);
for(int i = 0;i < plaintext.length; i++)
System.out.print(plaintext[i] + " ");
//加密
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(plaintext);
System.out.println("");
for(int i = 0;i < encrypted.length;i++)
System.out.print(encrypted[i] + " ");
System.out.println("");
return Base64.encodeBase64String(encrypted);
}

golang:

func GetMD5(cipherText string) string {
md5Ctx := md5.New()
md5Ctx.Write([]byte(cipherText))
cipherStr := md5Ctx.Sum(nil)
return hex.EncodeToString(cipherStr)
} func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
// padtext := bytes.Repeat([]byte{byte(padding)}, padding)
for i := ; i < padding; i++ {
ciphertext = append(ciphertext, 0x0)
}
for i := ; i < ; i++ {
ciphertext = append(ciphertext, 0x10)
}
fmt.Println(ciphertext)
fmt.Printf("blocksieze[%d]\n", len(ciphertext))
// return append(ciphertext, padtext...)
return ciphertext
} func AesEncrypt(secret, data string) string {
if len(secret) < {
log.Errorf("AesEncrypt secret[%s] length less 16")
return ""
}
fmt.Println(secret[:])
key := []byte(secret[:])
iv := []byte(GetMD5(secret)[:])
fmt.Println("md5: " + GetMD5(secret)[:])
block, err := aes.NewCipher(key)
if err != nil {
log.Errorf("key error[%v]", err)
return ""
}
ecb := cipher.NewCBCEncrypter(block, iv)
content := PKCS5Padding([]byte(data), block.BlockSize())
crypted := make([]byte, len(content))
ecb.CryptBlocks(crypted, content)
fmt.Println(crypted)
return base64.StdEncoding.EncodeToString(crypted)
}

java aes CBC的填充方式发现的更多相关文章

  1. AES/CBC/PKCS7Padding加密方式

    在网上找了大半天资料,终于找到一个可以用的 public static class AES { // 算法名称 final static String KEY_ALGORITHM = "AE ...

  2. JAVA AES CBC 加密 解密

    AES 256 , KEY 的长度为 32字节(32*8=256bit). AES 128 , KEY 的长度为 16字节(16*8=128bit) CBC 模式需要IV, IV的值是固定写死,还是当 ...

  3. JAVA AES CBC PKCS5Padding加解密

    package com.hzxc.groupactivity.util; /** * Created by hdwang on 2019/1/17. */ import org.slf4j.Logge ...

  4. java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法

    在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里 ...

  5. Java 使用AES/CBC/PKCS7Padding 加解密字符串

    介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别要实现在java端用PKCS7Padding填充, ...

  6. java 小程序开发PKCS7Padding 解密方法实现,以及错误Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法

    近日在对接小程序API,其中wx.getUserInfo api返回的数据encryptedData 的解密算法要求为: AES-128-CBC,数据采用PKCS#7填充. 经过一番查询,得到java ...

  7. linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法

    用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是: <dependency> ...

  8. java微信小程序解密AES/CBC/PKCS7Padding

    摘要:微信小程序解密建议使用1.6及以上的环境使用maven下载jar包org.bouncycastlebcprov-jdk15on1.55加密类代码importorg.bouncycastle.jc ...

  9. C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式

    ============================================== des   cbc  加密 zeropadding填充方式 ======================= ...

随机推荐

  1. Neuroph开发过程

    文章提纲 安装与配置 开发小结 建立项目 配置项目 理解感知机的代码 安装与配置 JDK的安装:建议JRE 1.8以上: Neuroph安装:建议2.94的版本.下载地址 neuroph-core-2 ...

  2. nginx 配置 rewrite 跳转

    在访问 test.com 网站时,会自动跳转到 www.test.com ,这是因为该网站做了 URL rewrite 重定向,一般网页重定向跳转分为两种,301 和 302 :301,302 都是H ...

  3. Linux新手随手笔记1.6

    RAID磁盘冗余阵列 1.I/O  速度 2.数据安全性  RAID 0 负载均衡.速度乘以二,但是数据安全性不行,任何一块盘损坏数据都会丢失. RAID 1 安全性性提升2倍,任何一个损坏另一个都有 ...

  4. Scala--控制结构和函数

    一.条件表达式 val s = if(x > 1) 1 else -1 s 可以是 val var s = 0 if(x > 1) s = 1 else s = -1 s 必须是 var ...

  5. 随心测试_数据库_001<论数据的重要性>

    测试工作中,数据的重要性 软测工程师:作为综合运用多学科知识,保障软件质量的重要岗位.需要我们学以致用,在工作中不断学习提升.以下:软测人员必备_数据库核心技能学习点,供大家学习参考. Q1:什么是: ...

  6. Python--day13(函数嵌套定义,global、nonlocal、闭包函数、装饰器)

    今日主要内容 1.  函数的嵌套定义 2.  global.nonlocal关键字 3.  闭包及闭包的应用场景 4. 装饰器 1.  函数的嵌套定义 概念:在一个函数的内部定义另一个函数 为什么要有 ...

  7. 云计算openstack介绍

    一.云计算的前世今生 所有的新事物都不是突然冒出来的,都有前世和今生.云计算也是IT技术不断发展的产物. 要理解云计算,需要对IT系统架构的发展过程有所认识. 请看下 IT系统架构的发展到目前为止大致 ...

  8. Flutter绘制波浪

    以上动画是仿照 里面的物理动画还未仿写 代码见  https://github.com/dnoyeb/syk_flutter

  9. Async/Await 学习与示例

    参考:Async/await学习 es 7 提供了对 promise 对象的更好的操作,省去了很多丧心病狂的链式异步请求,promise 是回调地狱的福音,而 Async/Await 则是 promi ...

  10. 加载hive-jdbc driver时报错:java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration

    这是因为缺少一个hadoop-common包,引入即可: <dependency> <groupId>org.apache.hadoop</groupId> < ...