关于PKCS5Padding与PKCS7Padding的区别

跨语言平台的加密解密算法的交互使用,特别是一些标准的加解密算法,都设计到数据块Block与填充算法的
问题,例如C#与JAVA中的常见的填充算法如下:

.Net中的填充算法:

成员名称 说明
ANSIX923 ANSIX923 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节均填充数字零。

下面的示例演示此模式的工作原理。假定块长度为

8,数据长度为 9,则填充用八位字节数等于 7,数据等于 FF FF FF FF FF FF FF FF FF:

数据: FF FF FF FF FF FF FF FF FF

X923 填充: FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07

ISO10126 ISO10126 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据。

下面的示例演示此模式的工作原理。假定块长度为 8,数据长度为 9,则填充用八位字节数等于 7,数据等于 FF FF FF FF FF FF FF FF FF:

数据: FF FF FF FF FF FF FF FF FF

ISO10126 填充: FF FF FF FF FF FF FF FF FF 7D 2A 75 EF F8 EF 07

None 不填充。 
PKCS7 PKCS #7 填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。

下面的示例演示这些模式的工作原理。假定块长度为 8,数据长度为 9,则填充用八位字节数等于 7,数据等于 FF FF FF FF FF FF FF FF FF:

数据: FF FF FF FF FF FF FF FF FF

PKCS7 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

Zeros 填充字符串由设置为零的字节组成。 

JAVA中支持的填充算法(Cipher)有

Alg. Name Description
NoPadding No padding.
ISO10126Padding This padding for block ciphers is described in 5.2 Block Encryption Algorithms in the W3C's "XML Encryption Syntax and Processing" document.
OAEPPadding, OAEPWith<digest>And<mgf>Padding Optimal Asymmetric Encryption Padding scheme defined in PKCS1, where <digest> should be replaced by the message digest and <mgf> by the mask generation function. Examples: OAEPWithMD5AndMGF1Padding and OAEPWithSHA-512AndMGF1Padding.

If OAEPPadding is used, Cipher objects are initialized with a javax.crypto.spec.OAEPParameterSpec object to suppply values needed for OAEPPadding.

PKCS1Padding The padding scheme described in PKCS1, used with the RSA algorithm.
PKCS5Padding The padding scheme described in RSA Laboratories, "PKCS5: Password-Based Encryption Standard," version 1.5, November 1993.
SSL3Padding The padding scheme defined in the SSL Protocol Version 3.0, November 18, 1996, section 5.2.3.2 (CBC block cipher):

    block-ciphered struct {opaque content[SSLCompressed.length];opaque MAC[CipherSpec.hash_size];uint8 padding[GenericBlockCipher.padding_length];uint8 padding_length;} GenericBlockCipher;

The size of an instance of a GenericBlockCipher must be a multiple of the block cipher's block length.

The padding length, which is always present, contributes to the padding, which implies that if:

    sizeof(content) + sizeof(MAC) % block_length = 0, 

padding has to be (block_length - 1) bytes long, because of the existence of padding_length.

This make the padding scheme similar (but not quite) to PKCS5Padding, where the padding length is encoded in the padding (and ranges from 1 to block_length). With the SSL scheme, the sizeof(padding) is encoded in the always present padding_length and therefore ranges from 0 to block_length-1.

简单对比之下发现,通用的有NoneISO10126两种填充法,实际上PKCS5Padding与PKCS7Padding基本上也是可以通用的。

在PKCS5Padding中,明确定义Block的大小是8位,而在PKCS7Padding定义中,对于块的大小是不确定的,可以在1-255之间(块长度超出255的尚待研究),填充值的算法都是一样的:

value=k - (l mod k)  ,K=块大小,l=数据长度,如果l=8, 则需要填充额外的8个byte的8

在.net中,例如TripleDESCryptoServiceProvider ,默认BlockSize=64bits=8bytes,所以在这种情况下在PKCS5Padding=PKCS7Padding。

如果在C#中自己定义了一个不是64bits的加密块大小,同时使用PKCS7Padding,那么在java中使用JDK标准的PKCS5Padding就不能解密了。

TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Mode=CipherMode.ECB;
des.Padding=PaddingMode.PKCS7;
byte[] buffer =Encoding.Default.GetBytes("明文");
MemoryStream stream = new MemoryStream();
byte[] key=Convert.FromBase64String("AQjP4U1aCnnybWsmHUQ7BVIxHyrnQ2AP");
CryptoStream encStream = new CryptoStream(stream, des.CreateEncryptor(key, null), CryptoStreamMode.Write);
encStream.Write(buffer, 0, buffer.Length);
encStream.FlushFinalBlock();
byte[] res=stream.ToArray();
Console.WriteLine("result:"+Convert.ToBase64String(res));

