密钥相关类
- SecretKeySpec,KeyGenerator,KeyFactory,SecretKeyFactory,KeyPairGenerator
- 对称密钥生成:SecretKeySpec keyGenerator SecretKeyFactory
- 非对称密钥生成:KeyPairGenerator
- 常用的KeyGenerator、KeyPairGenerator ;可以满足使用
代码
- 代码示例
- 类: j2se.security.SecretKeyGenerator
SecretKeySpec
- 用SecretKeySpec类生成密钥。这种方式生成密钥较简单,设置也比较少,也没有随机因素
- 此类以与 provider 无关的方式指定一个密钥。
- 可以使用此类来根据一个字节数组构造一个 SecretKey,而无须通过一个(基于 provider 的)SecretKeyFactory。
- 此类仅对能表示为一个字节数组并且没有任何与之相关联的钥参数的原始密钥有用,如,DES 或者 Triple DES 密钥。
String key = "zhegeshikey";
byte[] keyByte = key.getBytes("UTF-8");
SecretKey secretKey = new SecretKeySpec(keyByte, algorithmDES);
KeyGenerator
- 用KeyGenerator生成密钥,此类提供(对称)密钥生成器的功能。
- 密钥生成器是使用此类的某个 getInstance 类方法构造的。
- KeyGenerator 对象可重复使用,也就是说,在生成密钥后,可以重复使用同一个 KeyGenerator 对象来生成更多的密钥。
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithmDES);
keyGenerator.init(256);
SecureRandom random = new SecureRandom();
keyGenerator.init(random);
SecretKey secretKey = keyGenerator.generateKey();
SecretKeyFactory
- 用SecretKeyFactory生成密钥,此类表示秘密密钥的工厂。
String key = "zhegeshikey";
byte[] keyByte = key.getBytes("UTF-8");
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithmDES);
DESKeySpec keySpec = new DESKeySpec(keyByte);
SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
KeyFactory
- keyFactory 也是根据规范生成密钥的工厂。但是该类只能生成对应的公私钥非对称的密钥。
String publicKeyStr = "305c300d06092a864886f70d0101010500034b0030480241008cba35c237c379e0ecb6653ebfbec9d31e6f0591c403addcd660a56a0cc0a51bea2f5947b1671d8811bdfa019437ad9e479bc0a7e41b3acfca1ccb596a6090bd0203010001";
byte[] publicKeyByte = BytesHexConverter.hexStringToBytes(publicKeyStr);
String privateKeyStr = "30820155020100300d06092a864886f70d01010105000482013f3082013b0201000241008cba35c237c379e0ecb6653ebfbec9d31e6f0591c403addcd660a56a0cc0a51bea2f5947b1671d8811bdfa019437ad9e479bc0a7e41b3acfca1ccb596a6090bd0203010001024010ad082dc999da5972f3722feb5cda61b01b8bd76818df8369cbee0e1110caffc48949b26bd5d4796372592ee33cd35be9b66c066c51b8c138c1e5cde2bda929022100d51ba92bf83175b5fd86382322a835cdb1055fc4b205c2942cdb090abde8ddaf022100a90d274021a1c49756e14ded10da57d0af4caddd2f4f62a4a7813ac4021f9f530221009e83d0b6300b3a2f80c11188b102c5e2964615124e0912cefcfe801f495ba96902205ea6c4b13da36b8528d9e15db8afe7b72a4f8e916729d59b47462df70d11538d02210097c3e4d703ec0fd803e572c262eafd735ff1c2a544985540fd2673caca7fdd66";
byte[] privateKeyByte = BytesHexConverter.hexStringToBytes(privateKeyStr);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKeyByte);
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKeyByte);
KeyFactory keyFactory = KeyFactory.getInstance(algorithmRSA);
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
KeyPairGenerator
- 密钥对生成,生成非对称密钥
- KeyPairGenerator类用于生成公钥和私钥对。密钥对生成器是使用getInstance工厂方法(返回一个给定类的实例的静态方法)构造的。
- 特定算法的密钥对生成器可以创建能够与此算法一起使用的公钥/私钥对。它还可以将特定于算法的参数与每个生成的密钥关联。
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithmRSA);
SecureRandom random = new SecureRandom();
keyPairGenerator.initialize(512, random);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
密钥打印输出
private String getKeyContent(Key key) {
byte[] secretKeyByte = key.getEncoded();
String secretKeyContent = BytesHexConverter.bytesToHexString(secretKeyByte);
System.out.println(secretKeyContent);
System.out.println(Base64.encode(secretKeyByte));
return secretKeyContent;
}