引入:

在我们的博客:http://supercharles888.blog.51cto.com/609344/1313864中可以看到,对于加密解密,最重要的是密码,因为从加密方式上来看,有对称加密和非对称加密,所以我们这里就用java的例子来说明,如何使用java security的API 来创造一个符合我们要求的密码。

实践:


从类角度上来说,因为对称加密,非对称加密都会用到密钥,所以顶层接口是Key(密钥因为经常要传输给对方,所以它一定是可序列化的),而对称加密来说,使用的是SecretKey,它继承自Key接口,而对于非对称加密来说,它会使用到PublicKey接口和PrivateKey接口,而且总是成对出现的,所以他们都封装在KeyPair类中:


其核心接口,类关系如下:



对称加密

对于对称加密来说,加密的密码和解密的密码是同一个,而比较经典的对称加密算法是DES,我们这里也用DES为例子,一般来说,要生成一个用于对称加密的密钥,我们做以下几步:

(1)实例化SecureRandom对象,让它产生一个安全随机数

(2)实例化KeyGenerator对象,它会负责产生一个半成品密钥

(3)初始化KeyGenerator,并调用generateKey()方法让其产生一个密钥(注意:这里的密钥不是最终的密钥,而是半成品,相当于做钥匙的铜片)

(4)将半成品密钥转为字节数组

(5)获取对称加密的密钥规范XXXKeySpec,比如DES,AES等,它决定密钥最终长什么样子,它相当于配钥匙时候使用的模具

(6)实例化SecureKeyFactory对象,它负责产生一个最终密钥

(7)调用SecureKeyFactorygenerateSecret()方法产生一个最终密钥,从参数可以看出来,就是铜片和模具的组合,最终才能产生一个我们需要的纹路的钥匙。

代码如下,可直接使用:

