一:关于公钥加密和私钥解密

(1)我有数字1和2,其中我喜欢2这个数据,就将2设置为我的私钥,这样私钥就是我独有的了,假设我有一个文件,不想让别人看到,就用公钥1进行加密,这样即使别人得到了这个文件,也没办法解开,因为他只知道1是公钥,只知道是1对文件进行加密的,但是他不知道2是私钥,2才是解密文件的关键,而2又在我自己的手里,所以除了我没人能看到文件具体的内容.
(2)常见的使用场景:
a:朋友间私密文件的传输,朋友A用我提供的公钥对传输的文件进行加密,而我又将私钥提供给A,那么即使传输过程中文件被窃取了,也没办法解开,因为私钥只有我和A有,所以传输的文件安全性非常高.
b.单向的文件加密传输,路人A想要将非常重要的文件传给我,但是我很担心传输的过程中文件被窃取,所以我对A说不能用明文传输,就将公钥给他,告诉他用公钥对其加密后再传给我,这样加密后的文件只能我自己看到,因为能解密的私钥在自己手里.
(3)注:因此加密的内容包含两个部分,公开的密钥即公钥是人人都知道的,但是用公钥加密的内容只有独有的私钥才能解开.
(4)作用:用于传输数据的加密.

二:关于私钥签名和公钥验签.

(1)首先要明确一点:公钥和私钥都是可以对文件进行加密的,并且可以双向解密.
(2)那么私钥加密有什么作用呢?
举例:朋友A说有路人B冒充你在网上发布消息,那么我就用私钥加密了自己发布到网上的明文,所有人都知道公钥,所以都可以用公钥解密文件,那么能用我公开的公钥解密出来文件必然是我用私钥加密的,这样就证明发布的内容确定是我写的了.
(3)这种私钥加密的做法叫做数字签名,保证发布内容方的真实性.

三:CMD实际操作:

(1)在CMD中输入keytool -genkey

keystore密钥库口令为123456
密钥口令为 abcdefg
这里写图片描述

(2)关于”.keystore”

以上的操作将会生成一个公钥和私钥,默认使用的是非对称加密的DSA算法,同时上述操作还会创建一个数字证书,证书中包含的不仅仅是新生成的公钥,还包含了该公钥对应的上述填写的信息的对应关系,上述信息构建了X.500格式的全名,包含了主体的国家、州、城市、机构、单位和名字。这样,这个证书将证明相应的公钥是这个人或机构所拥有的.以上生成的公钥,私钥和证书都保存在”.keystore”中.
这里写图片描述

(3)对于2个密码的区分

上面的keystore密码:123456,是密钥库的密码,也就是说每次进入密钥库都必须输入该密码
上面的mykey密码:adcdefg,是只对应别名”mykey”的密码,使用该别名就可以在keystore中找到对应的公钥,私钥和证书,此处对应的密码是对于该别名私钥的密码,keystore中每个别名都可以用不同的密码加以保护.

(4)在本地已经存在”.keystore”的情况下,如果在输入”keytool -genkey”就会报错,因为它会在”.keystore”中创建默认别名为”mykey”的证书,但是密钥库中的别名为”mykey”已经存在了,就会报错.
这里写图片描述

(5)在密钥库中利用别名增加多个证书.

在使用”keytool -genkey -alias aqiu”创建别名”aqiu”时,我输入的”.keystore”密码出错的显示.
这里写图片描述
在输入之前设置的密码”123456”后,这样就在keystore中创建了别名为”aqiu”的公钥私钥和证书了,
这里写图片描述

(6)使用指定的算法和密钥库设置有效期

之前我们都是使用的是默认的DSA算法,并且都是保存在”.keystore”密钥库中,而且还没设置有效期.
keytool -genkey -alias aqiutest -keyalg RSA -keysize 1024 -keystore aqukeystore -validity 4000
这里写图片描述
使用RSA算法生成1024位别名为”aqiutest”的公钥/私钥对和证书,密钥长度为1024位,该别名证书的有效期是4000天,使用的密钥库为”aqukeystore”文件.
这里写图片描述
其中密钥库的口令需要重新输入不必和之前的keystore相同,可以设置为”654321”,别名”aqiutest”的密码任意设置即可,这里设置为”654321”,直接enter即可.

(7)将数字证书导入到文件

选择”aqukeystore”密钥库,输入密钥库密码”654321”,在密钥库中选择别名为”aqiutest”的公钥和证书(注意:这里只生成公钥和证书,不需要私钥所以不需要私钥密码,因此内容也是可以公开的),
keytool -export -alias aqiutest -file aqiutest.cer -keystore aqukeystore -storepass 654321 -rfc
这里写图片描述
这样在本地目录下就生成了相关的证书
这里写图片描述

