浅谈RSA加密算法

一、什么是非对称加密

1、加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密

2、密钥分为:公钥,私钥

   公钥:可以对外给任何人的加密和解密的密码,是公开的

私钥:通过私钥可以生成公钥,但从公钥被认为无法生成公钥(被推导出的概率小到不考虑)

3、当将要加密的内容用公钥加密的时候,只能用私钥来解密

当将要加密的内容用私钥加密的时候,只能用公钥来解密

4、公钥与私钥的关系,利用一个简单的公式来生成公钥和私钥,即非对称加密的公钥和私钥之间存在某一个公式关系

5、常见的非对称加密算法

  RSA,DSA

二、什么是RSA算法

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

RSA的算法涉及三个参数,n、e1、e2。

其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。[1]

RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)

e1和e2可以互换使用,即:

A=B^e1 mod n;B=A^e2 mod n;

三、RSA加密算法的使用

1、RSA密钥的生成,返回一个KeyPair对象

KeyPair 用于非对称加密,KeyPair中包含了一个公钥和一个私钥

    /**
     * 通过指定的密钥长度生成非对称的密钥对
     * @param keySize  推荐使用1024,2048 ,不允许低于1024
     * @return
     */
    public static KeyPair generateRSAKeyPair(int keySize){
        KeyPair ret = null;
        try {
            //1、准备生成
            KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
            //2、初始化,设置秘钥长度
            generator.initialize(keySize);
            //3、生成,并且返回
            ret = generator.generateKeyPair();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return ret;
    }

2、获取私钥和公钥

PublicKey 和 PrivateKey 都是Key类型的

     KeyPair keyPair = EncryptUtil.generateRSAKeyPair(1024);
        //获取公钥,可以给任何人
        PublicKey publicKey = keyPair.getPublic();     //获取私钥
        PrivateKey privateKey = keyPair.getPrivate();

3、RSA加密

/**
     *  RSA 加密
     * @param data  需要加密的数据
     * @param key  可以是 PublicKey,也可以是PrivateKey
     * @return
     */
    public static byte[] rsaEncrypt(byte[] data ,Key key){
        byte[] ret = null;
        if (data != null
                && data.length>0
                && key!=null) {
            // 1、创建Cipher 使用RSA
            try {
                Cipher cipher = Cipher.getInstance("RSA");
                //设置Key
                cipher.init(Cipher.ENCRYPT_MODE,key);
                ret = cipher.doFinal(data);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            }
        }
        return ret;
    }

4、RSA解密

/**
     *  RSA 解密
     * @param data 要解密的数据
     * @param key  可以是 PublicKey,也可以是PrivateKey
     * @return
     */
    public static byte[] rsaDecrypt(byte[] data ,Key key){
        byte[] ret = null;

        if (data != null
                && data.length>0
                && key!=null) {
            // 1、创建Cipher 使用RSA
            try {
                Cipher cipher = Cipher.getInstance("RSA");
                //设置Key
                cipher.init(Cipher.DECRYPT_MODE,key);
                ret = cipher.doFinal(data);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            }
        }
        return ret;
    }

5、公钥与私钥的存储

一对公钥和私钥创建好之后,我们需要存储起来以后使用

    //获得公钥 私钥
        PrivateKey privateKey = keyPair.getPrivate();
        PublicKey publicKey = keyPair.getPublic();
        //编码将PublicKey和PrivateKey对象转换为字节数组,该字节数组为公钥、私钥的实际数据
        byte[] publicKeyEncoded = publicKey.getEncoded();
        byte[] privateKeyEncoded = privateKey.getEncoded();     //将字节数组通过Base64编码算法 编码成可见的字符形式
        String publickey = Base64.encodeToString(publicKeyEncoded, Base64.NO_WRAP);
        String privatekey = Base64.encodeToString(privateKeyEncoded, Base64.NO_WRAP);     //进行存储操作     。。。。

6、公钥与私钥的加载

通常 1、获取密钥对 2、获取公钥、私钥 3、保存公钥、私钥,保存形式基本为字符串形式

那么在以后的使用中就需要获取公钥和私钥来使用

需要知道:

  6.1、KeyFactory可以来加载相应的公钥和私钥

  6.2、公钥加载 使用 X509EncodedKeySpec(byte[])

  6.3、私钥加载 使用 PCKS8EncodedKeySpec(byte[])

//获取公钥
//str_publickey 为公钥字符串形式数据(公钥先编码成byte[] 在 形成字符串)
//解码
            byte[] publicdecode = Base64.decode(new String(str_publickey), Base64.NO_WRAP);
            //构造X509EncodedKeySpec对象
            X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicdecode);
            //指定加密算法
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            //取得公钥
            PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