/**/
package com.charles.keystudy;
import java.security.Key;
import java.security.SecureRandom;
import java.util.Map;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
/**** Description:这个工具类专门来生成对称的密钥** @author charles.wang* @created Oct 24, 2013 5:07:41 PM**/
public class SymmetricKeyUtil {public static Key generateSecretKey() throws Exception {//实例化SecureRandom对象,这个对象作为安全的随机数生成器SecureRandom secureRandom = new SecureRandom();//实例化KeyGenerator对象,这个对象专门用来产生对称的密钥KeyGenerator kg = KeyGenerator.getInstance("DES");//初始化密钥产生器kg.init(secureRandom);//产生对称的密钥SecretKey secretKey = kg.generateKey();//获得密钥的字节数组byte[] secretKeyBytes = secretKey.getEncoded();//获得密钥规范, 比如说"DES"DESKeySpec dks =  new DESKeySpec(secretKeyBytes);//实例化SecureKeyFactory对象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");//生成对称的密钥SecretKey finalSecretKey = keyFactory.generateSecret(dks);return finalSecretKey;}
}

非对称加密:

对于非对称加密来说,加密的密码和解密的密码是两个密码(公钥加密则私钥解密,私钥加密则公钥解密),而比较经典的对称加密算法是RSA,我们这里也用RSA为例子,一般来说,要生成一个用于非对称加密的公钥私钥对,我们做以下几步:

(1)实例化KeyPairGenerator对象,它会负责产生一个半成品公钥私钥对

(2)初始化KeyPairGenerator,用希望的密钥长度作为参数

(3)调用KeyPairGeneratorgenerateKeyPair()方法产生半成品的公钥私钥对

(4)将半成品公钥私钥对转为字节数组

(5)获取非对称加密的密钥规范XXXKeySpec,对于RSA来说,一般公钥用X.509,私钥用PKCS#8

(6)实例化KeyFactory对象,它负责产生最终公钥私钥对

(7)调用KeyFactorygeneratePublic()方法产生最终公钥,generatePrivate()方法产生最终私钥

代码如下,可直接使用:

package com.charles.keystudy;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
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 sun.misc.BASE64Encoder;
/**** Description: 这个工具类专门来生成非对称的密钥(分为公钥和私钥)** @author charles.wang* @created Oct 24, 2013 12:02:30 PM**/
public class AsymmetricKeyUtil {/**** @return* @throws Exception*/public static Map<String, Key> generatePublicPrivateKeyPair() throws Exception {// KeyPairGenerator这个密钥对生成器是用来生成非对称的公钥的KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");// 初始化密钥生成器,用密钥的位数作为参数keyPairGenerator.initialize(1024);// 产生公钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();// 甲方公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();// 甲方私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();// 获得公钥的字节数组byte[] publicKeyBytes = publicKey.getEncoded();// 获得公钥的密钥规范 ,publicKey是用X.509编码的X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);// 获得私钥的字节数组byte[] privateKeyBytes = privateKey.getEncoded();// 获得私钥的密钥规范,privateKey是用PKCS#8规范编码的PKCS8EncodedKeySpec privatePKC8ENcodedKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);// 实例化密钥工厂KeyFactory keyFactory = KeyFactory.getInstance("RSA");// 生成公钥,它是通过密钥工厂将公钥字节数组转为公钥对象Key publicKeyValue = keyFactory.generatePublic(publicKeySpec);// 生成私钥,它是通过密钥工厂将私钥字节数组转为私钥对象Key privateKeyValue = keyFactory.generatePrivate(privatePKC8ENcodedKeySpec);Map<String, Key> finalKeyPair = new HashMap<String, Key>();finalKeyPair.put("publicKey", publicKeyValue);finalKeyPair.put("privateKey", privateKeyValue);return finalKeyPair;}}

最后,交给用户使用的时候,应该是一个经过Base64编码的,我们很容易就可以做到这一点,这里附上我们的测试代码:

/**/
package com.charles.keystudy;
import java.security.Key;
import java.util.Map;
import sun.misc.BASE64Encoder;
/**** Description: 演示类,用于演示用法** @author charles.wang* @created Oct 24, 2013 5:02:36 PM**/
public class KeyDemo {/*** 把产生的密钥转为Base64编码的格式* @param key* @return* @throws Exception*/public static String getKeyString(Key key) throws Exception{byte[] keyBytes = key.getEncoded();String s = (new BASE64Encoder()).encode(keyBytes);return s;}public static void main(String[] args) throws Exception{//演示对称密钥的产生 过程System.out.println("演示对称密钥的产生 过程");Key secretKey = SymmetricKeyUtil.generateSecretKey();System.out.println("Format:"+secretKey.getFormat());System.out.println("secretKey:"+getKeyString(secretKey) );System.out.println();//演示非对称密钥的产生过程System.out.println("演示非对称密钥的产生过程");Map<String,Key> keyPair = AsymmetricKeyUtil.generatePublicPrivateKeyPair();for( String s :keyPair.keySet()){System.out.println(s+"Format:"+keyPair.get(s).getFormat());;System.out.println(s+":"+getKeyString(keyPair.get(s)) );System.out.println();}}
}

最后我们执行来观察结果,果然对称加密会生成一个密钥,而非对称加密会生成公钥私钥对:

转载于:https://blog.51cto.com/supercharles888/1314607

密码学研究-玩转密钥相关推荐

  1. 在密码学研究方面不断创新突破—— 女密码学家的成功密码

    随着信息技术的大规模应用和数字经济的加速发展,密码学的重要性日益凸显.近年来,一位土生土长的中国女密码学家备受瞩目,她就是荣获2019年未来科学大奖的首位女科学家,清华大学和山东大学双聘教授王小云. ...

  2. 计算机信息安全密码学研究,密码学是对信息安全各方面的研究,能够解决所有信息安全的问题。() - 试题答案网问答...

    相关题目与解析 密码学作为信息安全的关键技术,其安全目标主要包括三个非常重要的方面:保密性.完整性和可用性.()是指所有资源只能由授权方式以授权的方式进行修改,即信息未经授权不能进行改变的特性. 密码 ...

  3. 密码学研究-加密解密

    引入: 现在我们来研究密码学的加密解密过程,这个十分重要,因为它是明文到密文的桥梁,从类型上分,我们又分为加密解密字符串和加密解密文件,我们这文章就讲解这些细节,主要的核心类是Cipher类. 实践: ...

  4. 密码学笔记5 非对称密钥算法

    一.引 1976年麻省理工学院数学系毕业的W.Diffie 和M. Hellman等人发表了<密码这新方向>(New Directions in Cryptography),该论文提出加密 ...

  5. 密码学研究-Provider

    引入: Provider 是研究密码学的第一步,它表示了对于JAVA安全框架的一种实现.对于JDK,它有许多默认的实现,当然了,你也可以不满意其默认的实现,而使用第三方或者自己根据API 开发SPI ...

  6. 密码学研究-数字签名

    引入: 提到签名,大家都不陌生,大家知道,重大的文件一般都要领导签名,来确保这个文件的真实有效.而一些比较重要的合同,比如买房的购房合同,都要盖"骑缝章",这个骑缝章,就是盖在2页 ...

  7. 密码学研究-密钥长度限制

    引入: 在我们加密解密过程中,因为我上次在维基百科上看到一篇文章http://en.wikipedia.org/wiki/Advanced_Encryption_Standard说,AES的加密方式支 ...

  8. 密码学之ElGamal 数字签名 密钥产生 数字签名 验证 python实现

    ElGamal 数字签名 实验目的 通过实验了解数字签名的过程(签名过程和认证过程),掌握 ElGamal签名方案. 实验原理 ElGamal 数字签名的实现过程 1密钥产生:Alice 要对一个消息 ...

  9. 常用MD5解密工具,仅限于密码学研究

    http://www.pdtools.net/tools/md5.jsp https://www.cmd5.com/收费的 https://www.somd5.com/免费的

最新文章

  1. jq 修改swal的标题_js-jquery-SweetAlert【一】使用
  2. Oracle中,如何查看FRA(Flashback Recovery Area)的利用率
  3. 数据结构:O(nlogn)算法
  4. python的setting怎么找_python-DJANGO_SETTINGS_MODULE如何配置
  5. Spring Boot配置文件application.properties
  6. 米家小白增强固件_中考体育:男1000米/女800米想拿满分,掌握呼吸法是关键
  7. 今天14:00 | NeurIPS 专场四 青年科学家专场
  8. Chain ‘MASQUERADE‘ does not exist 报错解决
  9. linux访问局域网共享,精解局域网访问及共享(三)
  10. android微信图片编辑带滤镜,微信更新了一个小功能,一些图片编辑软件可能要被打入冷宫了...
  11. 证明左右特征向量正交
  12. 周易六十四卦——震为雷卦
  13. c++ 输入数字 输出汉语读法(拼音)代码
  14. 超前进位加法器 verilog代码
  15. OpenGL Android 安卓 入门 GLES20 初学者 初级 官方
  16. Nginx 代理本地文件
  17. 使用GDAL/OGR操作Postgresql数据库
  18. oracle 每个月求本年该月及之前的合计
  19. 王道考研b站操作系统、计算机组成原理、计算机网络课程(课件资料)
  20. C语言开发《推箱子游戏》,亲自手把手教会大家

热门文章

  1. 人工智能产业的发展是什么样的呢?
  2. AI将成科学家“高级定制”工具
  3. 挑战 Linux 之父认为的“不可能”:向 M1 Mac 移植 Linux
  4. 【线下首场免费报名啦】阿里云2020云内存数据库峰会 年度开发者的盛宴
  5. TIOBE 11 月编程语言:Java 首次跌出前二,Python 势不可挡
  6. 如果重走职场,一定会送自己 8 个锦囊
  7. 格式化的盘要怎么寻回文件
  8. Hibernate4.x之Session
  9. “人工智能进行临床诊断,至少在今天看来不靠谱”
  10. 5G时代,会有什么奇葩事儿?