`
ericbaner
  • 浏览: 177445 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】RSA加密的填充模式

 
阅读更多

跟DES,AES一样, RSA也是一个块加密算法( block cipher algorithm),总是在一个固定长度的块上进行操作。

但跟AES等不同的是, block length是跟key length 以及所使用的填充模式 有关的。

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  不填充

文件: PKCS__1_v2.1_RSA_算法标准.pdf
大小: 838KB
下载: 下载


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)
3. 输出 c

解密原理 RSADP (K, c)
输入:   K  RSA私钥,K由下面形式:
一对(n,d)
一个五元组(p, q, dP, dQ, qInv)
一个可能为空的三元序列(ri, di, ti), i=3,…,u
c 密文
输出:   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)

<iframe id="aswift_0" style="left: 0px; position: absolute; top: 0px;" name="aswift_0" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="234" height="60"></iframe> 

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编码

分享到:
评论

相关推荐

    RSA使用PKCS1填充javascript加密

    3. **RSA加密**:使用公钥和填充后的数据执行RSA加密操作。这个过程实际上是将填充后的数据进行模幂运算(即\(ciphertext = plaintext^e \mod n\)),其中\(e\)是公钥的指数,\(n\)是模数。 4. **结果处理**:得到的...

    C# RSA加密解密

    **C# RSA加密解密详解** 在信息安全领域,加密技术是一种至关重要的手段,用于保护数据的隐私和安全性。RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,广泛应用于网络通信、数据存储等领域。C#作为.NET...

    unity工具类RSA加密和解密

    本文将深入探讨RSA加密和解密的基础知识以及如何在Unity中实现这一功能。 首先,RSA加密的核心原理是基于大整数因子分解的困难性。它生成一对密钥:公钥和私钥。公钥可以公开,用于加密;而私钥必须保密,用于解密...

    C#RSA加密DEMO

    该方法接受一个字节数组作为要加密的数据,以及一个布尔值指示是否使用OAEP填充模式(优化的阿舍尔1981填充)。RSA加密通常用于小块数据,因为它处理的单位是模数的大小,通常为128到2048位。 在"C# RSA加密DEMO"中...

    易语言调用JSEncrypt实现RSA加密解密

    它提供了一种简单的方式来处理RSA公钥和私钥,并支持PKCS1(OAEP)填充模式,增加了加密的安全性。 在易语言中调用JSEncrypt,首先你需要将JSEncrypt的JavaScript代码转换为易语言可以理解的形式。这通常涉及到使用...

    RSA加密算法的C语言实现

    - 填充模式:为了防止攻击,明文在加密前通常会进行特定填充,如PKCS#1。 - 性能优化:大数运算可能导致性能瓶颈,可以通过优化算法或使用硬件加速来改善。 - 密钥管理:公钥可以公开,但私钥必须妥善保管,避免泄露...

    rsa加密算法的实现

    7. 安全性考虑:虽然RSA算法本身安全性较高,但在实际应用中,还需要考虑密钥管理、填充模式、安全随机数生成等多方面因素,以确保整体系统的安全性。 在提供的压缩包文件"rsa.c"中,应该包含了上述部分或全部的...

    rsa.rar_RSA in ASP_asp rsa_rsa_rsa asp_rsa 加密

    "RSA加密 为netbox设计的,可以设置填充模式" 描述中提到RSA加密是为一个名为“netbox”的项目或工具设计的,这可能是一个特定的软件或框架。RSA加密允许用户选择填充模式,这是RSA算法的一个重要特性,因为不同填充...

    C#RSA加密解密汇总

    在C#中实现RSA加密解密是一项关键的安全技术,下面我们将深入探讨这一主题。 RSA加密的核心概念基于大整数因子分解的困难性。它由两个密钥组成:公钥和私钥。公钥用于加密数据,而私钥用于解密。在C#中,我们可以...

    RSA加密算法实现以及C#与java互通加解密

    在实际应用中,由于RSA加密过程中输入数据的大小受限于密钥的长度,因此需要将较长的明文分成多个块,分别进行加密后再合并,这一过程称为填充算法。常见的填充方式有NoPadding、OAEPPadding和PKCS1Padding等。 - *...

    RSA.rar_RSA 加密解密_rsa_rsa加密 文件_加密压缩

    在实际应用中,RSA还涉及到消息摘要(如MD5或SHA)和填充模式,以防止某些攻击,例如 chosen-ciphertext attack 和 padding oracle attack。填充通常遵循PKCS#1标准,确保密文的长度符合RSA模运算的要求,并增加安全...

    RSA加密解密代码库

    6. **PKCS#1标准**:在实际应用中,通常会遵循PKCS#1标准(Public-Key Cryptography Standards #1)来进行RSA加密和解密,它定义了如何填充明文数据,以防止中间人攻击和其他安全问题。 在IOS-RSA这个文件中,可能...

    用C#实现RSA的加密与解密

    总结起来,用C#实现RSA加密与解密涉及了非对称加密原理、`RSACryptoServiceProvider`类的使用、密钥生成与管理、以及可能的用户界面设计。在实际应用中,这些知识可以用于保障数据安全,实现安全的通信和存储。

    RSA文件加密算法C#实现.rar_RSA文件加密算法C#实现_RSA算法_grayvwe_rsa加密_rsa文件加密

    在给定的压缩包文件“RSA文件加密算法C#实现”中,可能包含了实现RSA加密的C#代码示例,这些代码可以帮助理解如何在C#环境中集成RSA加密功能,用于保护敏感文件的安全。 总之,RSA文件加密算法在C#中的实现涉及到...

    Android使用RSA加密解密功能的实现Demo

    // 使用RSA算法,ECB模式,PKCS1填充 cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes()); // ... 将加密后的字节数组转换为适合存储或传输的格式 ...

    RSA加密解密字符串

    此外,为了提高安全性,可以使用OAEP填充模式,它在RSA加密时增加了额外的随机数据,提高了破解的难度。 在VB.NET中,RSA加密解密字符串涉及的关键知识点包括非对称加密、RSA算法原理、`RSACryptoServiceProvider`...

    java rsa加密解密程序

    4. **安全性考虑**:为了提高安全性,通常会使用填充模式,如PKCS#1,以防止攻击者通过分析密文的模式来破解密钥。此外,RSA不适合加密大量数据,因为其运算速度较慢,一般用于加密较小的密钥或消息摘要,然后用这个...

    微信小程序rsa分段加密

    微信小程序RSA分段加密是一种在小程序环境中实现RSA加密技术的方式,由于RSA算法处理的数据长度有限制,当需要加密的数据超过这个限制时,就需要采用分段加密的方法。在此,我们将深入探讨RSA加密的基本原理、微信小...

    RSA加密算法的实现

    8. 填充模式:为了防止攻击者通过分析模式来破解,通常会在数据加密前进行随机填充。PKCS#1定义了一种常见的填充方式。 9. 签名与验签:除了加密和解密,RSA还可以用于数字签名,这是通过私钥对消息进行哈希运算后...

    RSA加密算法的C++演示

    由于RSA不适合处理大块数据,通常采用块加密模式,如OAEP(Optimal Asymmetric Encryption Padding)或者PKCS#1 v1.5填充。 4. **文件操作**:在C++中,可以使用MFC的`CFile`类来读写文件。在加密前,原始文件内容...

Global site tag (gtag.js) - Google Analytics