/*
 * 密钥交换算法,即非对称加密算法
 * */
public class DHCoder
{
        //非对称加密算法
        public static final String KEY_ALGORITHM= "DH";
        //本地密钥算法,即对称加密算法
        public static final String SECRET_ALGORITHM= "AES";
        private  static final int KEY_SIZE=512;
        //公钥
        private static final String PUBLIC_KEY= "DHPublicKey";
        //私钥
        private static final String PRIVATE_KEY= "DHPrivateKey";
       
        //初始化甲方密钥
        public static Map<String,Object>
initKey() throws Exception{
               //密钥对生成器
              KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstanceKEY_ALGORITHM);
              keyPairGenerator.initialize( KEY_SIZE);
              KeyPair keyPair=keyPairGenerator.generateKeyPair();
              
               //甲方公钥
              DHPublicKey publicKey=(DHPublicKey)keyPair.getPublic();
               //甲方私钥
              DHPrivateKey privateKey=(DHPrivateKey)keyPair.getPrivate();
              
               //将密钥对存储在Map中
              Map<String,Object> keyMap= new HashMap<String,Object>(2);
              keyMap.put( PUBLIC_KEY,publicKey);
              keyMap.put( PRIVATE_KEY,privateKey);
               return keyMap;
       }
       
       
        //乙方密钥
        public static Map<String,Object>
initKey(byte[] key) throws Exception{
               //解析甲方公钥,转换公钥规范
              X509EncodedKeySpec x509KeySpec= new X509EncodedKeySpec(key);
              KeyFactory keyFactory=KeyFactory. getInstance(KEY_ALGORITHM);
               //产生甲方公钥
              PublicKey publicKey=keyFactory.generatePublic(x509KeySpec);
              
               //由甲方公钥构建乙方密钥对
              DHParameterSpec dhParamSpec=((DHPublicKey)publicKey).getParams();
              KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(keyFactory.getAlgorithm());
              keyPairGenerator.initialize(dhParamSpec);
              
               //产生密钥对
              KeyPair keyPair=keyPairGenerator.generateKeyPair();
               //乙方公钥
              DHPublicKey publicKey1=(DHPublicKey)keyPair.getPublic();
               //乙方私钥
              DHPrivateKey privateKey1=(DHPrivateKey)keyPair.getPrivate();
              
               //将密钥存储在Map中
              Map<String,Object> keyMap= new HashMap<String,Object>(2);
              keyMap.put( PRIVATE_KEY,
privateKey1);
              keyMap.put( PUBLIC_KEY,
publicKey1);
               return keyMap;
       }
       
       
        //加密
        public static byte[]
encrypt(byte[] data, byte[]
key) throws Exception, GeneralSecurityException{
               //生成本地密钥
              SecretKey secretKey= new SecretKeySpec(key, SECRET_ALGORITHM);
               //加密数据
              Cipher cipher=Cipher. getInstance(secretKey.getAlgorithm());
              cipher.init(Cipher. ENCRYPT_MODE,
secretKey);
               return cipher.doFinal(data);
       }
       
        //解密
        public static byte[]
decrypt(byte[] data, byte[]
key) throws Exception, NoSuchPaddingException{
               //生成本地密钥
              SecretKey secretKey= new SecretKeySpec(key, SECRET_ALGORITHM);
              Cipher cipher=Cipher. getInstance(secretKey.getAlgorithm());
              cipher.init(Cipher. DECRYPT_MODE,
secretKey);
               return cipher.doFinal(data);
       }
       
        //由公钥,私钥,构建本地密钥
        public static byte[]
