package com.sankuai.meituan.waimai.common; import org.apache.commons.lang.ArrayUtils; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import sun.security.rsa.RSAPrivateKeyImpl; import sun.security.rsa.RSAPublicKeyImpl; import sun.security.util.DerValue; import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.util.HashMap; import java.util.Map; /** * Date: 14-9-18 * Time: 下午4:20 */ public class RSAHelper { public static final int ENCODE_MAX = 117; public static final int DECODE_MAX = 128; public static String decode(String encBase64String,String privateKeyString) throws Exception { BASE64Decoder base64Decoder = new BASE64Decoder(); byte[] desEncodeRead = base64Decoder.decodeBuffer(privateKeyString);// DerValue d = new DerValue(desEncodeRead); RSAPrivateKey privateKey= (RSAPrivateKey) RSAPrivateKeyImpl.parseKey(d); Cipher cipher =Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] src = base64Decoder.decodeBuffer(encBase64String); ByteArrayOutputStream out = new ByteArrayOutputStream(); for(int i=0; i<src.length; i+= DECODE_MAX){ byte[] toDecodeSegment = ArrayUtils.subarray(src, i,i+DECODE_MAX); byte[] destByte = cipher.doFinal(toDecodeSegment); System.out.println("decode"+destByte.length); out.write(destByte); } byte[] decode = out.toByteArray(); return new String(decode, "UTF-8"); } public static String encode(String src, String publicKey) throws Exception { BASE64Decoder base64Decoder = new BASE64Decoder(); BASE64Encoder base64Encoder = new BASE64Encoder(); byte[] desEncodeRead = base64Decoder.decodeBuffer(publicKey);// DerValue d = new DerValue(desEncodeRead); RSAPublicKey p = (RSAPublicKey) RSAPublicKeyImpl.parse(d); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, p); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] toEncode = src.getBytes(); for(int i=0; i<toEncode.length; i+= ENCODE_MAX){ byte[] toEncodeSegment = ArrayUtils.subarray(toEncode, i,i+ENCODE_MAX); byte[] ecodeSegemnt = cipher.doFinal(toEncodeSegment); System.out.println("adfdsSS"+ecodeSegemnt.length); out.write(ecodeSegemnt); } byte[] encode = out.toByteArray(); return base64Encoder.encode(encode); } /** * return map siz KEY为public key value为private key BASE64串 */ public static Map generateRSAKey() throws NoSuchAlgorithmException { BASE64Encoder base64Encoder = new BASE64Encoder(); KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(1024); KeyPair keyPair = keyPairGen.generateKeyPair(); // Generate keys RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); byte[] privateEncode = privateKey.getEncoded(); byte[] publicEncode = publicKey.getEncoded(); String privateKeyBase64 = base64Encoder.encode(privateEncode); String publicKeyBase64 = base64Encoder.encode(publicEncode); Map retValue = new HashMap(1); retValue.put(publicKeyBase64, privateKeyBase64); return retValue; } }
RSA/ECB/PKCS1Padding 算法,加密字节最大117,但不论设置到大,加密后的字节数组大小为128, 解密必须按128个字节一组进行,否则报错,128个字节一组实际上也保证了分段加加密是可逆的,分段 解密后能得到加密前的字节数组
相关推荐
PHP RSA分段加密解密是由于RSA算法本身的特性决定的。RSA加密基于两个不同的密钥——公钥和私钥。公钥可以公开,用于加密数据;而私钥必须保密,用于解密数据。然而,RSA算法的加密和解密效率较低,且存在一个最大可...
本篇文章将深入探讨C#中RSA分段加解密的实现方法。 首先,我们需要了解RSA加密的基本限制。在.NET框架中,RSA加密算法由于安全性的考虑,会在加密前添加一些随机数,这意味着单次加密的最大数据量受到限制。例如,...
"前端 RSA 分段加密算法"正是这种技术的一个实际应用。本文将深入探讨这一主题,包括RSA算法的基本原理、分段加密的原因以及在前端环境中如何实现。 RSA(Rivest-Shamir-Adleman)是一种公钥加密算法,由Ron Rivest...
采用Java Swing技术实现的一个小工具类 请在jre环境下使用
jsencrypt.min.js通过JSEncrypt分段加密解密,自己添加了分段加解密的方法
总的来说,RSA分段加密是应对RSA算法对加密数据长度限制的一种有效策略。它结合了RSA的非对称性和对称加密的效率,为大文件或大量数据的传输提供了安全解决方案。同时,分段加密也增加了破解的难度,因为攻击者需要...
使用RSA非对称加密完成Java后端RSA加密和分段加解密,最近研究了RSA非对称加密,关于什么是RSA,网上各种文章一搜一大把,由于RSA的特性,一个1024位的密钥只能加密117位字节数据,当数据量超过117位字节的时候,程序...
6. **错误处理和性能优化**:在进行RSA分段解密时,需要注意处理可能出现的错误,如密文段的正确性检查、密钥对的有效性验证等。此外,可以考虑使用缓存和多线程技术提高解密速度。 7. **代码实现**:使用Objective...
使用RSA非对称加密完成JavaScript前端RSA加密和分段加解密,最近研究了RSA非对称加密,关于什么是RSA,网上各种文章一搜一大把,但是关于如何使用RSA完成前端的组合加密解密,东西就非常少了,并且由于RSA的特性,一...
RSA分段加密是为了解决大数据量加密时的问题,因为RSA算法本身的加密长度有限,通常只有几百个字节。当需要加密的数据超过这个长度时,就需要将数据分段,每段使用RSA进行独立加密,然后将加密后的结果拼接在一起。 ...
标题中的"小程序rsa分段加密程序"指的是在微信小程序等轻量级应用中,使用RSA加密技术来保护敏感数据,但因为数据可能较大,不能一次性完整加密,所以需要将数据分成多个较小的部分(或段)分别进行加密。...
PHP的RSA加密解密类,支持RSA分段解密,可用于解密APP发送的较长的字符串。 使用方法: Rsa::privDecrypt($encryptedString); //RSA私钥解密 Rsa::privEncrypt($string); //RSA私钥加密 Rsa::publicDecrypt($...
**C# RSA加密解密详解** 在信息安全领域,加密技术是一种至关重要的手段,用于保护数据的隐私和安全性。RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,广泛应用于网络通信、数据存储等领域。C#作为.NET...
在Java和PHP中实现RSA分段加解密时,需要注意以下关键知识点: 1. **RSA原理**: - RSA基于数论中的大数因子分解难题。一对公钥和私钥由两个大素数相乘得到,分解这个乘积非常困难,因此保证了安全性。 - 公钥(e...
在IT领域,安全是至关重要的...在`RsaEncrypt.java`文件中,应该包含了具体的实现细节,如密钥的生成、加密解密的逻辑以及可能的分段处理等。通过理解并实践这些代码,开发者可以更好地掌握RSA加密在实际项目中的应用。
RSA分段加密是一种基于公钥密码学的加密技术,它在信息安全领域有着广泛的应用,尤其在数据传输和存储安全上。本资源压缩包提供了一套完整的RSA分段加密的实现和相关工具,对于理解RSA算法及其应用具有重要的参考...
在测试项目`RSATest`中,可能包含了一系列测试用例,用于验证`RSAHelper`类库的功能是否正常,包括不同大小的数据加密解密,以及不同密钥操作的正确性。 理解并实现这样的RSA分段加解密算法有助于提升对非对称加密...
微信小程序RSA分段加密是一种在小程序环境中实现RSA加密技术的方式,由于RSA算法处理的数据长度有限制,当需要加密的数据超过这个限制时,就需要采用分段加密的方法。在此,我们将深入探讨RSA加密的基本原理、微信小...
**RSA分段加密步骤**: 1. **分割明文**:将原始明文按照RSA算法能处理的最大长度(通常是密钥长度的一半)进行切分,得到多个小段明文。 2. **选择公钥**:使用接收方提供的公钥进行加密。公钥可以在不保密的情况...