- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要类似的功能,如规定 Easy way to store/restore encryption key for decrypting string in java
但我的情况有所不同。在上面的链接中,他们使用 javax.crypto.*
但在我的例子中,我使用 org.bouncycaSTLe.crypto.*
和 it.unisa.dia。 Gas.crypto.jpbc.fe.abe.gghsw13.generators.*
我想将主 key 、公钥和私钥存储在不同的文件中,并从文件中检索这些 key 。怎么做?
下面是我留下 TODO 的代码。工作代码可以在 github 上找到.
import it.unisa.dia.gas.crypto.circuit.BooleanCircuit;
import it.unisa.dia.gas.crypto.circuit.BooleanCircuit.BooleanCircuitGate;
import it.unisa.dia.gas.crypto.jpbc.fe.abe.gghsw13.engines.GGHSW13KEMEngine;
import it.unisa.dia.gas.crypto.jpbc.fe.abe.gghsw13.generators.GGHSW13KeyPairGenerator;
import it.unisa.dia.gas.crypto.jpbc.fe.abe.gghsw13.generators.GGHSW13ParametersGenerator;
import it.unisa.dia.gas.crypto.jpbc.fe.abe.gghsw13.generators.GGHSW13SecretKeyGenerator;
import it.unisa.dia.gas.crypto.jpbc.fe.abe.gghsw13.params.*;
import it.unisa.dia.gas.crypto.kem.cipher.engines.KEMCipher;
import it.unisa.dia.gas.crypto.kem.cipher.params.KEMCipherDecryptionParameters;
import it.unisa.dia.gas.crypto.kem.cipher.params.KEMCipherEncryptionParameters;
import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;
import it.unisa.dia.gas.plaf.jpbc.util.concurrent.ExecutorServiceUtils;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import java.security.GeneralSecurityException;
import java.security.SecureRandom;
import java.security.Security;
import java.security.spec.AlgorithmParameterSpec;
import java.util.ArrayList;
import java.util.List;
import static it.unisa.dia.gas.crypto.circuit.Gate.Type.*;
public class Example {
protected KEMCipher kemCipher;
protected AlgorithmParameterSpec iv;
protected AsymmetricCipherKeyPair keyPair;
public Example() throws GeneralSecurityException {
this.kemCipher = new KEMCipher(
Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"),
new GGHSW13KEMEngine()
);
// build the initialization vector. This example is all zeros, but it
// could be any value or generated using a random number generator.
iv = new IvParameterSpec(new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
}
public AsymmetricCipherKeyPair setup(int n) {
GGHSW13KeyPairGenerator setup = new GGHSW13KeyPairGenerator();
setup.init(new GGHSW13KeyPairGenerationParameters(
new SecureRandom(),
new GGHSW13ParametersGenerator().init(
PairingFactory.getPairing("params/mm/ctl13/toy.properties"),
n).generateParameters()
));
return (keyPair = setup.generateKeyPair());
}
public byte[] initEncryption(String assignment) {
try {
return kemCipher.init(
true,
new KEMCipherEncryptionParameters(
128,
new GGHSW13EncryptionParameters(
(GGHSW13PublicKeyParameters) keyPair.getPublic(),
assignment
)
),
iv
);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public byte[] encrypt(String message) {
try {
return kemCipher.doFinal(message.getBytes());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public CipherParameters keyGen(BooleanCircuit circuit) {
GGHSW13SecretKeyGenerator keyGen = new GGHSW13SecretKeyGenerator();
keyGen.init(new GGHSW13SecretKeyGenerationParameters(
((GGHSW13PublicKeyParameters) keyPair.getPublic()),
((GGHSW13MasterSecretKeyParameters) keyPair.getPrivate()),
circuit
));
return keyGen.generateKey();
}
public byte[] decrypt(CipherParameters secretKey, byte[] encapsulation, byte[] ciphertext) {
try {
kemCipher.init(
false,
new KEMCipherDecryptionParameters(secretKey, encapsulation, 128),
iv
);
return kemCipher.doFinal(ciphertext);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
Security.addProvider(new BouncyCastleProvider());
try {
// Setup
int n = 4;
Example engine = new Example();
engine.setup(n);
// TODO: Here I want to store (GGHSW13PublicKeyParameters) keyPair.getPublic() and
// (GGHSW13MasterSecretKeyParameters) keyPair.getPrivate() in files and later to retrieve from file
// Encrypt
String message = "Hello World!!!";
byte[] encapsulation = engine.initEncryption("1101");
byte[] ciphertext = engine.encrypt(message);
BooleanCircuitGate bcg1 = new BooleanCircuitGate(INPUT, 0, 1);
BooleanCircuitGate[] bcgs = new BooleanCircuitGate[]{
new BooleanCircuitGate(INPUT, 0, 1),
new BooleanCircuitGate(INPUT, 1, 1),
new BooleanCircuitGate(INPUT, 2, 1),
new BooleanCircuitGate(INPUT, 3, 1),
new BooleanCircuitGate(AND, 4, 2, new int[]{0, 1}),
new BooleanCircuitGate(OR, 5, 2, new int[]{2, 3}),
new BooleanCircuitGate(AND, 6, 3, new int[]{4, 5}),
};
List<BooleanCircuitGate> bcgList = new ArrayList<BooleanCircuitGate>();
bcgList.add(bcg1);
bcgList.add(new BooleanCircuitGate(INPUT, 1, 1));
bcgList.add(new BooleanCircuitGate(INPUT, 2, 1));
bcgList.add(new BooleanCircuitGate(INPUT, 3, 1));
bcgList.add(new BooleanCircuitGate(AND, 4, 2, new int[]{0, 1}));
bcgList.add(new BooleanCircuitGate(OR, 5, 2, new int[]{2, 3}));
bcgList.add(new BooleanCircuitGate(AND, 6, 3, new int[]{4, 5}));
// Decrypt
int q = 3;
BooleanCircuit circuit = new BooleanCircuit(n, q, 3, bcgList.toArray(new BooleanCircuitGate[bcgList.size()]));
GGHSW13SecretKeyParameters secretKey = (GGHSW13SecretKeyParameters) engine.keyGen(circuit);
// TODO: Want to store secretKey in file and later to retrieve from file
byte[] plaintext = engine.decrypt(secretKey, encapsulation, ciphertext);
System.out.println(new String(plaintext));
} catch (Exception e) {
e.printStackTrace();
} finally {
ExecutorServiceUtils.shutdown();
}
}
}
最佳答案
生成主 key 和公共(public)参数后,您应该存储它们,以便稍后实际使用它们。 jPBC 不为您提供存储这些 key 的方法。另外,由于 key 继承自 org.bouncycaSTLe.crypto.params.AmetryKeyParameter
,因此您无法使用 Java 的序列化,因为 AmetryKeyParameter
没有实现 Serializable
接口(interface)。它doesn't无需工作。
您需要自己实现序列化。首先,您必须考虑要序列化的键中包含哪些类型的对象。对于 GGHSW13MasterSecretKeyParameters
类,这是一个 Element
、一个 int
和一个 Pairing
。
首先,您必须考虑是否要在序列化 key 中包含配对
。如果这样做,则必须将其写入开头,以便稍后能够使用它来反序列化 Element
。
如果我们假设 Pairing
实例是常量或始终由外部代码提供,则序列化非常容易。您应该在前面编写一个格式版本,这样您就可以一路更改格式,而无需丢弃所有以前序列化的 key 。由于我两年前遇到的一个错误,编写元素有点棘手。基本思想是写入元素字节的长度,后跟元素的内容。
public void serialize(GGHSW13MasterSecretKeyParameters msk, OutputStream out) throws IOException {
DataOutputStream dOut = new DataOutputStream(out);
dOut.writeInt(1); // version of the serialized format
dOut.writeInt(msk.getParameters().getN());
serialize(msk.getAlpha(), dOut, msk.getParameters().getPairing());
}
public void serialize(Element elem, DataOutputStream dOut, Pairing pairing) throws IOException {
dOut.writeBoolean(elem == null);
if (elem == null) {
return;
}
dOut.writeInt(pairing.getFieldIndex(elem.getField()));
byte[] bytes = elem.toBytes();
dOut.writeInt(bytes.length);
dOut.write(bytes);
// this is a workaround because it.unisa.dia.gas.plaf.jpbc.field.curve.CurveElement does not serialize the infFlag
dOut.writeBoolean(elem instanceof CurveElement && elem.isZero());
if (elem instanceof CurveElement && elem.isZero()) {
throw new IOException("Infinite element detected. They should not happen.");
}
}
OutputStream
可以类似于 FileOutputSteam
或 ByteArrayOutputStream
。
反序列化同样容易,但您需要显式提供配对
,并且需要确保始终读取完全您请求的字节数。您请求的字节数可以从数据前面写入的 length int 得知。如果您不检查该长度是否有意义,则可能会引入安全问题,例如拒绝服务漏洞或远程代码执行。
public GGHSW13MasterSecretKeyParameters deserialize(InputStream in, Pairing pairing) throws IOException {
DataInputStream dIn = new DataInputStream(in);
int version = dIn.readInt();
if (version != 1) {
throw new RuntimeException("Unknown key format version: " + version);
}
int n = dIn.getInt();
Element alpha = deserialize(dIn, pairing);
return new GGHSW13MasterSecretKeyParameters(
new GGHSW13Parameters(pairing, n),
alpha
);
}
public Element deserialize(DataInputStream dIn, Pairing pairing) throws IOException {
if (dIn.readBoolean()) {
return null;
}
int fieldIndex = dIn.readInt(); // TODO: check if this is in a sensible range
int length = dIn.readInt(); // TODO: check if this is in a sensible range
byte[] bytes = new byte[length];
dIn.readFully(bytes); // throws an exception if there is a premature EOF
Element e = pairing.getFieldAt(fieldIndex).newElementFromBytes(bytes);
// this is a workaround because it.unisa.dia.gas.plaf.jpbc.field.curve.CurveElement does not serialize the infFlag
boolean instOfCurveElementAndInf = dIn.readBoolean();
if (instOfCurveElementAndInf) {
//e.setToZero(); // according to the code this simply sets the infFlag to 1
throw new IOException("The point is infinite. This shouldn't happen.");
}
return e;
}
这是一个很小的二进制序列化。还有其他可能性,例如将所有组件编码为字符串并使用 JSON。
关于java - 从 jPBC 保存和加载非对称 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43486719/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!