/*
 * 密钥交换算法,即非对称加密算法
 * */
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. Python——Django框架——django-simple-captcha(验证码)

    一.引用 包 pip install django-simple-captcha 二.将captcha加入setting的 INSTALLED_APPS 三.运行python manager.py m ...

  2. spark mllib als 参数

    在一定范围内按照排列组合方式对rank,iterations,lambda进行交叉评估(根据均方根误差),找到最小误差的组合,用于建立矩阵分解模型.Signature: ALS.train( rati ...

  3. 关于虚继承的sizeof问题

    首先关于虚继承和普通继承的知识,我总结一下: 1.普通继承时,无论派生类是否定义新的虚函数,基类和派生类总是共享一个虚函数表,不需要另加指向虚函数的指针,派生类只是将虚函数表中的元素改成了派生类的地址 ...

  4. ROM、SDRAM、RAM、DRAM、SRAM、FLASH的区别

    ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是 ...

  5. mark::开源绘图工具graphviz

    http://blog.csdn.net/iamljj/article/details/5862930 http://codeforces.com/contest/601/problem/D

  6. Nginx环境下,PHP下载,中文文件,下载失效(英文可以下载)怎么解决呢?

    参考出处: http://www.imooc.com/qadetail/76393 Nginx环境下,PHP下载,中文文件,下载失效(英文可以下载)怎么解决呢? 背景介绍: 文件名  为英文时可以下载 ...

  7. 从长度为 M 的无序数组中,找出N个最小的数

    从长度为 M 的无序数组中,找出 N个最小的数 在一组长度为 n 的无序的数组中,取最小的 m个数(m < n), 要求时间复杂度 O(m * n) 网易有道面试题 const minTopK ...

  8. js regular expression & email checker

    js regular expression & email checker const isValidEmail = (email = ``) => /^([\w+\.])+@(\w+) ...

  9. Versatile Python 3.x

    Versatile Python 3.x TryPython Python 3.8.0 (default, Nov 14 2019, 22:29:45) [GCC 5.4.0 20160609] on ...

  10. flatbuffer与protobuf对比

    在内存空间占用这个指标上,FlatBuffers占用的内存空间比protobuf多了两倍.序列化时二者的cpu计算时间FB比PB快了3000ms左右,反序列化时二者的cpu计算时间FB比PB快了900 ...