Java 用于ChainMaker国密

直接上代码


/**
 * bcprov-jdk15on 版本适用(1.61-1.68)
 * @author dashou
 * @date 2021-4-13
 */
public class HelloWorld {
   static  String PrivateKey = "-----BEGIN PRIVATE KEY-----\nMIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgxNMRgCS9b79Epc1p\niSPs+Xs1Nxqmwv+Qh7fhrqABN5qgCgYIKoEcz1UBgi2hRANCAAST9ZM+KsiZeVXh\nETzuftpbSOUaUiLirS+ei8nP4uI6LJMHFjr5SqjVFYUS5Xvu9uryvuDnIxv8faR6\n4nGEXFNU\n-----END PRIVATE KEY-----";
   static  String PublicKey ="-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEk/WTPirImXlV4RE87n7aW0jlGlIi\n4q0vnovJz+LiOiyTBxY6+Uqo1RWFEuV77vbq8r7g5yMb/H2keuJxhFxTVA==\n-----END PUBLIC KEY-----";


    public static PrivateKey getPrivateKeyFromBytes(byte[] pemKey) throws ChainMakerCryptoSuiteException {
        PrivateKey pk = null;
        try {
            PemReader pr = new PemReader(new StringReader(new String(pemKey)));
            PemObject po = pr.readPemObject();
            PEMParser pem = new PEMParser(new StringReader(new String(pemKey)));

            if (po.getType().equals("PRIVATE KEY")) {
                pk = new JcaPEMKeyConverter().getPrivateKey((PrivateKeyInfo) pem.readObject());
            } else {
                PEMKeyPair kp = (PEMKeyPair) pem.readObject();
                pk = new JcaPEMKeyConverter().getPrivateKey(kp.getPrivateKeyInfo());
            }
        } catch (Exception e) {
            throw new ChainMakerCryptoSuiteException(e.toString());
        }
        return pk;
    }

    public static PublicKey getPublicKeyFromBytes(byte[] pemKey) throws ChainMakerCryptoSuiteException {
        PublicKey pk = null;
        try {
            PemReader pr = new PemReader(new StringReader(new String(pemKey)));
            PemObject po = pr.readPemObject();
            PEMParser pem = new PEMParser(new StringReader(new String(pemKey)));

            if (po.getType().equals("PUBLIC KEY")) {
                pk = new JcaPEMKeyConverter().getPublicKey((SubjectPublicKeyInfo)pem.readObject());
            } else {
                PEMKeyPair kp = (PEMKeyPair) pem.readObject();
                pk = new JcaPEMKeyConverter().getPublicKey(kp.getPublicKeyInfo());
            }
        } catch (Exception e) {
            throw new ChainMakerCryptoSuiteException(e.toString());
        }
        return pk;
    }

   public static byte[] C1C3C2ToDer(byte[] cipher) throws IOException {
       ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
       final byte[] point = new byte[65];
       System.arraycopy(cipher,0,point,0,65);
       final ECPoint ecPoint = spec.getCurve().decodePoint(point);
       final  byte[] m = new byte[32];
       System.arraycopy(cipher,65,m,0,32);
       final byte[] c = new byte[cipher.length-65-32];
       System.arraycopy(cipher,65+32,c,0,cipher.length-65-32);
       final ASN1EncodableVector vector = new ASN1EncodableVector();
       vector.add(new ASN1Integer(ecPoint.getAffineXCoord().toBigInteger()));
       vector.add(new ASN1Integer(ecPoint.getAffineYCoord().toBigInteger()));
       vector.add(new DEROctetString(m));
       vector.add(new DEROctetString(c));
       final  ASN1Sequence sequence = new DERSequence(vector);
       return sequence.getEncoded();
   }

    public static byte[] derToC1C3C2(byte[] cipher){
        final ASN1Sequence sequence = ASN1Sequence.getInstance(cipher);
        final ASN1Integer x =(ASN1Integer) sequence.getObjectAt(0);
        final ASN1Integer y =(ASN1Integer) sequence.getObjectAt(1);
        final DEROctetString m =(DEROctetString) sequence.getObjectAt(2);
        final DEROctetString c =(DEROctetString) sequence.getObjectAt(3);
        ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
        final ECPoint ecPoint =spec.getCurve().createPoint(x.getPositiveValue(),y.getPositiveValue());
        final byte[] c1 = ecPoint.getEncoded(false);
        final byte[] c3 = m.getOctets();
        final byte[] c2 = c.getOctets();
        return Arrays.concatenate(c1,c3,c2);
    }

