RSA加密原理与实战代码解析
一、概述1.RSA算法的核心原理, 实际上就是依赖于那种大整数分解起来特别困难的技术难题, 而且现在各种大家都常用的编程语言, 基本上全都支持把这个RSA给实现出来。2.java6支持RSA算法3.RSA这个算法, 它是可以用来对数据进行加密处理的, 同时呢, 它也是能够用于实现数字签名功能的。4.相对于DES和AES这些对称加密算法来说, RSA算法的运行速度是存在一个差距的, 它的速度要明显慢许多。5.总的原则就是, 公钥负责加密而私钥负责解密, 或者是用私钥进行加密然后用公钥来解密。二、模型分析搭建那叫做 RSA 的算法来生成密钥对, 这过程真的是相当的简便, 在此处咱还是照旧, 就拿甲方和乙方这两个角色互发信号、递送信件的情形当作案例来做比方。1.甲方在本地的环境中去构建密钥对。所谓的密钥对,包括公钥和私钥这两个部分。接着甲方要把这个公钥向乙方进行公布。2.甲方会使用这个私钥去对数据进行加密处理, 完成之后, 再将加密过的数据发送给乙方。3.乙方使用由甲方所提供的公钥, 来对数据进行解密的操作。就是当乙方需要向甲方发送数据, 也就是说, 在乙方向甲方传递信息这种情况下。4.乙方这边先拿着公钥, 把数据进行一通加密操作, 接着才把处理好的数据传送给甲方。5.甲方用私钥进行解密, 对那个数据执行了解密操作。三、这段代码的具体分析内容。package com.ca.test;import java.security.Key;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map;import javax.crypto.Cipher;import javax.crypto.interfaces.DHPrivateKey;import javax.crypto.interfaces.DHPublicKey;import org.apache.commons.codec.binary.Base64;/*** 非对称加密算法RSA算法组件* 非对称算法一般是用来传送对称加密算法的密钥来使用的相对于DH算法RSA算法只需要一方构造密钥不需要* 大费周章的构造各自本地的密钥对了。DH算法只能算法非对称算法的底层实现。而RSA算法算法实现起来较为简单* author kongqz* */public class RSACoder {//非对称密钥算法public static final String KEY_ALGORITHMRSA;/*** 密钥长度DH算法的默认密钥长度是1024* 密钥长度必须是64的倍数在512到65536位之间* */private static final int KEY_SIZE512;//公钥private static final String PUBLIC_KEYRSAPublicKey;//私钥private static final String PRIVATE_KEYRSAPrivateKey;/*** 初始化密钥对* return Map 甲方密钥的Map* */public static Map initKey() throws Exception{//实例化密钥生成器KeyPairGenerator keyPairGeneratorKeyPairGenerator.getInstance(KEY_ALGORITHM);//初始化密钥生成器keyPairGenerator.initialize(KEY_SIZE);//生成密钥对KeyPair keyPairkeyPairGenerator.generateKeyPair();//甲方公钥RSAPublicKey publicKey(RSAPublicKey) keyPair.getPublic();//甲方私钥RSAPrivateKey privateKey(RSAPrivateKey) keyPair.getPrivate();//将密钥存储在map中Map keyMapnew HashMap();keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}/*** 私钥加密* param data待加密数据* param key 密钥* return byte[] 加密数据* */public static byte[] encryptByPrivateKey(byte[] data,byte[] key) throws Exception{//取得私钥PKCS8EncodedKeySpec pkcs8KeySpecnew PKCS8EncodedKeySpec(key);KeyFactory keyFactoryKeyFactory.getInstance(KEY_ALGORITHM);//生成私钥PrivateKey privateKeykeyFactory.generatePrivate(pkcs8KeySpec);//数据加密Cipher cipherCipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 公钥加密* param data待加密数据* param key 密钥* return byte[] 加密数据* */public static byte[] encryptByPublicKey(byte[] data,byte[] key) throws Exception{//实例化密钥工厂KeyFactory keyFactoryKeyFactory.getInstance(KEY_ALGORITHM);//初始化公钥//密钥材料转换X509EncodedKeySpec x509KeySpecnew X509EncodedKeySpec(key);//产生公钥PublicKey pubKeykeyFactory.generatePublic(x509KeySpec);//数据加密Cipher cipherCipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, pubKey);return cipher.doFinal(data);}/*** 私钥解密* param data 待解密数据* param key 密钥* return byte[] 解密数据* */public static byte[] decryptByPrivateKey(byte[] data,byte[] key) throws Exception{//取得私钥PKCS8EncodedKeySpec pkcs8KeySpecnew PKCS8EncodedKeySpec(key);KeyFactory keyFactoryKeyFactory.getInstance(KEY_ALGORITHM);//生成私钥PrivateKey privateKeykeyFactory.generatePrivate(pkcs8KeySpec);//数据解密Cipher cipherCipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 公钥解密* param data 待解密数据* param key 密钥* return byte[] 解密数据* */public static byte[] decryptByPublicKey(byte[] data,byte[] key) throws Exception{//实例化密钥工厂KeyFactory keyFactoryKeyFactory.getInstance(KEY_ALGORITHM);//初始化公钥//密钥材料转换X509EncodedKeySpec x509KeySpecnew X509EncodedKeySpec(key);//产生公钥PublicKey pubKeykeyFactory.generatePublic(x509KeySpec);//数据解密Cipher cipherCipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, pubKey);return cipher.doFinal(data);}/*** 取得私钥* param keyMap 密钥map* return byte[] 私钥* */public static byte[] getPrivateKey(Map keyMap){Key key(Key)keyMap.get(PRIVATE_KEY);return key.getEncoded();}/*** 取得公钥* param keyMap 密钥map* return byte[] 公钥* */public static byte[] getPublicKey(Map keyMap) throws Exception{Key key(Key) keyMap.get(PUBLIC_KEY);return key.getEncoded();}/*** param args* throws Exception*/public static void main(String[] args) throws Exception {//初始化密钥//生成密钥对Map keyMapRSACoder.initKey();//公钥byte[] publicKeyRSACoder.getPublicKey(keyMap);//私钥byte[] privateKeyRSACoder.getPrivateKey(keyMap);System.out.println(公钥/nBase64.encodeBase64String(publicKey));System.out.println(私钥/nBase64.encodeBase64String(privateKey));System.out.println(密钥对构造完毕,甲方将公钥公布给乙方开始进行加密数据的传输);String strRSA密码交换算法;System.out.println(/n甲方向乙方发送加密数据);System.out.println(原文:str);//甲方进行数据的加密byte[] code1RSACoder.encryptByPrivateKey(str.getBytes(), privateKey);System.out.println(加密后的数据Base64.encodeBase64String(code1));System.out.println(乙方使用甲方提供的公钥对数据进行解密);//乙方进行数据的解密byte[] decode1RSACoder.decryptByPublicKey(code1, publicKey);System.out.println(乙方解密后的数据new String(decode1)/n/n);System.out.println(反向进行操作乙方向甲方发送数据/n/n);str乙方向甲方发送数据RSA算法;System.out.println(原文:str);//乙方使用公钥对数据进行加密byte[] code2RSACoder.encryptByPublicKey(str.getBytes(), publicKey);System.out.println(乙方使用公钥对数据进行加密);System.out.println(加密后的数据Base64.encodeBase64String(code2));System.out.println(乙方将数据传送给甲方);System.out.println(甲方使用私钥对数据进行解密);//甲方使用私钥对数据进行解密byte[] decode2RSACoder.decryptByPrivateKey(code2, privateKey);System.out.println(甲方解密后的数据new String(decode2));}}控制台输出公钥MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAM0qceVm4pyBbCBuM4jRxOYsxWkylLXVklyWp3JNs71B6vLVg2Iwh6TwPbpXbGWOI11RMLhe5bwLpdeBqP4f4MCAwEAAQ私钥MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAzSpz55WbinIFsIG4ziNHE5izFaTKUtdWSXJanck2zvUHq8tWDYjCHpPA9uldsZY4jXVEwuF7lvAul14Go/h/gwIDAQABAkByhW3pKSOHZhoy6lYkCqEUGTptrGybTUQG/2QBi12iqzenm7rKlasjdMEr6Q8RX5RpGArzvhvLepAPqPZ5LXjRAiEA7vI8/9HHrZSbHQ4Up7xby7bOULknoRjZy68HRMPRSXUCIQDbzwQfvrYNqLiauTcNsg6ejCJwcxSCLlJupgwBBjyOFwIgVEbWIviPr/ZpGz9bI6o4ykoozKnxg01ri/6o1qUmTP0CIQDBC0XO73oJ8vT2BdZA8/D884vHgHoxfqcswC3otGZ4TwIhANGXz8GHxM0zuOg8pds54S1ARlrkUXFULocVZ2KangFf密钥对构造完毕,甲方将公钥公布给乙方开始进行加密数据的传输甲方向乙方发送加密数据原文:RSA密码交换算法加密后的数据kF3vekz0DpJmLzwdrWjfZLyGBWsKzFOwm8im85KZr6QA49csvCl9KgsfjSVLuXwgsPrFoEhkiqQ0VApr001A乙方使用甲方提供的公钥对数据进行解密乙方解密后的数据RSA密码交换算法反向进行操作乙方向甲方发送数据原文:乙方向甲方发送数据RSA算法乙方使用公钥对数据进行加密加密后的数据xM1MB3DlDKRwSozf9z8YQlftrWpKT8lkabi17cN/ZLOEkOO8jVLKVAjpjsMwtJMcpHTjntdkHKOms1V8xbh3og乙方将数据传送给甲方甲方使用私钥对数据进行解密甲方解密后的数据乙方向甲方发送数据RSA算法四、总结1.RSA算法和DH算法是不一样的, 它并不需要两把钥匙, 只需要一套密钥就可以完成加密和解密的任务。2.我们可以看到, 在代码里面能够显示出公钥的长度是非常明显地小于私钥的长度的。3.在操作的过程中, 我们必须要严格遵照公钥负责加密而私钥负责解密, 同时私钥也能够进行加密并利用公钥来完成解密的这一套基本原则来进行。4.对于公钥和私钥这两个东西而言, 其本质属性一定是存在着完全不一样的差异的。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →