浅谈RSA加密算法
一、什么是非对称加密
1、加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密
2、密钥分为:公钥,私钥
公钥:可以对外给任何人的加密和解密的密码,是公开的
私钥:通过私钥可以生成公钥,但从公钥被认为无法生成公钥(被推导出的概率小到不考虑)
3、当将要加密的内容用公钥加密的时候,只能用私钥来解密
当将要加密的内容用私钥加密的时候,只能用公钥来解密
4、公钥与私钥的关系,利用一个简单的公式来生成公钥和私钥,即非对称加密的公钥和私钥之间存在某一个公式关系
5、常见的非对称加密算法
RSA,DSA
二、什么是RSA算法
/** * 通过指定的密钥长度生成非对称的密钥对 * @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);
相关知识:
作者:听着music睡
出处:http://www.cnblogs.com/xqxacm/
Android交流群:38197636
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。