    /**
     * 解密
     */
    public static byte[] decrypt(byte[] encode) throws ChainMakerCryptoSuiteException {
        PrivateKey privateKey = getPrivateKeyFromBytes(PrivateKey.getBytes());
        ECPrivateKeyParameters parameters=BCECUtil.convertPrivateKeyToParameters((BCECPrivateKey) privateKey);
        SM2Engine.Mode mode = SM2Engine.Mode.C1C3C2;
        final SM2Engine engine =  new SM2Engine(mode);
        engine.init(false, parameters);
        // 解密测试
        try {
           // String encode="MGoCIBusNdgkzMaGHEgSP5a/3dX98YkwfNuxZt8ORcmG3eaQAiEAtHcS4aDtiMg9b4mW7plzfcGV64rXhbi9UR9aCMOR7lEEIL20vNQjntOfO5jKNzIUtUSHF7MWrsfBM5jlUpFOn49pBAEH";
            byte[] octets = derToC1C3C2(encode);
            return engine.processBlock(octets, 0, octets.length);
        } catch (Exception e) {
            System.out.println("加解密测试错误");
            return null;
        }
    }

    /**
     * 加密
     */
    public static byte[] encrypt(byte[] data) throws ChainMakerCryptoSuiteException {
        PublicKey publicKey = getPublicKeyFromBytes(PublicKey.getBytes());
        BCECPublicKey localECPublicKey = (BCECPublicKey) publicKey;
        ECPublicKeyParameters  localECPublicKeyParameters = BCECUtil.convertPublicKeyToParameters(localECPublicKey);
        SM2Engine.Mode mode = SM2Engine.Mode.C1C3C2;
        SM2Engine localSM2Engine = new SM2Engine(mode);
        return getBytes(data, localECPublicKeyParameters, localSM2Engine);
    }
    public static byte[] getBytes(byte[] data, ECPublicKeyParameters localECPublicKeyParameters, SM2Engine localSM2Engine) {
        localSM2Engine.init(true, new ParametersWithRandom(localECPublicKeyParameters, new SecureRandom()));
        byte[] arrayOfByte2;
        try {
            arrayOfByte2 = C1C3C2ToDer(localSM2Engine.processBlock(data, 0, data.length));
            return arrayOfByte2;
        } catch (InvalidCipherTextException | IOException e) {

            e.printStackTrace();
            return null;
        }
    }

    /**
     * 私钥签名
     */
    public static byte[] signByPrivateKey(byte[] data) throws Exception {
        PrivateKey privateKey = getPrivateKeyFromBytes(PrivateKey.getBytes());
        Signature sig = Signature.getInstance("SM3withSM2", BouncyCastleProvider.PROVIDER_NAME);
        sig.initSign(privateKey);
        sig.update(data);
        return sig.sign();
    }

    /**
     * 公钥验签
     */
    public static boolean verifyByPublicKey(byte[] data, byte[] signature) throws Exception {
        PublicKey publicKey = getPublicKeyFromBytes(PublicKey.getBytes());
        Signature sig = Signature.getInstance("SM3withSM2");
        sig.initVerify(publicKey);
        sig.update(data);
        return sig.verify(signature);
    }

    // 读文件
    public static byte[] getFileBytes(String filePath) throws UtilsException {
        byte[] fileBytes = null;
        try {
            fileBytes = IOUtils.toByteArray(new FileInputStream(new File(filePath)));
        } catch (IOException e) {
            throw new UtilsException("get file by path err : " + e.getMessage());
        }
        return fileBytes;
    }
    // 写文件
    public static void CreateFile(byte[] bfile, String filePath,String fileName) {
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        File file = null;
        try {
            File dir = new File(filePath);
            if(!dir.exists() && !dir.isDirectory()){//判断文件目录是否存在
                dir.mkdirs();
            }
            file = new File(filePath + File.separator + fileName);
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(bfile);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }


    public static void main(String[] args) throws Exception {
//        // 加密
//         byte[] ddd= encrypt("s33311dsagewafeer232342swefwr2r2p[kmr2;jfdpwf'pajf[asojfawojf[pawokfa[pojef[awmv'paojf".getBytes());
//         // 解密
//        decrypt(Base64.getEncoder().encodeToString(ddd));
//         // 签名
//        byte[]d= signByPrivateKey("ww".getBytes());
//        String dddddd = "MEQCIEJKU36PEIUv+COsP264CleJ2QlbscTKwngJxPrQD79bAiAAowB4ymhLUaR/VKYiY33l8mb7zsnAttxqZeAckwi9Gg==";
//         // 验证
//        boolean s= verifyByPublicKey("ww".getBytes(),Base64.getDecoder().decode(dddddd));
      // 读取秘钥
       byte[]dd= getFileBytes("/Users/sunbo/Desktop/Haier/地铁集团/sdk-java/src/main/java/8062c89270484193b536af68475acc6a");
       byte[]ee= decrypt(dd);
       CreateFile(ee,"/Users/sunbo/Desktop/Haier/地铁集团/sdk-java/src/main/java/","1.pdf");
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容