Java中的BLS签名方案:存储和加载密钥

时间:2018-12-20 12:12:21

标签: java serialization cryptography digital-signature jpbc

我们需要一种使用尽可能短的签名来签名消息的方法,这种签名遇到了BLS方案,这保证了相当短的签名。尝试使用JPBC实现时,这些示例易于设置和运行,但是缺少一个相当关键的部分:存储和加载私钥。

  • 当前JPBC BLS网站1中的示例不包含任何存储,它只是使用RAM中的实例来验证消息。
  • 来自同一网站2的一个较旧的示例(不再与该网站链接,但可以使用搜索引擎找到)是指一种store方法,此方法似乎已从该库中删除赞成不包含任何存储功能的实现。
  • AsymmetricCipherKeyPair实例(这是我从密钥生成器中获得的)不能自行序列化,BLS01PublicKeyParametersBLS01PrivateKeyParameters的实例也不能使用包含密钥的字段进行序列化( skpk)是私有的,仅输入到Element接口上,该接口并没有真正说明内容。

作为一种解决方法,我实现了一个store方法,该方法(去除了所有异常处理)大致如下:

public static void storePrivateKey(AsymmetricCipherKeyPair key, String filename)
        throws FileNotFoundException, IOException {
    Field f = null;
    f = key.getPrivate().getClass().getDeclaredField("sk");
    if (f != null) {
        f.setAccessible(true);
        Object fieldContent = null;
        fieldContent = f.get(key.getPrivate());
        if (fieldContent != null) {
            byte[] data = null;
            if (fieldContent instanceof ImmutableZrElement) {
                ImmutableZrElement izr = (ImmutableZrElement)fieldContent;
                data = izr.toBytes();
            }
            try (FileOutputStream fos = new FileOutputStream(filename)) {
                fos.write(data);
            }
        }
    }
}

对公钥使用类似的方法。这意味着,我现在只能使用反射来检索私有字段的内容,以便将其存储在某个地方。该解决方案显然是各种臭味的杂乱无章的集合,但这是迄今为止我所能想到的最好的解决方案。我知道向磁盘写一些字节实际上并不那么难,但是我似乎真的找不到合适的方法来做到这一点。另外,直言不讳,我不喜欢加密:我想应用此方案来签名和验证一些消息,仅此而已。我知道我应该更深入地研究整个方法的数学原理,但是时间有限-这就是为什么我首先选择了一个库。

0 个答案:

没有答案