1.X509编码
1.介绍:
X.509 是密码学里公钥证书的格式标准。 X.509 证书己应用在包括TLS/SSL(WWW万维网安全浏览的基石)在内的众多 Internet协议里.同时它也用在很多非在线应用场景里,比如电子签名服务。X.509证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构CA的签名,也可以是自签名)。对于一份经由可信的证书签发机构签名或者可以通过其它方式验证的证书,证书的拥有者就可以用证书及相应的私钥来创建安全的通信,对文档进行数字签名.
另外除了证书本身功能,X.509还附带了证书吊销列表和用于从最终对证书进行签名的证书签发机构直到最终可信点为止的证书合法性验证算法。
2.例子:
KeyFactory产生公钥,指定X509编码进行公钥的产生
/**
* 1.得到公钥
*
* @param publicKey 密钥字符串(经过base64编码)
* @throws Exception
*/
public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
//1.通过X509编码的Key指令获得公钥对象
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
//2.x509KeySpec是密钥材料
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
return key;
}
以上是公钥产生的测试方法
public final PublicKey generatePublic(KeySpec keySpec)
throws InvalidKeySpecException {
if (serviceIterator == null) {
return spi.engineGeneratePublic(keySpec);
}
Exception failure = null;
KeyFactorySpi mySpi = spi;
do {
try {
return mySpi.engineGeneratePublic(keySpec);
} catch (Exception e) {
if (failure == null) {
failure = e;
}
mySpi = nextSpi(mySpi);
}
} while (mySpi != null);
if (failure instanceof RuntimeException) {
throw (RuntimeException)failure;
}
if (failure instanceof InvalidKeySpecException) {
throw (InvalidKeySpecException)failure;
}
throw new InvalidKeySpecException
("Could not generate public key", failure);
}
2.PKCS#8编码产生私钥
1.KeyFactory调用generatePrivate()根据密钥材料生产私钥
//根据提供的密钥规范(密钥材料)生成私钥对象。
//参数:keySpec——私钥的规范(密钥材料)。返回:私钥。抛出: InvalidKeySpecException – 如果给定的密钥规范不适合此密钥工厂生成私钥。
public final PrivateKey generatePrivate(KeySpec keySpec)
throws InvalidKeySpecException {
if (serviceIterator == null) {
return spi.engineGeneratePrivate(keySpec);
}
Exception failure = null;
KeyFactorySpi mySpi = spi;
do {
try {
return mySpi.engineGeneratePrivate(keySpec);
} catch (Exception e) {
if (failure == null) {
failure = e;
}
mySpi = nextSpi(mySpi);
}
} while (mySpi != null);
if (failure instanceof RuntimeException) {
throw (RuntimeException)failure;
}
if (failure instanceof InvalidKeySpecException) {
throw (InvalidKeySpecException)failure;
}
throw new InvalidKeySpecException
("Could not generate private key", failure);
}
2.得到私钥测试
public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
//通过PKCS#8编码的Key指令获得私钥对象
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
return key;
}
KeySpec
它的实现类已知有:DESedeKeySpec , DESKeySpec , DHPrivateKeySpec , DHPublicKeySpec , DSAPrivateKeySpec , DSAPublicKeySpec , ECPrivateKeySpec , ECPublicKeySpec , EncodedKeySpec , PBEKeySpec , PKCS8EncodedKeySpec , RSAMultiPrimePrivateCrtKeySpec , RSAPrivateCrtKeySpec , RSAPrivateKeySpec , RSAPublicKeySpec , SecretKeySpec , X509EncodedKeySpec , XECPrivateKeySpec , XECPublicKeySpec
1.介绍:
构成加密密钥的密钥材料的(透明)规范。
如果密钥存储在硬件设备上,则其规范可能包含有助于识别设备密钥的信息。
密钥可以以特定于算法的方式指定,或者以与算法无关的编码格式(例如ASN.1)指定。 例如,DSA私钥可以通过它的组件指定x , p , q ,和g (参见DSAPrivateKeySpec ),或者它可使用其DER编码(见指定PKCS8EncodedKeySpec )。
此接口不包含任何方法或常量。 其唯一目的是对所有关键规范进行分组(并提供类型安全性)。 所有关键规范都必须实现此接口。