• 微服务实战系列之加密RSA


    前言

    在这个时代,我们选择的人生目标已丰富多彩,秉持的人生态度也千差万别:
    除了吃喝玩乐,还有科技探索;
    除了CityWalk,还有“BookWalk”
    除了走遍中国,还有走遍世界;
    凡此种种选择和坚持,都是为了播下一粒种子,期望一树梨花。

    好了,我们暂且按下其他不表,言归正传。
    “微服务实战系列”中,博主已完成了以下组件的介绍:

    此时,博主不禁灵机一动,发起灵魂一问:
    当我们希望跨时空沟通,又要防止别人偷窥干扰,应该怎么办?
    显然以上4个组件不符合要求,自然望洋兴叹、无能为力。奈何博主也身不怀绝技,自觉闷闷不乐中…

    那到底怎么办呢?当然有问题就有办法,欢迎今天的主人公闪亮登场:RSA


    在正式掌握RSA之前,我们先了解一下密码学中的基本概念和常用术语。

    一、密码学

    密码学(在西欧语文中,源于希腊语kryptós“隐藏的”,和gráphein“书写”)是研究如何隐密地传递信息的学科。在现代特别指对信息以及其传输的数学性研究,常被认为是数学和计算机科学的分支,和信息论也密切相关。著名的密码学者Ron Rivest解释道:“密码学是关于如何在敌人存在的环境中通讯”,自工程学的角度,这相当于密码学与纯数学的异同。密码学是信息安全等相关议题,如认证、访问控制的核心。密码学的首要目的是隐藏信息的涵义,并不是隐藏信息的存在。密码学也促进了计算机科学,特别是在于电脑与网络安全所使用的技术,如访问控制与信息的机密性。密码学已被应用在日常生活:包括自动柜员机的芯片卡、电脑使用者存取密码、电子商务等等。
    密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。

    1. 安全标准
    • 信息的保密性 Confidentiality:
      防止信息泄漏给未经授权的人(加密解密技术);
    • 信息的完整性 Integrity:
      防止信息被未经授权的篡改(消息认证码,数字签名);
    • 认证性 Authentication:
      保证信息来自正确的发送者(消息认证码,数字签名);
    • 不可否认性 Non-repudiation:
      保证发送者不能否认他们已发送的消息(数字签名);
    2. 基本术语
    • 密钥:分为加密密钥和解密密钥。
    • 明文:没有进行加密,能够直接代表原文含义的信息。
    • 密文:经过加密处理处理之后,隐藏原文含义的信息。
    • 加密:将明文转换成密文的实施过程。
    • 解密:将密文转换成明文的实施过程。
    • 密码算法:密码系统采用的加密方法和解密方法,随着基于数学密码技术的发展,加密方法一般称为加密算法,解密方法一般称为解密算法。
    • 加密(encryption)算法:将普通信息(明文,plaintext)转换成难以理解的资料(密文,ciphertext)的过程;
    • 解密(decryption)算法则是其相反的过程:由密文转换回明文;加解密包含了这两种算法,一般加密即同时指称加密(encrypt或encipher)与解密(decrypt或decipher)的技术。

    在这里插入图片描述

    二、RSA

    初步学习了密码学的基本知识后,接下来,我们该谈谈今天的主人公——RSA了。
    不过博主今天不谈数论,不谈公式,只带着各位盆友了解RSA是怎么理论联系实际的。

    1. 名词解释

    RSA:一般指RSA加密算法。RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。RSA就是他们三人姓氏开头字母拼在一起组成的。

    这里提到一个关键的词:非对称加密算法。这是个什么东东?继续名词解释。

    公钥加密,也叫非对称(密钥)加密(public key encryption),属于网络安全二级学科,指的是由对应的一对唯一性密钥(即公开密钥和私有密钥)组成的加密方法。
    它解决了密钥的发布和管理问题,是商业密码的核心。在公钥加密体制中,没有公开的是私钥,公开的是公钥。

    纵观以上定义,我们发现RSA原来是靠一组密钥对在工作。
    简言之,公钥即public key,可以公开的密钥;私钥即private key,不可公开的密钥。

    2. 工作原理

    首先,在RSA的世界里,请记住一个口诀:公钥加密,私钥解密。请看以下大屏幕:
    在这里插入图片描述
    由乙方(可以理解为密钥对创建人),私钥自己保管,公钥向甲方开放。
    当甲方需要向乙方传输消息时,可以使用乙方提供的公钥进行加密,如此便可防止“偷窥者”干扰,进而避免敏感数据泄密。乙方收到消息后,可以使用自己保管的私钥进行解密,实现数据利用。

    3. 实际应用

    在我们实际应用场景中,大致分几步完成RSA的加密和解密。

    3.1 创建密钥对KeyPair
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    //初始化
    keyPairGenerator.initialize(1024);//RSA默认长度,推荐至少>=1024
    //获取密钥对
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    3.2 获取公钥publicKey
    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
    
    • 1
    3.3 获取私钥privateKey
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
    
    • 1
    3.4 加密
    public static String encrypt(String data, PublicKey publicKey) throws Exception {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            int inputLen = data.getBytes().length;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int offset = 0;
            byte[] cache;
            int i = 0;
            // 对数据分段加密
            while (inputLen - offset > 0) {
                if (inputLen - offset > 117) {
                    cache = cipher.doFinal(data.getBytes(), offset, 117);
                } else {
                    cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset);
                }
                out.write(cache, 0, cache.length);
                i++;
                offset = i * 117;
            }
            byte[] encryptedData = out.toByteArray();
            out.close();
            // 加密后的字符串,并以UTF-8为标准转化成字符串
            return new String(Base64.encodeBase64Str(encryptedData));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    3.5 解密
    public static String decrypt(String data, PrivateKey privateKey) throws Exception {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] dataBytes = Base64.decode(data);
            int inputLen = dataBytes.length;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int offset = 0;
            byte[] cache;
            int i = 0;
            // 对数据分段解密
            while (inputLen - offset > 0) {
                if (inputLen - offset > 128) {
                    cache = cipher.doFinal(dataBytes, offset, 128);
                } else {
                    cache = cipher.doFinal(dataBytes, offset, inputLen - offset);
                }
                out.write(cache, 0, cache.length);
                i++;
                offset = i * 128;
            }
            byte[] decryptedData = out.toByteArray();
            out.close();
            // 解密后的内容 
            return new String(decryptedData, "UTF-8");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    综上,关于如何使用RSA加密算法进行数据传输,已完成相关介绍,希望有助于各位盆友理解并学会如何使用它。


    结语

    通过以上叙述,期望各位盆友可以一文学会如何使用RSA加密和解密。当然RSA绝技显然不止于此。让我们一步一步走向胜利,享受知识带来的快乐吧!GoodNight
    在这里插入图片描述

  • 相关阅读:
    接口测试用例设计
    工作中自我或者团队管理的几个有用工具
    LeetCode 0342. 4的幂
    大数据高级开发面试题总结及答案汇总之[Spark系列](持续更新中)
    测试Python读写xml配置文件(续)
    基于HASM模型的土壤高精度建模matlab仿真
    利用ros实现单片机通讯(转载)
    【初阶数据结构】树(tree)的基本概念——C语言
    【Python】批量下载素材酷视频资源
    信息学奥赛一本通-编程启蒙3097:练17.3 比大小
  • 原文地址:https://blog.csdn.net/splendid_java/article/details/134540044