关于PKCS5Padding与PKCS7Padding的区别

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html
内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为“中国PE第一股”,市值超1000亿元。 

--------------------------------------------------------

原文地址: http://www.cnblogs.com/midea0978/articles/1437257.html

工作中,我们常常会遇到跨语言平台的加密解密算法的交互使用,特别是一些标准的加解密算法,都设计到数据块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基本上也是可以通用的。

通过研读参考资料下面的参考资料可以发现两者定义的区别:

[DefPKCS #7: Cryptographic Message Syntax Standard,
An RSA Laboratories Technical Note, Version 1.5. Revised November 1, 1993. http://www.cnblogs.com/midea0978/admin/ftp://ftp.rsa.com/pub/pkcs/ascii/pkcs-7.asc

[InfPKCS #5: Password-Based Encryption Standard,
An RSA Laboratories Technical Note, Version 1.5. Revised November 1, 1993. http://www.cnblogs.com/midea0978/admin/ftp://ftp.rsa.com/pub/pkcs/ascii/pkcs-5.asc
在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就不能解密了。

JAVA Code示例

Code

C# Code示例

Code

 

参考http://www.users.zetnet.co.uk/hopwood/crypto/scan/cs.html#pad_PKCSPadding

时间: 2024-09-19 09:01:05

关于PKCS5Padding与PKCS7Padding的区别的相关文章

mfc-LBN_SELCHANGE和LBN_DBLCLK有什么区别?

问题描述 LBN_SELCHANGE和LBN_DBLCLK有什么区别? LBN_SELCHANGE和LBN_DBLCLK有什么区别呢,我是新手,请说的详细些. 解决方案 一个在选择更改的时候触发,一个在双击的时候触发 解决方案二: msdn文档中都有,详细地自己看,或者google下

固态硬盘做系统盘和做缓存盘有什么区别

  固态硬盘做系统盘和做缓存盘有什么区别          用固态硬盘直接做缓存盘不同于直接用固态硬盘做系统盘直接在固态硬盘上读取数据,固态硬盘做缓存盘的时候是根据用户经常访问的数据,将这一部分数据保存到固态硬盘上方便下次读取的时候快速读取而已,其作用类似硬盘的内存,只不过这块内存的数据并不会伴随关机而自动清空.         推荐阅读:让SSD速度飞起来 固态硬盘优化技巧大全  因此综上所述,最立竿见影的方法就是直接将固态硬盘做系统盘,并用剩余的容量安装游戏或者其他常用软件,这样收益是最明显

[数据结构] 数组与链表的优缺点和区别

概述 数组 是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中.同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素.如果应用需要快速访问数据,很少插入和删除元素,就应该用数组. 链表 中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储 数据元素 的 数据域,另一个是存储下一个结点地址的

关于支付系统中的同步通知和异步通知电商的区别,为什么需要通知

问题描述 关于支付系统中的同步通知和异步通知电商的区别,为什么需要通知 在电商对应的支付系统中当支付完成之后需要做相关的同步通知和异步通知操作,请大神解释一下什么是同步通知和异步通知,为什么需要同步通知和异步通知. 解决方案 同步用于即时通知支付完成 异步用于防止信息漏发漏收 解决方案二: 可以这样理解, 1.用户(买家)支付完成后,电商平台需要实时的给用户一个通知,如支付已经处理等待订单确认. 2.电商平台,这块就需要考虑系统技术方面的各个环节,考虑应对复杂多变的并发用户量.业务.流量.网络环

nil、Nil、NULL和NSNull区别

前言 记得曾经有不少朋友问过笔者,在Objective-C中nil和Nil以及NULL的区别.最重要的是,在面试中还有不少朋友常会被问到.记得当年刚找工作的时候,笔者就被面试官问到过,现在笔者在这里统一详细说明. NULL 对于学习过C/C++语言的朋友,对NULL一定很熟悉吧?这就是在C/C++中的空指针. 在C语言中,NULL是无类型的,只是一个宏,它代表空.我们不研究C++中的NULL,因为在C++11以后又有了新的定义,我们不深究. 这就是C语言中所谓的NULL(C++的定义比较复杂,这

xcode-Xcode和ObjectiveC有什么区别

问题描述 Xcode和ObjectiveC有什么区别 现在开发一个iosApp,用Xcode(Swift)好还是ObjectiveC好? 有什么优缺点? 解决方案 projectiveC还是Objective-C Objective-C是语言,XCode是苹果官方的编写工具,XCode里用的是Objective-C或swift 解决方案二: Xcode是编译器 Objective-C和Swift是语言

MathType正式版与精简版有什么区别

MathType正式版与精简版有什么区别   MathType 6.9启动界面示例 MathType正式版的功能与特点: 1.Office办公软件兼容使用,MathType 6.9版本在Windows 系统中完全兼容Office 2013和Office 365.Office 2010.2007.2003和XP等. 2.MathType在Word 2013.2010.2007.Word 2003和XP 2002中的菜单和工具栏. 插入公式:不管是否有公式编号,Word功能区的MathType选项卡

MathType几种省略号的区别

  MathType几种省略号的区别            1.水平省略号 水平省略号是使用最多的一个省略号,在分析多个公式与变量时使用,这个模板直接在MathType的"空格和椭圆"--"水平省略号"就可以编辑出来了.一般的公式中使用的都是这个省略号. 用MathType编辑水平省略号 2.数轴省略号 顾名思义,这个省略号在画数轴时使用,因为对数轴的刻度进行标示是时,如果范围比较大,是不可能把所有的刻度都标示出来的,只需要标示出开关几个与最后结尾几个就可以了,中间

SEO优化人员是否知道标签与栏目、专题、关键词之间的区别

摘要: 相比网站的关键词我们对文章标签的关注实在太少,不知道作为SEO优化人员的你是否知道标签与栏目.专题.关键词之间的区别?也许你会认为这是无关紧要的事情,如果是这样的话只能 相比网站的关键词我们对文章标签的关注实在太少,不知道作为SEO优化人员的你是否知道标签与栏目.专题.关键词之间的区别?也许你会认为这是无关紧要的事情,如果是这样的话只能说你是一个不善于思考问题的人,永远成不一个真正的SEO,因为SEO本身就是一个需要注重细节的职业.笔者发现现在几乎所有的文章都支持添加标签的功能,为什么一