JPBC密码学库封装函数

package Util; /**
 * FileName: Util.Util
 * Author:   star
 * Date:     2019/10/24 17:27
 * Description: 一些公共的处理参数或者返回结果的方法
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */

import BCPA.roles.BCPA_PKG;
import it.unisa.dia.gas.jpbc.Element;
import it.unisa.dia.gas.jpbc.Pairing;

import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;

/**
 * 〈一句话功能简述〉<br> 
 * 〈一些公共的处理参数或者返回结果的方法〉
 *
 * @author star
 * @create 2019/10/24
 * @since 1.0.0
 */
public class Util {
    private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
    private static Pairing pairing;

    //从PKG设置pairing方便后续使用
    public static void setPairing(Pairing pairing) {
        Util.pairing = pairing;
    }

    //16进制的byte[]数组转换为字符串
    public static String hexBytesToString(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        for (int j = 0; j < bytes.length; j++) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = HEX_ARRAY[v >>> 4];
            hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
        }
        return new String(hexChars);
    }

    //16进制的字符串转换为byte[]数组
    public static byte[] hexStringToBytes(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                    + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }

    //G1中获取随机元素,获取1,获取0
    public static Element getRandomFromG1() {
        return pairing.getG1().newRandomElement().getImmutable();
    }

    public static Element getOneFromG1() {
        return pairing.getG1().newOneElement().getImmutable();
    }

    public static Element getZeroFromG1() {
        return pairing.getG1().newZeroElement().getImmutable();
    }

    //Zp中获取随机元素,获取1,获取0
    public static Element getRandomFromZp() {
        return pairing.getZr().newRandomElement().getImmutable();
    }

    public static Element getOneFromZp() {
        return pairing.getZr().newOneElement().getImmutable();
    }

    public static Element getZeroFromZp() {
        return pairing.getZr().newZeroElement().getImmutable();
    }

    //H1,H2 : {0, 1}∗ → G1
    public static Element hashFromStringToG1(String str) {
        return pairing.getG1().newElement().setFromHash(str.getBytes(), 0, str.length()).getImmutable();
    }

    public static Element hashFromBytesToG1(byte[] bytes) {
        return pairing.getG1().newElement().setFromHash(bytes, 0, bytes.length).getImmutable();
    }

    //H : {0, 1}∗ → Zp
    public static Element hashFromStringToZp(String str) {
        return pairing.getZr().newElement().setFromHash(str.getBytes(), 0, str.length()).getImmutable();
    }

    public static Element hashFromBytesToZp( byte[] bytes) {
        return pairing.getZr().newElement().setFromHash(bytes, 0, bytes.length).getImmutable();
    }

    //h : G1 → Zp
    public static Element hashFromG1ToZp( Element g1_element) {
        // h(y) : G1 -> Zp
        byte[] g1_bytes = g1_element.getImmutable().toCanonicalRepresentation();
        byte[] zp_bytes = g1_bytes;
        try {
            MessageDigest hasher = MessageDigest.getInstance("SHA-512");
            zp_bytes = hasher.digest(g1_bytes);   //先把G1元素hash成512bits
        } catch (Exception e) {
            e.printStackTrace();
        }
        //再把hash后的bits映射到Zp
        Element hash_result = pairing.getZr().newElementFromHash(zp_bytes, 0, zp_bytes.length).getImmutable();
        return hash_result;
    }

    //{0,1}* -> key space of πkey  int空间
    public static int h1_pai_key(String data) {
        try {
            MessageDigest hasher = MessageDigest.getInstance("SHA-256");
            byte[] result = hasher.digest(data.getBytes());
            ByteBuffer wrapped = ByteBuffer.wrap(result);
            return wrapped.getShort();
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }

    //伪随机置换 pseudorandom permutation πkey() 用于随机选择哪些块进行抽查
    public static List<Integer> pseudoPerm(int key, int n, int c) {
        List<Integer> result = new ArrayList<Integer>(c);
        if(c < n) {
            List<Integer> list = new ArrayList<>(n);
            for(int i = 0; i < n; i ++) {
                list.add(i);
            }
            for(int i = 0; i < key; i ++)
                java.util.Collections.shuffle(list);
            for(int i = 0; i < c; i ++) {
                result.add(list.get(i));
            }
        } else {
            System.out.println(" pseudorandom permutation error!");
        }
        return result;
    }

    //{0,1}* -> key space of fkey 字符串空间
    public static String h2_f_key(String data) {
        try {
            MessageDigest hasher = MessageDigest.getInstance("SHA-512");
            byte[] result = hasher.digest(data.getBytes());
            return result.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return "error";
        }
    }


    //伪随机函数 pseudorandom function fkey():{0,1}* -> Zp
    public static Element pseudoFunc(String key, int id) {
        try {
            MessageDigest hasher = MessageDigest.getInstance("SHA-512");
            byte[] hash_bytes = hasher.digest((key + id).getBytes());   //先把G1元素hash成512bits
            return pairing.getZr().newElementFromHash(hash_bytes, 0, hash_bytes.length).getImmutable();
        } catch (Exception e) {
            e.printStackTrace();
            return pairing.getZr().newRandomElement();
        }
    }

    public static void main(String[] args) throws Exception {
        BCPA_PKG pkg = new BCPA_PKG();
        System.out.println(Util.hashFromStringToZp(123+"name"));
        System.out.println(Util.hashFromStringToZp(123+"name"));
        System.out.println(Util.hashFromStringToZp(111+"name"));
    }
}

关于JPBC的密码学实现参考:

https://blog.csdn.net/zhangwenjiezw886/article/details/51006774

https://blog.csdn.net/liuweiran900217/article/details/23414629

https://blog.csdn.net/qifuchenluo/article/details/45100851

http://gas.dia.unisa.it/projects/jpbc/java-docs/api/index.html

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anyanyamy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值