PKCS5Padding与PKCS7Padding的区别
来源:互联网 发布:2g3g4g网络的发展历史 编辑:程序博客网 时间:2024/05/16 15:34
转自 http://www.cnblogs.com/midea0978/articles/1437257.html
工作中,我们常常会遇到跨语言平台的加密解密算法的交互使用,特别是一些标准的加解密算法,都设计到数据块Block与填充算法的
问题,例如C#与JAVA中的常见的填充算法如下:
.Net中的填充算法:
下面的示例演示此模式的工作原理。假定块长度为
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
ISO10126ISO10126 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据。下面的示例演示此模式的工作原理。假定块长度为 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不填充。 PKCS7PKCS #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)有
If
OAEPPadding
is used, Cipher
objects are initialized with ajavax.crypto.spec.OAEPParameterSpec
object to suppply values needed for OAEPPadding.PKCS1PaddingThe padding scheme described in PKCS1, used with the RSA algorithm.PKCS5PaddingThe padding scheme described in RSA Laboratories, "PKCS5: Password-Based Encryption Standard," version 1.5, November 1993.SSL3PaddingThe 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 ofpadding_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.简单对比之下发现,通用的有None,ISO10126两种填充法,实际上PKCS5Padding与PKCS7Padding基本上也是可以通用的。
通过研读参考资料下面的参考资料可以发现两者定义的区别:
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
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示例
try {
byte[] KEY_DATA = {1,8,-49,-31,77,90,10,121,-14,109,107,38,29,68,59,5,82,49,31,42,-25,67,96,15};
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
SecretKeySpec key = new SecretKeySpec(KEY_DATA, "DESede");//生成加密解密需要的Key
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] res = cipher.doFinal(data.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
C# Code示例
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));
- PKCS5Padding与PKCS7Padding的区别
- 关于PKCS5Padding与PKCS7Padding的区别
- AES - 关于PKCS5Padding与PKCS7Padding的区别
- 关于PKCS5Padding与PKCS7Padding的区别
- 关于PKCS5Padding与PKCS7Padding的区别
- PKCS7Padding & PKCS5Padding
- PKCS5Padding 和 PKCS7Padding
- AES 加密 中的PKCS5Padding、PKCS7Padding 和NO Padding的问题
- Java与C/C++通用的“AES/ECB/PKCS5Padding”实现
- AES/ECB/PKCS5Padding/PKCS7Padding 128位密钥(带密钥补位功能)加密解密
- 加密算法AES256的ECB-PKCS7Padding加密
- Javascript与java相同的3des加密(使用etdesede/CBC/PKCS5Padding )
- php AES/CBC/PKCS5Padding 与java对接
- golang中DES/ECB/PKCS5Padding的实现
- java和iOS的DES/EBC/PKCS5Padding
- OC的DES加密,使与java的Cipher类用DES/CBC/PKCS5Padding方式的加密结果相同
- java实现基于PKCS7Padding填充方式的AES加解密
- java实现基于PKCS5Padding填充方式的AES加解密
- iOS --- 协议部分(swift2.3)
- Spring AOP定义以及注解形式实现
- C++中的rand()、srand()
- 径向基网络(RBF network)之BP监督训练
- 浅谈C++类(7)--析构函数
- PKCS5Padding与PKCS7Padding的区别
- OpenGL学习脚印: 光照中材质和lighting maps使用(material and lighting maps)
- LeetCode第3题
- 径向基核函数
- POJ-2421 D - Constructing Roads
- 进程与线程的区别与联系
- 自定义View(二)
- 常用的核函数
- python 爬虫抓取淘宝MM照片