//解码//获取私钥//str_private 为私钥字符串形式的数据
            byte[] privatedecode = Base64.decode(new String(str_private), Base64.NO_WRAP);
            //构造X509EncodedKeySpec对象
            PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privatedecode);
            //指定加密算法
            keyFactory = KeyFactory.getInstance("RSA");
            //取得私钥
            PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);

相关知识:

浅谈DES加密算法

时间: 2024-10-19 10:22:55

浅谈RSA加密算法的相关文章

浅谈DES加密算法

一.DES加密算法介绍 1.要求密钥必须是8个字节,即64bit长度 2.因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用 3.加密.解密都需要通过字节数组作为数据和密钥进行处理 二.对称加密 DES加密算法属于对称加密. 即利用指定的密钥,按照密码的长度截取数据,分成数据块,和密钥进行复杂的移位.算数运算或者数据处理等操作,形成只有特定的密码才能够解开的数据. 加密与解密用的是同一个密钥 三.相关类 1.Cipher: Java/Android要

(转)浅谈MD5加密算法中的加盐值(SALT)

我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就是加点“佐料”.其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列.而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确. 这里的“佐料”被称作“Salt值”,这个值是由系统随机生成的,并且只有系统

Web应用你加盐了吗?——浅谈MD5加密算法中的加盐值(SALT)

转自:http://blog.csdn.net/blade2001/article/details/6341078 我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就是加点“佐料”.其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列.而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后

浅谈加密算法

前言 数字签名.信息加密 是前后端开发都经常需要使用到的技术,应用场景包括了用户登入.交易.信息通讯.oauth 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的 签名加密算法 来达到业务目标.这里简单的给大家介绍几种常见的签名加密算法和一些典型场景下的应用.正文1. 数字签名 数字签名,简单来说就是通过提供 可鉴别 的 数字信息 验证 自身身份 的一种方式.一套 数字签名 通常定义两种 互补 的运算,一个用于 签名,另一个用于 验证.分别由 发送者 持有能够 代表自己

浅谈常见的七种加密算法及实现

前言 数字签名.信息加密 是前后端开发都经常需要使用到的技术,应用场景包括了用户登入.交易.信息通讯.oauth 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的 签名加密算法 来达到业务目标.这里简单的给大家介绍几种常见的签名加密算法和一些典型场景下的应用. 正文 1. 数字签名 数字签名,简单来说就是通过提供 可鉴别 的 数字信息 验证 自身身份 的一种方式.一套 数字签名 通常定义两种 互补 的运算,一个用于 签名,另一个用于 验证.分别由 发送者 持有能够 代表

浅谈IM软件业务知识——非对称加密,银行U盾的原理

概述 首先了解一下相关概念:RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数论:将两个大素数相乘非常容易,但要对这个乘积的结果进行 因式分解却非常困难,因此可以把乘积公开作为公钥,该算法能够抵抗目前已知的所有密码攻击.RSA算法是一种非对称算法,算法需要一对密钥,使用其中一个 加密,需要使用另外一个才能解密.我们在进行RSA加密通讯时,就把公钥放在客户端,私钥留在服务器. RSA非对称加密算法,可以验

[转]浅谈https\ssl\数字证书

浅谈https\ssl\数字证书 http://www.cnblogs.com/P_Chou/archive/2010/12/27/https-ssl-certification.html 全球可信的SSL数字证书申请:http://www.shuzizhengshu.com 在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了.本文追本溯源围绕这个模式谈一谈. 名词解释 首先解释一下上面的几个名词: https:在http(超文本传输协议)基础上提出的

浅谈信息加密技术和算法

1单向散列加密 单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,不可逆的.常用的单向散列算法有MD5,SHA等. 比如网站中,用户密码,一般可以进行MD5加密后保存,用户登录时,对用户输出的密码进行加密后和数据库密文进行比较,如果一致,则验证成功. 为了加强计算的安全性,可以对数据加上密钥,增加破解的难度. 推荐使用 apache common的 commons-codec的 jar包 比如(commons-codec-1.8.jar)    

浅谈IM软件怎样建立安全socket连接、登录

----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------------------------------------------------使用状态机来保持在线状态 [点击]                      拼图算法,将零碎小图,整理到一张大图上[点击]登录导航 [点击]