C#跨语言,为保持于java等兼容,BlockSize默认为64,但也可以手动设置如下:
单位:BlockSize 单位bits

DESCryptoServiceProvider des = new DESCryptoServiceProvider()
des.BlockSize = 64;
des.Padding = PaddingMode.PKCS7;
des.Mode = CipherMode.ECB;

PKCS5Padding与PKCS7Padding的区别相关推荐

  1. java pkcs7 和 pkcs5_PKCS5Padding与PKCS7Padding的区别

    工作中,我们常常会遇到跨语言平台的加密解密算法的交互使用,特别是一些标准的加解密算法,都设计到数据块Block与填充算法的 问题,例如C#与JAVA中的常见的填充算法如下: .Net中的填充算法: 成 ...

  2. python的aes的ecb加密_AES ECB PKCS5/PKCS7 加密 python实现 支持中文

    ecb模式介绍 电码本模式(electronic codebook book (ecb) 这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密. pkcs5padding和pkcs7pad ...

  3. 记半次元App数据解密记录

    最近发现一个有意思的应用,半次元,这个应用中有很多Cosplay美图,很感兴趣便想试试能否通过抓包分析获取相应的接口,没想到自己实际上已经跳到了一个大大的深坑之中,一起来看下吧. 万里长征第一步:抓包 ...

  4. 密码学之DES/AES算法

    本文示例代码详见:https://github.com/52fhy/cryp... DES DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1 ...

  5. php 如何使用openssl_encrypt进行aes非对称加密解密

    一.DES介绍 DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.密钥长度是64位(bit),超过位数密钥被忽略. ...

  6. python aes padding_python笔记43-加解密AES/CBC/pkcs7padding

    前言 有些公司对接口的安全要求比较高,传参数的时候,不会明文的传输,先对接口加密,返回的数据也加密返回. 目前比较常见的加密方式是AES/CBC/pkcs7padding. AES五种加密模式 在AE ...

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

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

  8. 携程供应商接口数据解密AES/CBC/PKCS5Padding

    2019独角兽企业重金招聘Python工程师标准>>> function aes128_cbc_encrypt($key, $data, $iv) {if(16 !== strlen ...

  9. Java笔记-AES加解密(PKCS7padding可用)

    如下代码: package cn.it1995.tool;import org.apache.tomcat.util.codec.binary.Base64; import sun.misc.BASE ...

最新文章

  1. 刷算法的时候有没有必要自写测试用例?
  2. C++ leetCode 1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个
  3. mysql in 截断_MySQL十进制字段’数据在第1行的第x列被截断’问题
  4. 王思聪名下企业被拍卖1100万债权,此前还债20亿 网友:拍下等于“接盘侠”?...
  5. python学习笔记16--javascript总结
  6. mysql查询表字段的个数
  7. Linux 审计日志记录,linux日志服务器审计客户端history记录
  8. 有关python毕设题目_python毕设题目
  9. 超六类网线与7类网线的区别,你知道吗?
  10. ​汽车域控制器架构和OTA的心脏:网关的四大豪门(下)
  11. 横河变送器EJA110E-JMS4J-919EA
  12. MySQL数据库常用查询(带练习示例)
  13. linux怎么下载安装软件
  14. 【经济学_04】晨读:保险的实质 特效药 医疗膨胀 保险的发明
  15. PostMan管理EZ
  16. Flink process 和 apply 简单案例
  17. b 站神器更新,还出了新玩意
  18. 时间戳与时间转换、js时间戳判定是 今天、昨天还是更前的日子
  19. 微软商店Microsoft Store下载安装找这个
  20. 『深圳』在深圳,做个没故事的人

热门文章

  1. 在让元宇宙“圆梦”这条路上,交互技术卡在哪里了?
  2. 与年轻人的“要疯”五年,安踏如何保持新鲜感与吸引力?
  3. linux系统用xset命令,专 linux命令之set x详解
  4. 支持的sql语法_PostgreSQL 12 新特性解读之一|支持 SQL/JSON path
  5. java小数转换成百分数_在java中如何把小数转化成百分数
  6. 华为荣耀手机指令代码大全_双十二,华为/荣耀手机推荐选购指南,全系列横评推荐,那一款华为/荣耀手机最值得够买...
  7. linux(Ubuntu)查看环境变量指向的路径
  8. python详解enumerate()方法;
  9. Python基础教程:赋值语句和布尔值
  10. python约束 与MD5加密写法