/*
 * 密钥交换算法,即非对称加密算法
 * */
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. git操作是出现Username for 'https://github.com':的验证问题

    Username for 'https://github.com': 输入的是github上的邮箱账号, 而不是github中设置的username, 这是个巨坑!!!Password for 'ht ...

  2. 渗透技巧——如何逃逸Linux的受限制shell执行任意命令

    导语:本文介绍了如何在受限制的shell中执行任意命令,实现交互.其相应的利用场景是说当我们通过一些手段拿到当前Linux机器的shell时,由于当前shell的限制,很多命令不能执行,导致后续的渗透 ...

  3. JavaScript var, let, const difference All In One

    JavaScript var, let, const difference All In One js var, let, const 区别 All In One 是否存在 hoisting var ...

  4. virtual whiteboard

    virtual whiteboard 虚拟白板 / canvas https://twitter.com/excalidraw https://excalidraw.com/ https://gith ...

  5. how to create a ring progress bar in web skills

    how to create a ring progress bar in web skills ring progress bar & circle progress bar canvas j ...

  6. V8 & ECMAScript & ES-Next

    V8 & ECMAScript & ES-Next ES6, ES7, ES8, ES9, ES10, ES11, ES2015, ES2016, ES2017, ES2018, ES ...

  7. Event Bus & Event Emitter

    Event Bus & Event Emitter Event Bus https://code.luasoftware.com/tutorials/vuejs/parent-call-chi ...

  8. webassembly & google

    webassembly & google https://developers.google.com/web/updates/2018/08/wasm-av1 https://develope ...

  9. SPC空投火爆来袭!区块链技术落地加速!

    经历市场狂热后,区块链逐渐恢复合理性,在政策红利.技术等多力推进下,各行各业开始涌入区块链行业.在这波浪潮中,SPC侧链代币项目显得格外亮眼,其空投已经发放至第二轮,仅SPC空投月收益就达23%左右, ...

  10. 10月份上线的NGK有什么不同之处?

    近日,有小道消息传出公链项目NGK即将在10月上线的消息.各大社区纷纷开始布局,市场中关于NGK项目的消息也变得更多了起来.仅是社区热度这一点,对比之下就已经优于很多项目,那么是否还有其他优势呢?让我 ...