‘壹’ RSA加密填充方式
RSA加密常用的填充方式有下面3种:
1.RSA_PKCS1_PADDING 填充模式,最常用的模式
要求:
输入:必须 比 RSA 钥模长(molus) 短至少11个字节, 也就是RSA_size(rsa) – 11。如果输入的明文过长,必须切割,然后填充
输出:和molus一样长
根据这个要求,对于512bit的密钥,block length = 512/8 – 11 = 53 字节
2.RSA_PKCS1_OAEP_PADDING
输入:RSA_size(rsa) – 41
输出:和molus一样长
3.for RSA_NO_PADDING不填充
输入:可以和RSA钥模长一样长,如果输入的明文过长,必须切割,然后填充
输出:和molus一样长
跟DES,AES一样,RSA也是一个块加密算法( block cipher algorithm),总是在一个固定长度的块上进行操作。但跟AES等不同的是,block length是跟key length有关的。每次RSA加密的明文的长度是受RSA填充模式限制的,但是RSA每次加密的块长度就是key length。
需要注意:
假如你选择的秘钥长度为1024bit共128个byte:
1.当你在客户端选择RSA_NO_PADDING填充模式时,如果你的明文不够128字节加密的时候会在你的明文前面,前向的填充零。解密后的明文也会包括前面填充的零,这是服务器需要注意把解密后的字段前向填充的零去掉,才是真正之前加密的明文。
2.当你选择RSA_PKCS1_PADDING填充模式时,如果你的明文不够128字节加密的时候会在你的明文中随机填充一些数据,所以会导致对同样的明文每次加密后的结果都不一样。对加密后的密文,服务器使用相同的填充方式都能解密。解密后的明文也就是之前加密的明文。
3.RSA_PKCS1_OAEP_PADDING填充模式没有使用过, 他是PKCS#1推出的新的填充方式,安全性是最高的,和前面RSA_PKCS1_PADDING的区别就是加密前的编码方式不一样。
java默认RSA实现
一个优秀的加密必须每次生成的密文都不一致,即使每次你的明文一样、使用同一个公钥。因为这样才能把明文信息更安全地隐藏起来。
Java 默认的 RSA 实现是 "RSA/None/PKCS1Padding"(比如 Cipher cipher = Cipher.getInstance("RSA");句,这个 Cipher 生成的密文总是不一致的),Bouncy Castle 的默认 RSA 实现是 "RSA/None/NoPadding"。
为什么 Java 默认的 RSA 实现每次生成的密文都不一致呢,即使每次使用同一个明文、同一个公钥?这是因为 RSA 的 PKCS #1 padding 方案在加密前对明文信息进行了随机数填充。
你可以使用以下办法让同一个明文、同一个公钥每次生成同一个密文,但是你必须意识到你这么做付出的代价是什么。比如,你可能使用 RSA 来加密传输,但是由于你的同一明文每次生成的同一密文,攻击者能够据此识别到同一个信息都是何时被发送。
‘贰’ 为什么rsa加密时我把密钥长度设成256位,太长的字符串加密
在RSA加密中,选择密钥长度为256位是一个常见的做法,但这并非无懈可击。为了深入理解为什么密钥长度至关重要,我们首先需要明确RSA加密的基本原理。RSA基于两个基本的数学原理:大数分解的困难性和模运算的性质。它是一种非对称加密算法,使用一对密钥:公钥和私钥。
在实际应用中,RSA加密不仅仅是对明文进行加密,而是在特定格式下处理数据。这种格式,即padding,对于保护数据安全至关重要。通过padding,可以确保明文数据在加密之前具有一定的随机性,从而增强数据的安全性,防止多种攻击,包括选择明文攻击和密码分析。
例如,考虑使用非常小的参数进行RSA加密,如短公钥和密钥长度。在这种情况下,加密数据可能具有较低的随机性,使得通过简单的数学操作(如计算三次根)轻易地恢复原始明文成为可能。这种攻击策略在密钥长度较短的情况下尤其有效,因为它允许攻击者通过有限的尝试来解密数据。
为了解决这一问题,RSA加密标准如PKCS #1 v2.1引入了特定的padding模式。这种padding确保了明文数据在加密前具有足够的随机性,同时通过特定的格式和规则,增加了密钥的复杂度和安全性。例如,padding可能包括一个固定前导零字节、一个标识符(如0x02)和一个随机生成的前缀(PS),后跟明文数据和一个终止零字节。
这种padding不仅增加了数据的随机性,还通过引入额外的复杂性,使得攻击者难以利用数学漏洞来破解加密数据。同时,padding的引入还防止了特定类型的攻击,如Chinese Remainder Theorem(CRT)攻击,这种攻击依赖于在不同模数下解密的特性。通过遵循标准的padding规则,可以显着减少此类攻击的威胁。
综上所述,选择256位或更长的密钥长度,并遵循适当的padding规则,是确保RSA加密安全性的关键因素。这种做法不仅可以保护数据免受简单攻击,还能抵御更复杂的密码分析和技术攻击,为通信和数据保护提供坚实的防线。
‘叁’ android中自带的RSA加密算法和JAVA中的不是一个标准的吗
有点区别,java中默认填充方式是RSA/ECB/PKCS1Padding,Cipher.getInstance("RSA/ECB/PKCS1Padding");android不是
java
Cipher cipher =
Cipher.getInstance("RSA/ECB/PKCS1Padding");
android
Cipher cipher =
Cipher.getInstance("RSA/ECB/NoPadding");
‘肆’ 求安卓加密,安卓应用加密方式
android是用java语言开发的,java语言,JDK给我们提供了非常多的加密算法
如基本的单向加密算法:
BASE64 严格地说,属于编码格式,而非加密算法
MD5(Message Digest algorithm 5,信息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码)
复杂的对称加密(DES、PBE)、非对称加密算法:
DES(Data Encryption Standard,数据加密算法)
PBE(Password-based encryption,基于密码验证)
RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)DH(Diffie-Hellman算法,密钥一致协议)
DSA(Digital Signature Algorithm,数字签名)
ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)
以下就是讲解BASE64、MD5、SHA、HMAC几种方法
MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。
一. BASE64
按 照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
二. MD5
MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都 是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文 件是否一致的。
三. SHA
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 但是SHA仍然是公认的安全加密算法,较之MD5更为安全。
四. HMAC
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个 标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证 等。