我们需要一种使用尽可能短的签名来签名消息的方法,这种签名遇到了BLS方案,这保证了相当短的签名。尝试使用JPBC实现时,这些示例易于设置和运行,但是缺少一个相当关键的部分:存储和加载私钥。
store
方法,此方法似乎已从该库中删除赞成不包含任何存储功能的实现。AsymmetricCipherKeyPair
实例(这是我从密钥生成器中获得的)不能自行序列化,BLS01PublicKeyParameters
或BLS01PrivateKeyParameters
的实例也不能使用包含密钥的字段进行序列化( sk
和pk
)是私有的,仅输入到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);
}
}
}
}
对公钥使用类似的方法。这意味着,我现在只能使用反射来检索私有字段的内容,以便将其存储在某个地方。该解决方案显然是各种臭味的杂乱无章的集合,但这是迄今为止我所能想到的最好的解决方案。我知道向磁盘写一些字节实际上并不那么难,但是我似乎真的找不到合适的方法来做到这一点。另外,直言不讳,我不喜欢加密:我想应用此方案来签名和验证一些消息,仅此而已。我知道我应该更深入地研究整个方法的数学原理,但是时间有限-这就是为什么我首先选择了一个库。