由于该证书是用自己的私钥对该证书进行数字签名的,即自己给自己签发的证书,因此窗口中显示警告信息:“该证书发行机构根证书没受信任”。但其实并没有什么大碍,因为证书由我们发布只需要在公司内部使用即可.
这里写图片描述

(8)想得到证书更详细的内容的指令

C:\Users\46210>keytool -printcert -file aqiutest.cer
所有者: CN=aqiu, OU=aqiu, O=aqiu, L=aqiu, ST=aqiu, C=aqiu
发布者: CN=aqiu, OU=aqiu, O=aqiu, L=aqiu, ST=aqiu, C=aqiu
序列号: 1b397b28
有效期开始日期: Tue May 03 10:49:00 CST 2016, 截止日期: Fri Apr 16 10:49:00 CST 2027
证书指纹:
MD5: 22:F6:53:B0:5E:7A:CA:EE:4E:02:20:B3:79:B9:A9:5C
SHA1: 80:62:91:82:D5:A4:C3:82:70:BD:C4:12:75:FA:1B:C0:9C:30:EA:94
SHA256: E8:57:B9:BC:40:82:AC:68:37:CC:26:FE:FC:29:25:B4:FE:60:A0:8A:84:72:2B:B8:57:61:2C:92:3C:14:47:E8
签名算法名称: SHA256withRSA
版本: 3

扩展:

1: ObjectId: 2.5.29.14 Criticality=false

SubjectKeyIdentifier [
KeyIdentifier [
0000: 8C B6 2C 06 46 90 20 11 19 D1 88 97 E0 53 DA F1 ..,.F. ……S..
0010: DE 28 72 C2 .(r.
]
]
这里写图片描述

四:使用MyEclipse JAVA :安全证书-公钥加密,私钥解密示例程序

package com.aqiu.exchange;

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

import javax.crypto.Cipher;

public class CodeUtils {

/**
* @param args
*/
public static void main(String[] args) throws Exception {
byte[] msg = “阿秋么么哒”.getBytes(“UTF8”); // 待加解密的消息
// 用证书的公钥加密
CertificateFactory cff = CertificateFactory.getInstance(“X.509”);
FileInputStream fis1 = new FileInputStream(
“C://Users//46210//aqiutest.cer”); // 证书文件
Certificate cf = cff.generateCertificate(fis1);
PublicKey pk1 = cf.getPublicKey(); // 得到证书文件携带的公钥
Cipher c1 = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); // 定义算法:RSA
c1.init(Cipher.ENCRYPT_MODE, pk1);
byte[] msg1 = c1.doFinal(msg); // 加密后的数据
System.out.println(“加密之后的数据:”+msg1);
// 用证书的私钥解密 - 该私钥存在生成该证书的密钥库中
FileInputStream fis2 = new FileInputStream(“C://Users//46210//aqukeystore”);
KeyStore ks = KeyStore.getInstance(“JKS”); // 加载证书库
char[] kspwd = “654321”.toCharArray(); // 证书库密码
char[] keypwd = “654321”.toCharArray(); // 证书密码
ks.load(fis2, kspwd); // 加载证书
PrivateKey pk2 = (PrivateKey) ks.getKey(“aqiutest”, keypwd); // 获取证书私钥
fis2.close();
Cipher c2 = Cipher.getInstance(“RSA/ECB/PKCS1Padding”);
c2.init(Cipher.DECRYPT_MODE, pk2);
byte[] msg2 = c2.doFinal(msg1); // 解密后的数据
System.out.println(“解密之后的数据:”+new String(msg2, “UTF8”)); // 将解密数据转为字符串
}
}
这里写图片描述
用公钥加密之后,只有自己的私钥才能解密.

更多相关文章

  1. java 对称加密——密钥与加密后的数据存盘方式
  2. Ldap 修改用户密码及安装证书
  3. 导入证书后的Java Keytool错误,“Keytool error: Java .io。FileN
  4. java 自制Tomcat Andorid IOS 端 证书
  5. php RSA加密 JAVA 证书生成

随机推荐

  1. Android TextView 字体加粗
  2. 添加ddHeaderView注意问题
  3. 修改android studio 默认的so文件检索路
  4. Android(安卓)蓝牙开发(九)A2DP基本功能
  5. android build.prop详解
  6. android避免service被杀 博客分类: androi
  7. eclipse 启动 Android SDK Content Loade
  8. Android之两种toast的实现
  9. Android adb 使用总结 (调试专用)
  10. Android TextView里显示两种颜色