我是靠谱客的博主 风中大侠,最近开发中收集的这篇文章主要介绍ECC证书操作汇总(ECC certificate operations summary),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景介绍

项目里用到了ECC的证书使用,有一些证书的常规操作,在此进行汇总说明,以便后浪来踏。ECC的public key长度为65字节,第一个字节是标识符0x04,32字节biginteger X, 32字节biginteger Y; private key的长度是 32字节的biginteger。以下代码示例均为ECC secp256r1 曲线。

协商秘钥

张三李四要加密通信,只要持有对方的ECC公钥就可以了。在具体交互时采用AES加密的方式,但每次交互AES秘钥是不同的,AES秘钥在交互时也不参与传输。对方通过当次会话传输过来的临时公钥(ECC Eph_pubKey)进行动态计算来获得本次的AES秘钥,然后用以解密数据包。

import javax.crypto.KeyAgreement; public static byte[] keyAgree(PrivateKey selfSK, PublicKey otherPK) { try {
            KeyAgreement ka = KeyAgreement.getInstance("ECDH");
            ka.init(selfSK);
            ka.doPhase(otherPK, true); return ka.generateSecret();
        } catch (Exception e) {
            e.printStackTrace();
        } return null;
    }

举例过程 张三 -> 李四,张三持有李四的长期公钥。

  • 张三:发送 加密 AES = KeyAgree(张三的临时私钥,李四的长期公钥), 传输内容:张三的临时公钥 (65字节固定)+ 密文;
  • 李四:收到 解密 AES = KeyAgree(李四的长期私钥,张三的临时公钥),解密密文得到明文;

反之,李四 -> 张三 是对等的。

解析ECC证书&私钥

将文本证书及私钥文件反序列化为X509 Cert & ECC private key。

 1     public static X509Certificate deserialize(String path) { 2         try { 3             String cert = Files.lines(Paths.get(path)) 4                                .filter(line -> !line.startsWith("-----"))
 5                                .collect(Collectors.joining());
 6             if (StringUtils.isBlank(cert)) { 7                 return null;
 8             }                   
 9             CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 10             ByteArrayInputStream bais = new ByteArrayInputStream(Base64.decodeBase64(base64Cert)); 11             return (X509Certificate) (certFactory.generateCertificate(bais)); 12         } catch (IOException e) { 13 e.printStackTrace(); 14 } 15         return null; 16 } 17 
18 
19 
20     public static PrivateKey deserialize(String path) { 21         try { 22             String key = Files.lines(Paths.get(path)) 23                               .filter(line -> !line.startsWith("-----")) 24 .collect(Collectors.joining()); 25             if (StringUtils.isBlank(key)) { 26                 return null; 27 } 28 
29             EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(key)); 30             KeyFactory kf = KeyFactory.getInstance("EC"); 31             return kf.generatePrivate(privateKeySpec); 32         } catch (Exception e) { 33 e.printStackTrace(); 34 } 35         return null; 36     }

十六进制字符串公私钥反序列化

How to convert hex string to ECC public key ?

 1     public static PublicKey deserializePubKey(String hexPubKey) throws Exception { 2         byte[] pubKey = Hex.decode(hexPubKey) 3         byte[] x = Arrays.copyOfRange(pubKey, 1, 33); // the first byte is 0x04 flag, ignored
 4         byte[] y = Arrays.copyOfRange(pubKey, 33, pubKey.length);
 5         ECPoint w = new ECPoint(new BigInteger(1, x), new BigInteger(1, y));
 6         KeyFactory kf = KeyFactory.getInstance("EC");
 7         return kf.generatePublic(new ECPublicKeySpec(w, ecParameterSpecForP256())); 8     }
 9 
10     public static PrivateKey deserializePriKey(String hexPriKey) throws Exception { 11         KeyFactory kf = KeyFactory.getInstance("EC"); 12         return kf.generatePrivate(new ECPrivateKeySpec(new BigInteger(Hex.decode(hexPriKey)), ecParameterSpecForP256())); 13 } 14 
15     private static ECParameterSpec ecParameterSpecForP256() throws Exception { 16         AlgorithmParameters params = AlgorithmParameters.getInstance("EC"); 17         params.init(new ECGenParameterSpec("secp256r1")); 18         return params.getParameterSpec(ECParameterSpec.class); 19     }

以上。

网安零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

网安零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

最后

以上就是风中大侠为你收集整理的ECC证书操作汇总(ECC certificate operations summary)的全部内容,希望文章能够帮你解决ECC证书操作汇总(ECC certificate operations summary)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部