/*
 * 密钥交换算法,即非对称加密算法
 * */
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. hihocoder 1631

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are many homeless cats in PKU campus. They are all happy ...

  2. 全方位构造免杀 webshell 小结[一]

    转载自https://klionsec.github.io/2017/10/11/bypasswaf-for-webshell/   全方位构造免杀 webshell 小结[一]   前言:    本 ...

  3. 痞子衡嵌入式:我的博文总量终于追平了jicheng0622

    自打2016年10月选定清爽又复古的博客园平台作为痞子衡的个人博客主战场之后,痞子衡就一直坚持在博客园首发原创技术文章,然后再同步到其他平台(CSDN,知乎,微信公众号...),在坚持更文近四年半(2 ...

  4. after upgrade macOS Catalina bugs

    after upgrade macOS Catalina bugs 升级了macOS catalina后,碰到的 bugs? macOS 10.15.5 https://www.apple.com/m ...

  5. HTML5 Canvas in Action

    HTML5 Canvas in Action canvas 图片处理 视频编辑工具 xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  6. 2020 NGK 全球启动大会于美国硅谷圆满落幕

    据NCC报道美国西海岸时间11月25日,NGK全球启动大会在美国加利福尼亚北部的硅谷会展中心成功举办.本次大会吸引了来自世界各地的企业家.创业者.开发者,以及投资人达一万人次齐聚硅谷. NGK创始人. ...

  7. Python学习笔记_购物车案例

    goods_dic = { "iphone":6000, "ipad":3000, "T-shirt":100, "coffee& ...

  8. css中的transform,transition,translate的关系

    transform 旋转(transform是没有动画效果,你改变了它的值,元素的样子就唰的改变了.其中的位移的函数名就叫translate,所以说,translate是transform的一部分.) ...

  9. 力扣1052. 爱生气的书店老板-C语言实现-中等难度

    题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...

  10. Spring Security 实战干货:OAuth2登录获取Token的核心逻辑

    1. 前言 在上一篇Spring Security 实战干货:OAuth2授权回调的核心认证流程中,我们讲了当第三方同意授权后会调用redirectUri发送回执给我们的服务器.我们的服务器拿到一个中 ...