getSecretKey(byte[] publicKey, byte[]
privateKey) throws Exception{
              KeyFactory keyFactory=KeyFactory. getInstance(KEY_ALGORITHM);
               //初始化公钥
              X509EncodedKeySpec x509EncodedKeySpec= new X509EncodedKeySpec(publicKey);
               //产生公钥
              PublicKey pubKey=keyFactory.generatePublic(x509EncodedKeySpec);
              
               //初始化私钥,密钥规范转换
              PKCS8EncodedKeySpec pkcs8KeySpec= new PKCS8EncodedKeySpec(privateKey);
               //产生私钥
              PrivateKey priKey=keyFactory.generatePrivate(pkcs8KeySpec);
              
               //实例化
              KeyAgreement keyAgree=KeyAgreement.getInstance(keyFactory.getAlgorithm());
              keyAgree.init(priKey);
              keyAgree.doPhase(pubKey, true);
              
               //生成本地密钥
              SecretKey secretKey=keyAgree.generateSecret( SECRET_ALGORITHM);
               return secretKey.getEncoded();
       }
       
        //取得私钥
        public static byte[]
getPrivateKey(Map<String,Object> keyMap){
              Key key=(Key)keyMap.get( PRIVATE_KEY);
               return key.getEncoded();
       }
        //取得公钥
        public static byte[]
getPublicKey(Map<String,Object> keyMap){
              Key key=(Key)keyMap.get( PUBLIC_KEY);
               return key.getEncoded();
       }
}

验证===
public class DHCoderTest
{

        //初始化密钥
        public final void initKey() throws Exception{

       }
       
        public static void main(String[]
args) throws Exception {
               // TODO Auto-generated
method stub
              
               /*
               * 需要关注,甲乙双方本地密钥是否相同;一方加密,另一方是否可以解密
               */     

               //甲方公钥
               byte[]
publicKey1;
               //甲方私钥
               byte[]
privateKey1;
               //甲方本地密钥
               byte[]
key1;
              
               //乙方公钥
               byte[]
publicKey2;
               //一方私钥
               byte[]
privateKey2;
               //一方本地密钥
               byte[]
key2;
              
               //生成甲方密钥对
              Map<String,Object> keyMap1=DHCoder. initKey();
              privateKey1=DHCoder. getPrivateKey(keyMap1);
              publicKey1=DHCoder. getPublicKey(keyMap1);
              System. out.println("甲方公钥:\n" +Base64.encodeBase64String (publicKey1));
              System. out.println("甲方私钥:\n" +Base64.encodeBase64String (privateKey1));
              
               //由甲方产生乙方密钥对
              Map<String,Object> keyMap2=DHCoder. initKey(publicKey1);
              publicKey2=DHCoder. getPublicKey(keyMap2);
              privateKey2=DHCoder. getPrivateKey(keyMap2);
              System. out.println("乙方公钥:\n" +Base64.encodeBase64String (publicKey2));
              System. out.println("乙方私钥:\n" +Base64.encodeBase64String (privateKey2));
              
               //甲方私钥,乙方公钥,构造本地密钥
              key1=DHCoder. getSecretKey(publicKey2, privateKey1);
              System. out.println("甲方本地密钥:\n" +Base64.encodeBase64String (key1));
              
               //乙方私钥,甲方公钥,构造本地密钥
              key2=DHCoder. getSecretKey(publicKey1, privateKey2);
              System. out.println("乙方本地密钥:\n" +Base64.encodeBase64String (key2));
              
               //校验
               assertArrayEquals(key1,key2);
       }

}

