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

RSA分段加密解密

rsa 
阅读更多
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分段加密解密

    PHP RSA分段加密解密是由于RSA算法本身的特性决定的。RSA加密基于两个不同的密钥——公钥和私钥。公钥可以公开,用于加密数据;而私钥必须保密,用于解密数据。然而,RSA算法的加密和解密效率较低,且存在一个最大可...

    C# RSA分段加解密实现方法详解

    本篇文章将深入探讨C#中RSA分段加解密的实现方法。 首先,我们需要了解RSA加密的基本限制。在.NET框架中,RSA加密算法由于安全性的考虑,会在加密前添加一些随机数,这意味着单次加密的最大数据量受到限制。例如,...

    前端 RSA分段加密算法

    "前端 RSA 分段加密算法"正是这种技术的一个实际应用。本文将深入探讨这一主题,包括RSA算法的基本原理、分段加密的原因以及在前端环境中如何实现。 RSA(Rivest-Shamir-Adleman)是一种公钥加密算法,由Ron Rivest...

    Java RSA 分段加密解密工具 .NET密钥转换

    采用Java Swing技术实现的一个小工具类 请在jre环境下使用

    JSEncrypt 前端js分段加密解密RSA

    jsencrypt.min.js通过JSEncrypt分段加密解密,自己添加了分段加解密的方法

    rsa分段加密算法

    总的来说,RSA分段加密是应对RSA算法对加密数据长度限制的一种有效策略。它结合了RSA的非对称性和对称加密的效率,为大文件或大量数据的传输提供了安全解决方案。同时,分段加密也增加了破解的难度,因为攻击者需要...

    java_RSA加解密+RSA分段加解密.zip

    使用RSA非对称加密完成Java后端RSA加密和分段加解密,最近研究了RSA非对称加密,关于什么是RSA,网上各种文章一搜一大把,由于RSA的特性,一个1024位的密钥只能加密117位字节数据,当数据量超过117位字节的时候,程序...

    IOS RSA加密 分段解密

    6. **错误处理和性能优化**:在进行RSA分段解密时,需要注意处理可能出现的错误,如密文段的正确性检查、密钥对的有效性验证等。此外,可以考虑使用缓存和多线程技术提高解密速度。 7. **代码实现**:使用Objective...

    JavaScript_RSA加解密+分段加解密.zip

    使用RSA非对称加密完成JavaScript前端RSA加密和分段加解密,最近研究了RSA非对称加密,关于什么是RSA,网上各种文章一搜一大把,但是关于如何使用RSA完成前端的组合加密解密,东西就非常少了,并且由于RSA的特性,一...

    小程序RSA分段加解密

    RSA分段加密是为了解决大数据量加密时的问题,因为RSA算法本身的加密长度有限,通常只有几百个字节。当需要加密的数据超过这个长度时,就需要将数据分段,每段使用RSA进行独立加密,然后将加密后的结果拼接在一起。 ...

    小程序 rsa 分段加密程序

    标题中的"小程序rsa分段加密程序"指的是在微信小程序等轻量级应用中,使用RSA加密技术来保护敏感数据,但因为数据可能较大,不能一次性完整加密,所以需要将数据分成多个较小的部分(或段)分别进行加密。...

    PHP-RSA加密解密,支持分段解密

    PHP的RSA加密解密类,支持RSA分段解密,可用于解密APP发送的较长的字符串。 使用方法: Rsa::privDecrypt($encryptedString); //RSA私钥解密 Rsa::privEncrypt($string); //RSA私钥加密 Rsa::publicDecrypt($...

    C# RSA加密解密

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

    RSA分段加解密java和

    在Java和PHP中实现RSA分段加解密时,需要注意以下关键知识点: 1. **RSA原理**: - RSA基于数论中的大数因子分解难题。一对公钥和私钥由两个大素数相乘得到,分解这个乘积非常困难,因此保证了安全性。 - 公钥(e...

    Java实现Rsa非对称分段加解密方法源码分享

    在IT领域,安全是至关重要的...在`RsaEncrypt.java`文件中,应该包含了具体的实现细节,如密钥的生成、加密解密的逻辑以及可能的分段处理等。通过理解并实践这些代码,开发者可以更好地掌握RSA加密在实际项目中的应用。

    RSA分段加密资源压缩包

    RSA分段加密是一种基于公钥密码学的加密技术,它在信息安全领域有着广泛的应用,尤其在数据传输和存储安全上。本资源压缩包提供了一套完整的RSA分段加密的实现和相关工具,对于理解RSA算法及其应用具有重要的参考...

    RSA分段加解密算法实现

    在测试项目`RSATest`中,可能包含了一系列测试用例,用于验证`RSAHelper`类库的功能是否正常,包括不同大小的数据加密解密,以及不同密钥操作的正确性。 理解并实现这样的RSA分段加解密算法有助于提升对非对称加密...

    微信小程序rsa分段加密

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

    rsa分段加密加密解决方案

    **RSA分段加密步骤**: 1. **分割明文**:将原始明文按照RSA算法能处理的最大长度(通常是密钥长度的一半)进行切分,得到多个小段明文。 2. **选择公钥**:使用接收方提供的公钥进行加密。公钥可以在不保密的情况...

Global site tag (gtag.js) - Google Analytics