openssl pkcs1paddingg怎么填充

RSA不同语言环境下的随机填充算法 -
- ITeye博客
博客分类:
&&& RSA随机填充算法种类,包括NoPadding、ISO10126Padding、OAEPPadding、PKCS1Padding、PKCS5Padding、SSL3Padding,OAEPPadding、PKCS1Padding等。
&&& .Net的实现用的是PKCS1Padding,而且只有这一种实现。
&&& Java的实现,主要通过Cipher.getInstance实现,传入的参数是描述为产生某种输出而在给定的输入上执行的操作(或一组操作)的字符串。必须包括加密算法的名称,后面可能跟有一个反馈模式和填充方案。这样的实现就比较灵活,我们可以通过参数指定不同的反馈模式和填充方案;比如Cipher.getInstance("RSA/ECB/PKCS1Padding"),或者Cipher.getInstance("RSA")均可,但用其加密的效果也会不一样;java中默认填充方式是RSA/ECB/PKCS1Padding。
&&& Android的默认填充算法不是(没找到是什麽),但可以指定为以下类型。
RSA/ECB/NoPadding 1+
RSA/ECB/OAEPPadding 1+
RSA/ECB/OAEPwithSHA-1andMGF1Padding 10+
RSA/ECB/OAEPwithSHA-256andMGF1Padding 10+
RSA/ECB/PKCS1Padding 1+
RSA/NONE/NoPadding 1+
RSA/NONE/OAEPPadding 1+
RSA/NONE/OAEPwithSHA-1andMGF1Padding 10+
RSA/NONE/OAEPwithSHA-256andMGF1Padding 10+
RSA/NONE/PKCS1Padding 1+
/reference/javax/crypto/Cipher.html
kewell2004
浏览: 10827 次
来自: 北京1009人阅读
学习(46)
1)RSA_PKCS1_PADDING 填充模式,最常用的模式
输入 必须 比 RSA 钥模长(modulus) 短至少11个字节, 也就是 RSA_size(rsa) – 11
&&& 如果输入的明文过长,必须切割, 然后填充
输出 和modulus一样长
根据这个要求,对于512bit的密钥, block length = 512/8 – 11 = 53 字节
2) RSA_PKCS1_OAEP_PADDING
RSA_size(rsa) – 41
3)for RSA_NO_PADDING 不填充
RSA_size(rsa)
一般来说, 我们只用RSA来加密重要的数据,比如AES的key, 128bits = 16
加密的输出,总是等于key length
对同样的数据,用同样的key进行RSA加密, 每次的输出都会不一样; 但是这些加密的结果都能正确的解密
—————
I2OSP – Integer-to-Octet-String primitive 大整数转换成字节串
I2OSP (x, xLen)
输入: x 待转换的非负整数
&&& xLen 结果字节串的可能长度
加密原理 RSAEP ((n, e), m)
输入: (n,e) RSA公钥
m 值为0到n-1 之间一个大整数,代表消息
输出: c 值为0到n-1之间的一个大整数,代表密文
假定: RSA公钥(n,e)是有效的
1. 如果m不满足 0 2. 让 c = m^e % n (m的e次幂 除以n ,余数为c)
解密原理 RSADP (K, c)
输入:&& K RSA私钥,K由下面形式:
&&&&&&&&&& 一对(n,d)
一个五元组(p, q, dP, dQ, qInv)
&&&&&&&&& 一个可能为空的三元序列(ri, di, ti), i=3,...,u
输出:&& m 明文
1. 如果密文c不满足 0 & c & n-1, 输出 'ciphertext repersentative out of range'
2. 按照如下方法计算m:
a. 如果使用私钥K的第一种形式(n, d), 就让 m = c^d % n (c的d次幂,除以n,余数为m)
b. 如果使用私钥K的第二种像是(p,q, dP, dQ, qInv)和(ri, di, ti),
--------------
----------------
加密 RSAES-PKCS1-V1_5-ENCRYPT ((n, e), M)
输入: (n, e) 接收者的公开钥匙, k表示n所占用的字节长度
&&&& M&&&& 要加密的消息, mLen表示消息的长度 mLen ≤ k – 11
输出: C&&&& 密文, 占用字节数 也为 k
1.长度检查, 如果 mLen & k-11, 输出 “message too long”
2. EME-PKCS1-v1_5 编码
a) 生成一个 伪随机非零串PS , 长度为 k – mLen – 3, 所以至少为8, 因为 k-mLen&11
b) 将PS, M,以及其他填充串 一起编码为 EM, 长度为 k, 即:
EM = 0×00 || 0×02 || PS || 0×00 || M
3.RSA 加密
a)将EM转换成一个大证书m
m = OS2IP(EM)
b)对公钥(n,e) 和 大整数 m, 使用RSAEP加密原理,产生一个整数密文c
c = RSAEP((n,e0, m)
c)将整数c转换成长度为k的密文串
C = I2OSP(c, k)
4.输出密文C
—————-
解密 RSAES-PKCS1-V1_5-DECRYPT (K, C)
输入: K 接收者的私钥
&&&& C&& 已经加密过的密文串,长度为k (与RSA modulus n的长度一样)
输出: M 消息明文, 长度至多为 k-11
1. 长度检查:如果密文C的长度不为k字节(或者 如果 k&11), 输出“decryption error&
2. RSA解密
a. 转换密文C为一个大整数c
c = OS2IP(C)
b. 对RSA私钥(n,d)和密文整数c 实施解密, 产生一个 大整数m
m = RSADP((n,d), c)
如果RSADP输出'ciphertext representative out of range'(意味c&=n), 就输出’decryption error”
c. 转换 m 为长度为k的EM串
&&&& EM = I2OSP(m, k)
3. EME-PKCS1-v1_5 解码:将EM分为 非零的PS串 和 消息 M
EM = 0×00 || 0×02 || PS || 0×00 || M
如果EM不是上面给出的格式,或者PS的长度小于8个字节, 那么就输出’decryption error’
5. 输出明文消息M
——————–
签名 RSASSA-PSS-SIGN (K, M)
输入&& K 签名者的RSA私钥
&&&& M 代签名的消息,一个字节串
输出&& S 签名,长度为k的字节串,k是RSA modulus n的字节长度
1. EMSA-PSS encoding: 对消息M实施EMSA-PSS编码操作,产生一个长度为 [(modBits -1)/8]的编码消息EM。 整数 OS2IP(EM)的位长最多是 modBits-1, modBits是RSA modulus n的位长度
EM = EMSA-PSS-ENCODE (M, modBits – 1)
注意:如果modBits-1 能被8整除,EM的字节长比k小1;否则EM字节长为k
2. RSA签名:
a. 将编码后的消息 EM 转换成一个大整数m
m = OS2IP(EM)
b. 对私钥K和消息m 实施 RSASP1 签名,产生一个 大整数s表示的签名
&& s = RSASP1 (K, m)
c. 把大整数s转换成 长度为k的字串签名S
S = I2OSP(s, k)
3.输出签名S
验证签名 RSASSA-PSS-VERIFY ((n, e), M, S)
输入: (n,e) 签名者的公钥
M 签名者 发来的消息,一个字串
&&& S 待验证的签名, 一个长度为k的字串。k是RSA Modulus n的长度
输出: ’valid signature’ 或者 ‘invalid signature’
1. 长度检查: 如果签名S的长度不是k, 输出’invalid signature’
2. RSA验证
a) 将签名S转换成一个大整数s
s = OS2IP (S)
b) 对公钥 (n,e) 和 s 实施 RSAVP1 验证, 产生一个 大整数m
m = RSAVP1 ((n, e), s)
c) 将m 转换成编码的消息EM,长度 emLen = [ (modBits -1)/8 ] 字节。 modBits是RSA modulus n的位长
&& EM = I2OSP (m, emLen)
注意: 如果 modBits-1可以被8整除,那么emLen = k-1,否则 emLen = k
3. EMSA-PSS验证: 对消息M和编码的EM实施一个 EMSA-PSS验证操作,决定他们是否一致:
Result = EMSA-PSS-VERIFY (M, EM, modBits – 1)
4. 如果Result = “consistent“,那么输出 ”valid signature”
否则, 输出 ”invalid signature”
签名,还可以使用 EMSA-PKCS1-v1_5 encoding编码方法 来产生 EM:
EM = EMSA-PKCS1-V1_5-ENCODE (M, k)
验证签名是,使用 EMSA-PKCS1-v1_5对 M产生第2个编码消息EM’
&& EM’ = EMSA-PKCS1-V1_5-ENCODE (M, k) .
然后比较 EM和EM’ 是否相同
———————
RSA的加密机制有两种方案一个是RSAES-OAEP,另一个RSAES-PKCS1-v1_5。PKCS#1推荐在新的应用中使用RSAES- OAEP,保留RSAES-PKCS#1-v1_5跟老的应用兼容。它们两的区别仅仅在于加密前编码的方式不同。而加密前的编码是为了提供了抵抗各种活动的敌对攻击的安全机制。
PKCS#1的签名机制也有种方案:RSASSA-PSS和RSASSA-PKCS1-v1_5。同样,推荐RSASSA-PSS用于新的应用而RSASSA-PKCS1-v1_5用于兼容老的应用。
——————–
RSAES-OAEP-ENCRYPT ((n, e), M, L)
选项:&& Hash 散列函数(hLen 表示 散列函数的输出的字节串的长度)
&&&&& MGF 掩码生成函数
输入: (n,e) 接收者的RSA公钥(k表示RSA modulus n的字节长度)
&& M 待加密的消息,一个长度为mLen的字节串 mLen &= k - 2 hLen -2
L 同消息关联的可选的标签,如果不提供L,就采用空串
输出: C 密文,字节长度为k
1.长度检查
a. 如果L的长度超过 hash函数的输入限制(对于SHA-1, 是2^61 -1),输出 label too long
b. mLen & k – 2hLen -2, 输出 message too long
2. EME-OAEP编码
引用自:http://blog.csdn.net/anxuegang/article/details/6162118
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:266163次
积分:2495
积分:2495
排名:第14974名
原创:39篇
转载:61篇
评论:42条
(4)(4)(2)(3)(8)(2)(2)(1)(4)(2)(10)(12)(2)(1)(10)(4)(17)(1)(1)(7)(3)(1)AES加密方法怎么调用PKCS5Padding_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
AES加密方法怎么调用PKCS5Padding
我有更好的答案
你可以去看源码,只不过ecb加密方式,其实底层是调用AES_encrypt接口。下面的代码给你一个参考,我是在调用aes_encrypt外面,自己严格控制了in和out的长度
采纳率:89%
来自团队:
为您推荐:
其他类似问题
aes的相关知识
等待您来回答Crypto(1)
工作中,我们常常会遇到跨语言平台的加密解密算法的交互使用,特别是一些标准的加解密算法,都设计到数据块Block与填充算法的
问题,例如C#与JAVA中的常见的填充算法如下:
.Net中的填充算法:
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 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据。&
下面的示例演示此模式的工作原理。假定块长度为 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
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
填充字符串由设置为零的字节组成。&
JAVA中支持的填充算法(Cipher)有
Description
No padding.
ISO10126Padding
This padding for block ciphers is described in&&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&,
used with the RSA algorithm.
The padding scheme described in&.
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_
} GenericBlockC
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.
简单对比之下发现,通用的有None,ISO10126两种填充法,实际上PKCS5Padding与PKCS7Padding基本上也是可以通用的。
通过研读参考资料下面的参考资料可以发现两者定义的区别:
[Def]&PKCS #7: Cryptographic Message Syntax Standard,
An RSA Laboratories Technical Note, Version 1.5. Revised November 1, 1993.&[Inf]&PKCS #5: Password-Based Encryption Standard,
An RSA Laboratories Technical Note, Version 1.5. Revised November 1, 1993.&
在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就不能解密了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:237229次
积分:3327
积分:3327
排名:第10331名
原创:17篇
转载:454篇
评论:28条
(1)(6)(2)(6)(2)(7)(2)(14)(11)(11)(6)(3)(6)(2)(6)(17)(4)(2)(3)(15)(16)(19)(32)(24)(4)(2)(10)(20)(38)(8)(5)(9)(3)(8)(1)(5)(9)(7)(2)(7)(11)(8)(17)(10)(6)(5)(2)(2)(5)(1)(9)(7)(3)(1)(1)(5)(3)(20)

我要回帖

更多关于 rsa ecb pkcs1padding 的文章

 

随机推荐