非对称加密--密钥交换算法DHCoder的更多相关文章

  1. 信息加密之非对称加密DH算法

    非对称加密算法是相对于对称加密算法来说的,对于对称加密算法请查阅之前的总结,今天为大家介绍一下DH算法,DH是一种密钥交换算法,接收方根据发送方加密时的密钥,生成接收方解密密钥.下面就一起来学习一下吧 ...

  2. Asp.Net 常用工具类之加密——非对称加密RSA算法

    踏入程序员这个行业也有几年了,几年中有收获(技术加强),有付出(时间和亚健康状态).当然喏,并不后悔,代码路还长!!! On The Way,永不止步!!! 开发过程中也积累了一些自己的经验.代码块和 ...

  3. 非对称加密RSA的应用及在C#中的实现

    quote: http://www.cnblogs.com/happinessCodes/archive/2010/07/27/1786404.html   一说到数据的加密,常常会涉及到这几个单词: ...

  4. Asp.Net 常用工具类之加密——对称加密DES算法(2)

    又到周末,下午博客园看了两篇文章,关于老跳和老赵的程序员生涯,不禁感叹漫漫程序路,何去何从兮! 转眼毕业的第三个年头,去过苏州,跑过上海,从一开始的凌云壮志,去年背起行囊默默回到了长沙准备买房,也想有 ...

  5. Java加密与解密笔记(三) 非对称加密

    非对称的特点是加密和解密时使用的是不同的钥匙.密钥分为公钥和私钥,用公钥加密的数据只能用私钥进行解密,反之亦然. 另外,密钥还可以用于数字签名.数字签名跟上文说的消息摘要是一个道理,通过一定方法对数据 ...

  6. 非对称加密RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法

          非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密:如果用私 ...

  7. 对称加密与非对称加密,及Hash算法

    一 , 概述 在现代密码学诞生以前,就已经有很多的加密方法了.例如,最古老的斯巴达加密棒,广泛应用于公元前7世纪的古希腊.16世纪意大利数学家卡尔达诺发明的栅格密码,基于单表代换的凯撒密码.猪圈密码, ...

  8. SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法

    本文转载自SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法 导语 作为一名安全爱好者,我一向很喜欢SSL(目前是TLS)的运作原理.理解这个复杂协议的基本原理花了我好几天的时间,但只要 ...

  9. 个人理解c#对称加密 非对称加密 散列算法的应用场景

    c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 ...

随机推荐

  1. codeforces 1042C Array Product【构造】

    题目:戳这里 题意:n个数,两种操作,第一种是a[i]*a[j],删掉a[i],第一种是直接删除a[i](只能用一次)剩下的数序列号不变.操作n-1次,使最后剩下的那个数最大化. 解题思路: 正数之间 ...

  2. hdu-1159 1087 1257(dp)

    本文就最长公共子序列,最长连续递增子序列的长度,最大连续递增子序列的值进行对比. hdu-1159: Common Subsequence Time Limit: 2000/1000 MS (Java ...

  3. Dockfile搭建极简LNMP环境

    最近才发现ThinkPHP6.0和CI4.x都要求php版本为7.1以上了,本机的php版本还停留在7.0.3x,又懒得升级,于是考虑使用Docker来运行一个lnmp环境. 常规环境搭建的方式有两种 ...

  4. XSS (跨站脚本攻击) 的原理分析,测试 && 应对措施

    1 1 1 XSS (跨站脚本攻击) 的原理分析,测试 1 demo: <!DOCTYPE html> <html lang="en"> <head& ...

  5. Chrome console & Command Line API

    Chrome console & Command Line API $ && $$ querySelector querySelectorAll Command Line AP ...

  6. 中英文混排网站排版指南 All In One

    中英文混排网站排版指南 All In One 排版 数字与单位 正确 5G 的下载速度可以达到 1Gbps,4G 为100Mbps 1Gbps === 1000Mbps 错误 5G的下载速度可以达到1 ...

  7. cnblogs 日期错乱 bug

    cnblogs 日期错乱 bug 时间错乱 bug archive/2004/01/13/ 什么鬼 呀默认时间戳 https://www.cnblogs.com/xgqfrms/archive/200 ...

  8. VSCode & SQL

    VSCode & SQL MySQL MySQL https://marketplace.visualstudio.com/items?itemName=formulahendry.vscod ...

  9. gitpod & free online ide

    gitpod & free online ide Dev Environments as Code for modern DevOps teams. https://www.gitpod.io ...

  10. OSS & Object Storage Service

    OSS & Object Storage Service Object Storage Service https://en.wikipedia.org/wiki/Object_storage ...