RSA加密解密(附源码工程)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

目录(?)[+]

一、RSA加密介绍

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。

综上所述,RSA加密是贼可靠的。

有些猿友们可能会有这样的想法或疑问,加密,好高深的样子,感觉自己用不到。

博主本科刚刚毕业半年左右,确是用到了,并不是我多厉害,如下场景就会用到:你公司跟其他公司合作,你需要提供一个接口给别人调用,但是对方调用接口提供的参数可能包含一些敏感数据,如用户手机号码,身份证号码等。这时候,可以利用RSA加密,你生成一个公钥和一个私钥,将公钥发给合作方,让其对参数进行加密,然后你利用私钥进行加密。

下面马上介绍RSA加密使用

二、RSA加解密java中的使用

本工程使用环境eclipse + maven,如果没有使用maven的猿友可自行下载这两个jar包:bcprov-jdk16-1.4.5.jar 和 commons-codec-1.6.jar

对于使用了maven的猿友添加如下依赖:

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>1.45</version>
</dependency>
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.6</version>
</dependency>

   
   

    本工程一共三个类,目录结构如下:

    这里写图片描述

    下面详细介绍:

    2.1、生成密钥,公钥和私钥

    RSAKeyCreater.Java内容如下:

    package com.luo.util;
    
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.SecureRandom;
    import java.security.Security;
    
    
    import org.apache.commons.codec.binary.Base64;
    
    public class RSAKeyCreater {
    
        public static void createKeyPairs() {
            try {
                Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
                KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");
                generator.initialize(512, new SecureRandom());
                KeyPair pair = generator.generateKeyPair();
                PublicKey pubKey = pair.getPublic();
                PrivateKey privKey = pair.getPrivate();
                byte[] pk = pubKey.getEncoded();
                byte[] privk = privKey.getEncoded();
                String strpk = new String(Base64.encodeBase64(pk));
                String strprivk = new String(Base64.encodeBase64(privk));
    
                System.out.println("公钥Base64编码:" + strpk);
                System.out.println("私钥Base64编码:" + strprivk);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        public static void main(String args[]) {
            createKeyPairs();
        }
    
    }
    
    
     
     


      运行该类main方法控制台输入如下,获得公钥和私钥,公钥用于加密,私钥用于解密:

      这里写图片描述

      2.2、RSA加密解密类

      RsaUtil.java内容如下:

      package com.luo.util;
      
      import java.security.PrivateKey;
      import java.security.PublicKey;
      import javax.crypto.Cipher;
      import org.apache.commons.codec.binary.Base64;
      
      public class RsaUtil {
      
          /**
           * luoguohui
           * 2015-12-26
           * RSA加密
           */
          public String encryptData(String data, PublicKey publicKey) {
              try {
                  Cipher cipher = Cipher.getInstance("RSA");
                  cipher.init(Cipher.ENCRYPT_MODE, publicKey);
                  byte[] dataToEncrypt = data.getBytes("utf-8");
                  byte[] encryptedData = cipher.doFinal(dataToEncrypt);
                  String encryptString = Base64.encodeBase64String(encryptedData);
                  return encryptString;
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return null;
          }
      
      
          /**
           * luoguohui
           * 2015-12-26
           * RSA解密
           */
          public String decryptData(String data, PrivateKey privateKey) {
              try {
                  Cipher cipher = Cipher.getInstance("RSA");
                  cipher.init(Cipher.DECRYPT_MODE, privateKey);
                  byte[] descryptData = Base64.decodeBase64(data);
                  byte[] descryptedData = cipher.doFinal(descryptData);
                  String srcData = new String(descryptedData, "utf-8");
                  return srcData;
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return null;
          }
      
      }
      
      
       
       

        2.3、加密解密测试

        RSATest.java内容如下:

        package com.luo.util;
        
        import java.security.KeyFactory;
        import java.security.PrivateKey;
        import java.security.PublicKey;
        import java.security.Security;
        import java.security.spec.PKCS8EncodedKeySpec;
        import java.security.spec.X509EncodedKeySpec;
        import org.apache.commons.codec.binary.Base64;
        
        public class RSATest {
        
            public static void testRsa() {
                try {
                    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        
                    String strpk = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJPSsAm9Po08VtGKQx86TuOYu/7BTOtwYlFQvjQCEs3aTeUOH3p9pgd3pw14Num0n/l3Sk3d1av4hzZJvlODfScCAwEAAQ==";
                    String strprivk = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAk9KwCb0+jTxW0YpDHzpO45i7/sFM63BiUVC+NAISzdpN5Q4fen2mB3enDXg26bSf+XdKTd3Vq/iHNkm+U4N9JwIDAQABAkAch9iUOKNfDRtQnBfyagWZ5fu64sIe2vUO7r+XOCM6+a/BvKV+5aMRpR6ts8OyEz9F+KCagc8eSEO0DAFjurQ5AiEA72jh09XwAHpvUONQu8JyziZtB5Cpf/y2iCC3ucxJ510CIQCeEQ+2sd4jC7P+wdCB0K1HxXtslxD3Bq50yVtsyI3CUwIhAJUpQ4o4QNALeE9tUV+qRt0qE8Qi3Xhge1lVCSM5pNIBAiACY0OXgOxYHy8i5A6gR2S2ttb8dvO8p48vGHOXGxh5HQIgfiKMcSTfflaQBBgzDFvaVnsfs2ajbv9tNcWuAP7u6aA=";
        
                    X509EncodedKeySpec pubX509 = new X509EncodedKeySpec(Base64.decodeBase64(strpk.getBytes()));
                    PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decodeBase64(strprivk.getBytes()));
        
                    KeyFactory keyf = KeyFactory.getInstance("RSA", "BC");
                    PublicKey pubKey = keyf.generatePublic(pubX509);
                    PrivateKey privKey = keyf.generatePrivate(priPKCS8);
        
                    RsaUtil rsaUtil =  new RsaUtil();
                    String data = "luoguohui";
                    System.out.println("加密前字符串:data=" + data);
                    String encryptData = null;
                    if (pubKey != null && (data != null && !data.equals(""))) {
                        encryptData = rsaUtil.encryptData(data, pubKey);
                        System.out.println("加密后字符串:encryptData=" + encryptData);
                    }
                    String descryptData = null;
                    if (privKey != null && (encryptData != null && !encryptData.equals(""))) {
                        descryptData = rsaUtil.decryptData(encryptData, privKey);
                        System.out.println("解密后字符串:descryptData=" + descryptData);
                    } 
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        
            public static void main(String args[]) {
                testRsa();
            }
        
        }
        
         
         



          其中strpk和strprivk是2.1中运行获得公钥私钥串

          运行RSATest.java的main方法,得到运行结果如下:

          这里写图片描述

          三、源码下载

          http://download.csdn.net/detail/u013142781/9378458






          相关文章
          |
          4月前
          |
          存储 安全 数据安全/隐私保护
          打造安全防线!Python AES&RSA加密工具,黑客绕道走的秘籍
          【9月更文挑战第9天】随着数字化时代的到来,信息安全问题日益凸显。本文将介绍如何使用Python结合AES与RSA两种加密算法,构建强大的加密工具。AES以其高效性和强安全性著称,适用于大量数据的快速加密;RSA作为非对称加密算法,在加密小量数据及实现数字签名方面表现卓越。通过整合两者,可以构建既安全又灵活的加密系统。首先,需要安装pycryptodome库。接着,实现AES加密与解密功能,最后利用RSA加密AES密钥,确保其安全传输。这种设计不仅提高了数据传输效率,还增强了密钥交换的安全性,为敏感数据提供坚实保护。
          248 43
          |
          4月前
          |
          安全 算法 网络安全
          浅谈非对称加密(RSA)
          浅谈非对称加密(RSA)
          197 0
          |
          3月前
          |
          算法 安全 Go
          RSA加密算法详解与Python和Go实现
          RSA加密算法详解与Python和Go实现
          223 1
          |
          3月前
          |
          算法 安全 网络安全
          使用 Python 实现 RSA 加密
          使用 Python 实现 RSA 加密
          134 2
          |
          4月前
          |
          存储 安全 算法
          RSA在手,安全我有!Python加密解密技术,让你的数据密码坚不可摧
          【9月更文挑战第11天】在数字化时代,信息安全至关重要。传统的加密方法已难以应对日益复杂的网络攻击。RSA加密算法凭借其强大的安全性和广泛的应用场景,成为保护敏感数据的首选。本文介绍RSA的基本原理及在Python中的实现方法,并探讨其优势与挑战。通过使用PyCryptodome库,我们展示了RSA加密解密的完整流程,帮助读者理解如何利用RSA为数据提供安全保障。
          153 5
          |
          4月前
          |
          安全 算法 数据安全/隐私保护
          深度揭秘!Python加密技术的背后,AES与RSA如何守护你的数据安全
          【9月更文挑战第10天】随着数字化时代的到来,数据安全成为企业和个人面临的重大挑战。Python 作为功能强大的编程语言,在数据加密领域扮演着重要角色。AES 和 RSA 是两种主流加密算法,分别以对称和非对称加密方式保障数据安全。AES(Advanced Encryption Standard)因其高效性和安全性,在数据加密中广泛应用;而 RSA 则利用公钥和私钥机制,在密钥交换和数字签名方面表现卓越。
          94 3
          |
          4月前
          |
          存储 安全 数据库
          双重防护,无懈可击!Python AES+RSA加密方案,构建最强数据安全堡垒
          【9月更文挑战第11天】在数字时代,数据安全至关重要。AES与RSA加密技术相结合,构成了一道坚固防线。AES以其高效性保障数据加密,而RSA则确保密钥安全传输,二者相辅相成,提供双重保护。本文通过Python代码示例展示了这一加密方案的魅力,强调了其在实际应用中的重要性和安全性。使用HTTPS等安全协议传输加密密钥和密文,确保数据在数字世界中自由流通而无忧。
          87 1
          |
          4月前
          |
          安全 数据安全/隐私保护 Python
          情书也能加密?Python AES&RSA,让每一份数据都充满爱的密码
          【9月更文挑战第8天】在这个数字化时代,情书不再局限于纸笔,也可能以电子形式在网络中传递。为了确保其安全,Python提供了AES和RSA等加密工具,为情书编织爱的密码。首先,通过安装pycryptodome库,我们可以利用AES对称加密算法高效保护数据;接着,使用RSA非对称加密算法加密AES密钥和IV,进一步增强安全性。即使情书被截获,没有正确密钥也无法解读内容。让我们用Python为爱情编织一张安全的网,守护每份珍贵情感。
          57 2
          |
          5月前
          |
          算法 JavaScript 前端开发
          国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
          国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
          358 1
          |
          4月前
          |
          安全 算法 数据安全/隐私保护
          黑客克星!Python加密艺术大公开,AES、RSA双剑合璧,守护你的数字世界
          在这个数据泛滥的时代,数字世界既充满了知识,也潜藏安全隐患。Python 作为强大的编程语言,以其独特的加密技术为我们的信息安全保驾护航。本文将介绍 AES 和 RSA 这两种加密算法,揭示它们如何协同工作,保护你的数字世界。AES(高级加密标准)以其高效、安全著称,能将敏感信息转化为难以破解的乱码。Python 的 `pycryptodome` 库让 AES 加密变得简单易行。然而,AES 面临密钥分发难题,此时 RSA(非对称加密算法)便大显身手,通过公钥加密、私钥解密的方式确保密钥传输安全。AES 与 RSA 在 Python 中交织成一道坚不可摧的防护网,共同守护我们的数字世界。
          95 0

          热门文章

          最新文章