`

Java Rsa加密解密

 
阅读更多

RSA 1024 表示加密后的长度为 1024 位,即 128 个字节,但明文的最大长度不能超过 117 个字节,超过 117 个字节需要使用 RSA 2048,超过 245 个字节,需要使用更高位数的 RSA


RSA 
的位数越高,其密钥对产生及加密、解密的速度越慢,这是基于大素数非对称加密算法的缺陷。这样的非对称加密算法在效率上远比基于离散对数的非对称加密算法(比如:椭圆曲线加密算法)差。

Cipher   rsa   =   Cipher.getInstance( "RSA/ECB/PKCS1Padding "); 
表示,使用RSA算法,并且加PAD的方式按照PKCS1的标准。即输入数据长度小于等于密钥的位数/8-11,例如:1024位密钥,1024/8-11   =117   不足的部分,程序会自动补气。加密后的数据还是等于密钥的位数/8

以下是我实现的一个类:支持使用1024时加密超过117个字节的文本,并支持加密字符串为中英文。

生成公钥与私钥的类:

//*此类作用为生成密钥与公钥,密钥生成到文件中。公钥生成为字符串,可提供给他人。
public class Skey_RSA {
    public static void main(String args[]) throws Exception{
        KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
        kpg.initialize(1024);
        KeyPair kp=kpg.genKeyPair();
        PublicKey pbkey=kp.getPublic();
        PrivateKey prkey=kp.getPrivate();
        FileOutputStream     f2=new FileOutputStream("C://Skey_RSA_priv.dat");
        ObjectOutputStream b2=new     ObjectOutputStream(f2);
        b2.writeObject(prkey);
        try {
            //此处使用了sun.misc.BASE64Encoder。网上说不建议使用,可找到相关类替换。我太懒了。。。^_^
            System.err.println("公:"+(new BASE64Encoder()).encode(pbkey.getEncoded()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 加密解密类:

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import sun.misc.BASE64Decoder;

/**
 * @author yhcui
 * @version 创建时间:May 18, 2011 2:44:51 PM 类说明
 * RSA加密解实实现。
 * 支持加密字节长度超过117。
 * 支持加密中文与英文混合。
 */
public class RSAUtils {

    /**
     * 算法名称
     */
    private final static String RSA = "RSA";
    
    /**
     * 加密后的字节分隔长度
     */
    private final static int encryptSepLength = 256;
    
    /**
     * 明文字节分隔长度
     */
    private final static int plainSepLneght = 100; 

    private static byte[] encrypt(byte[] text, PublicKey pubRSA)
            throws Exception {
        Cipher cipher = Cipher.getInstance(RSA);
        cipher.init(Cipher.ENCRYPT_MODE, pubRSA);
        return cipher.doFinal(text);
    }

    public final static String encrypt(String text, PublicKey uk) {
        StringBuffer sbf = new StringBuffer(200);
        try {
            text = URLEncoder.encode(text, "UTF-8");//用这个的原因是为了支持汉字、汉字和英文混排,解密方法中同理
            byte[] plainByte = text.getBytes();
            ByteArrayInputStream bays = new ByteArrayInputStream(plainByte);
            byte[] readByte = new byte[plainSepLneght];
            int n = 0;

            //这个位置很恶心人的写了一堆,是为了支持超过117字节,我每次加密100字节。

            while ((n = bays.read(readByte)) > 0) {
                if (n >= plainSepLneght) {
                    sbf.append(byte2hex(encrypt(readByte, uk)));
                } else {
                    byte[] tt = new byte[n];
                    for (int i = 0; i < n; i++) {
                        tt[i] = readByte[i];
                    }
                    sbf.append(byte2hex(encrypt(tt, uk)));
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return sbf.toString();
    }

    public final static String decrypt(String data, PrivateKey rk) {
        String rrr = "";
        StringBuffer sb = new StringBuffer(100);
        try {
            ByteArrayInputStream bais = new ByteArrayInputStream(
                    data.getBytes());

             //此处之所以是 256,而不是128的原因是因为有一个16进行的转换,所以由128变为了256

             byte[] readByte = new byte[256];
            int n = 0;
            while ((n = bais.read(readByte)) > 0) {
                if (n >= encryptSepLength) {
                    sb.append(new String(decrypt(hex2byte(readByte), rk)));
                } else {

                }
            }
            rrr = URLDecoder.decode(sb.toString(), "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rrr;
    }

    private static byte[] decrypt(byte[] src, PrivateKey rk) throws Exception {
        Cipher cipher = Cipher.getInstance(RSA);
        cipher.init(Cipher.DECRYPT_MODE, rk);
        return cipher.doFinal(src);
    }

    public static String byte2hex(byte[] b) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = Integer.toHexString(b[n] & 0xFF);
            if (stmp.length() == 1)
                hs += ("0" + stmp);
            else
                hs += stmp;
        }
        return hs.toUpperCase();
    }

    public static byte[] hex2byte(byte[] b) {
        if ((b.length % 2) != 0)
            throw new IllegalArgumentException("长度不是偶数");

        byte[] b2 = new byte[b.length / 2];

        for (int n = 0; n < b.length; n += 2) {
            String item = new String(b, n, 2);
            b2[n / 2] = (byte) Integer.parseInt(item, 16);
        }
        return b2;
    }

    public static PrivateKey getPrivateKey() {
        try {
            FileInputStream f = new FileInputStream("c://Skey_RSA_priv.dat");
            ObjectInputStream b = new ObjectInputStream(f);
            RSAPrivateKey prk = (RSAPrivateKey) b.readObject();
            return prk;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public static PublicKey getPublicKey() {
        try {
            String publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDaWmSqfTHg0xyRTtih/0Q+Lk9ve+i6+ApxD27F"
                    + "u+SvKupeQ/+5Bu6SBXmpvHxcC4dqfYS/NGoJ5ZTuoh8pez6bffINVY47r8UwYMuQMxYs0n1egwYw"
                    + "rB+lwYbFhcOQ2BdoXcGF5fmWf2HfauQ6qNwyc2aGDXpgBIgmT5u+rZoOmwIDAQAB";
            byte[] keyBytes;
            keyBytes = new BASE64Decoder().decodeBuffer(publicKeyStr);
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PublicKey publicKey = keyFactory.generatePublic(keySpec);
            return publicKey;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String args[]) {
        try {
            String plaintext = "a";
            System.out.println("plaintextt.getByte().length:"
                    + plaintext.getBytes().length);
            String cipherText = encrypt(plaintext, getPublicKey());
            System.out.println("cipherText:" + cipherText);
            System.err.println("cipherText lenght:" + cipherText.length());
            System.err.println("cipherText byte[]:"
                    + cipherText.getBytes().length);
            String plainText = decrypt(cipherText, getPrivateKey());

            System.out.println("orginttext:" + plaintext);
            System.out.println("plainTex t:" + plainText);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
 
分享到:
评论

相关推荐

    Java RSA 加密解密

    Java RSA 加密解密是一...总的来说,Java RSA加密解密是保证数据安全传输的重要手段,其核心概念和操作流程在上述代码中得到了体现。实际开发时,还需要注意处理异常,以及根据具体需求选择合适的加密模式和填充方式。

    java RSA加密解密

    Java RSA 加密解密是一种基于非对称加密算法的安全...通过分析和运行这个示例,你可以更好地理解Java RSA加密解密的实际操作。同时,理解并掌握如何在Java中正确使用RSA算法对于进行安全的网络通信和数据保护至关重要。

    Js Java Rsa 加密解密

    JavaScript、Java和RSA加密解密是信息安全领域中的关键技术,它们被广泛应用于数据传输、用户认证、Web应用安全等场景。RSA是一种非对称加密算法,以其发明者Ron Rivest、Adi Shamir和Leonard Adleman的名字命名,它...

    Java实现的RSA加密解密算法示例

    Java实现的RSA加密解密算法示例 本文主要介绍了Java实现的RSA加密解密算法,结合实例形式分析了Java RSA加密解密算法的相关实现技巧。 知识点1:RSA加密解密算法简介 RSA加密解密算法是一种非对称加密算法,由Ron...

    javaRSA加密C++RSA解密

    JAVA也是通过包来实现加密和解密的,那么我的C++是通过OPENSSL的库来实现的。 重点来到了:RSA使用过程 1、C++随机生成一对公钥和私钥 2、JAVA用公钥给明文打包形成密文 3、C++用私钥解密密文

    java rsa加密解密程序

    综上所述,这个Java RSA加密解密程序结合了强大的加密算法和用户友好的界面,提供了数据安全保护的功能。无论是界面交互还是命令行操作,都能满足不同场景的需求。同时,理解并掌握RSA的工作原理对于理解和实现其他...

    Rsa加密解密.rar_RSA 加密解密_java rsa_rsa加密_rsa加密java_加密 解密

    在Java中实现RSA加密解密,需要使用Java Cryptography Extension (JCE)库。以下是使用RSA加密解密的基本步骤: 1. **生成密钥对**:首先,我们需要生成一对公钥和私钥。在Java中,`java.security.KeyPairGenerator`...

    JAVA实现RSA加密解密

    在Java中实现RSA加密解密,可以帮助开发者保护敏感信息,例如在网络传输过程中防止数据被窃取。 首先,了解RSA的工作原理至关重要。它基于两个大素数的乘积,生成一对密钥:公钥和私钥。公钥可以公开,用于加密信息...

    用javaRSA加密解密算法

    用JAVA实现RSA的解密和加密的算法。~亲测可以运行

    C#RSA加密与JAVA解密,实现相互通信

    总的来说,C#和Java之间的RSA加密解密通信涉及到多方面的知识,包括非对称加密原理、公钥私钥的生成和管理、不同编程语言间的互操作、数据安全传输以及可能的错误处理策略。掌握这些知识对于开发跨平台、高安全性的...

    RSA加密解密 JS加密 JAVA解密 【完美版】

    经过本人修改,简化并完善了别人的代码,使其更加的容易理解和学习! 此为一个完整的项目,...功能:服务端随机生成密钥,JS用公钥加密,服务端用私钥解密。用到的JS加密文件是从官网下载的最新版,速度快,稳定性好!

    C# JavaRSA加密解密的交互

    本文将深入探讨如何在C#和Java之间实现RSA加密解密的交互。RSA是一种非对称加密算法,它基于两个密钥——公钥和私钥,用于确保数据在传输过程中的安全性。 首先,我们关注"JAVA产生秘钥"这一环节。在Java中,我们...

    java_RSA2048加密解密.zip

    后端,Java作为一种常用的企业级开发语言,拥有丰富的安全库,例如Bouncy Castle,用于处理RSA加密解密。Java代码可能使用了`java.security`包下的`KeyPairGenerator`、`PublicKey`、`PrivateKey`等类来生成和管理...

    C# 实现与JAVA互通 加签/验签,RSA加密/解密

    * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。  * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。  * RSA加密解密:私钥...

    C#与java平台RSA加密解密签名验签互通案例

    本案例聚焦于"C#与Java平台RSA加密解密签名验签互通"的问题,这涉及到两个主要的技术点:RSA加密算法和跨平台兼容性。下面将详细阐述这两个知识点。 首先,RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和...

    JAVA中RSA加密解密工具类

    在Java编程语言中,RSA(Rivest-Shamir-...总结来说,RSA加密解密工具类在Java中是一个重要的安全组件,用于保护数据的安全传输和存储。理解并正确使用RSA算法及其相关的Java API对于开发安全的网络应用程序至关重要。

    java RSA加解密 zip加解密, js MD5 SHA1 RSA加密

    本文将深入探讨Java中的RSA加解密、ZIP加密压缩以及JavaScript中的MD5、SHA1和RSA加密算法。这些技术在网络安全、数据传输、用户认证等多个领域中广泛应用。 首先,我们来看RSA加密算法。RSA是一种非对称加密算法,...

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

    ### RSA加密算法实现以及C#与Java互通加解密 #### 一、RSA算法简介 RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir 和 Leonard Adleman 在1977年提出,并以其三人的名字首字母命名。RSA算法的安全性基于...

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

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

Global site tag (gtag.js) - Google Analytics