Java密钥操作

密钥相关类


  • SecretKeySpec,KeyGenerator,KeyFactory,SecretKeyFactory,KeyPairGenerator
    • 对称密钥生成:SecretKeySpec keyGenerator SecretKeyFactory
    • 非对称密钥生成:KeyPairGenerator
  • 常用的KeyGenerator、KeyPairGenerator ;可以满足使用

代码


SecretKeySpec
  • 用SecretKeySpec类生成密钥。这种方式生成密钥较简单,设置也比较少,也没有随机因素
  • 此类以与 provider 无关的方式指定一个密钥。
  • 可以使用此类来根据一个字节数组构造一个 SecretKey,而无须通过一个(基于 provider 的)SecretKeyFactory。
  • 此类仅对能表示为一个字节数组并且没有任何与之相关联的钥参数的原始密钥有用,如,DES 或者 Triple DES 密钥。
// SecretKeySpec 生成密钥需要加入密钥原始文本
String key = "zhegeshikey";
byte[] keyByte = key.getBytes("UTF-8");
// 创建一个密钥
SecretKey secretKey = new SecretKeySpec(keyByte, algorithmDES);
KeyGenerator
  • 用KeyGenerator生成密钥,此类提供(对称)密钥生成器的功能。
  • 密钥生成器是使用此类的某个 getInstance 类方法构造的。
  • KeyGenerator 对象可重复使用,也就是说,在生成密钥后,可以重复使用同一个 KeyGenerator 对象来生成更多的密钥。
// 创建KeyGenerator对象,指定算法
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithmDES);
// 可以初始化一些配置:密钥长度,随机数等
keyGenerator.init(256);
// 配置随机串,加强加密安全性
// 声明随机串,可以指定种子 SecureRandom(byte[] seed)
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 = SecretKeyFactory.getInstance(algorithmDES);
// 指定密钥规范,此处的SecretKeySpec是密钥规范,而不是密钥。API真搓
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);

// 指定密钥规范,此处的KeySpec是密钥规范,而不是密钥。API真搓
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 = KeyPairGenerator.getInstance(algorithmRSA);
// 可以初始化一些配置:密钥长度,随机数。
// 配置随机串,加强加密安全性
// 声明随机串,可以指定种子 SecureRandom(byte[] seed)
SecureRandom random = new SecureRandom();
keyPairGenerator.initialize(512, random);
// 生成密钥
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 获取公私密钥
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
密钥打印输出
/**
 * 获取二进制密钥,打印密钥
 *
 * @param key
 * @return
 */
private String getKeyContent(Key key) {
   // 获取密钥二进制流
   byte[] secretKeyByte = key.getEncoded();
   // 以十六进制输出
   String secretKeyContent = BytesHexConverter.bytesToHexString(secretKeyByte);
   System.out.println(secretKeyContent);
   // 输出BASE64
   // 此处输出的BASE64密钥会换行;
   // 换用Apache的 commons-codec.jar, Base64.encodeBase64String(byte[])得到的编码字符串是不带换行符的
   System.out.println(Base64.encode(secretKeyByte));
   return secretKeyContent;
}
Java中可以使用Bouncy Castle库来实现SM3算法以生成密钥对。可以按照以下步骤进行操作: 1. 首先,确保你的Java开发环境中已经添加了Bouncy Castle库的依赖。 2. 在代码中导入相关的类库,比如`org.bouncycastle.jce.provider.BouncyCastleProvider`、`java.security.KeyPair`和`java.security.KeyPairGenerator`等。 3. 添加Bouncy Castle作为安全提供者,可以使用`Security.addProvider(new BouncyCastleProvider())`。 4. 使用`KeyPairGenerator`类来生成密钥对,指定使用SM3算法,可以使用`KeyPairGenerator.getInstance("SM3WithSM2", "BC")`。接下来,使用`KeyPairGenerator`的`generateKeyPair()`方法生成密钥对。 5. 最后,你可以通过`KeyPair`对象获取生成的密钥对,分别是公钥和私钥。 参考文献: 国密是咱大中国的国家密码局认定和颁发的密码算法标准,SM 是一个系列,常用的包括SM1、SM2、SM3、SM4。 一般说商密是指商用密码。更多是我们更加耳熟能详的的密码学标准。诸如AES、DAS、RSA、ECC椭圆曲线系列等加密... SM4算法:SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法。 国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,目前主要使用公开的SM2、SM3、SM4三类算法,分别是非对称算法、哈希算法和对称算法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java实现sm2、sm3、sm4国密算法,完美实现,轻松调用](https://download.csdn.net/download/qq_30308931/11865460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SM3和SM4密钥](https://blog.csdn.net/Swofford/article/details/129507950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值