Zksnark--终极原理(四)

上一篇讲到
Anna不知道t,也就不能找到合适的H(t)正好使E(P(t)) = E(H(t) * Z(t))成立
但是也有个问题就是
系数向量A(n)、B(n)和C(n)代表要求解的问题本身。假设Prover不知道使“s . C(n) - s . A(n) * s . B(n) = H(n) * Z(n)”成立的解s,但知道另一个问题的解s’:s’ . C’(n) - s’ . A’(n) * s’ = H’(n) * Z(n)。
Prover便可用不同于原始问题的系数向量A‘(n)、B’(n)和C‘(n)来生成P’(n) = s . C’(n) - s . A’(n) * s . B’(n),然后将P’(n)和H’(n)作为响应发给Verifier,那么Verifier一定会得出prover知道解的结论。
解决这个问题的方法用到了KCA,先用一个简答的例子解释KCA:
在这里插入图片描述
简单解释就是B给A一对(a,b),A返回(c,d)给B,如果A是通过B的(b,a)算出的(c,d),则c,d也应符合d=αc,而这个α只有B知道,这时他就可以验证是否正确。
将上面的例子推广一下同理:
在这里插入图片描述

接下来需要在零知识证明中应用KCA
在这里插入图片描述

左边列的A(n),B(n),C(n)经过KCA变换,变成了右边列。
原先传送如下图:
在这里插入图片描述
用KCA之后如下:
在这里插入图片描述
在这里插入图片描述
进一步提出问题:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后一步用到了CRS将交互式的零知识证明变成了非交互式;
所以ZK-SNARK被称为预处理的简洁的非交互式的知识论证,它需要一个可信的设置,一对匹配友好的椭圆曲线并依赖强有力的假设。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
我理解到您需要一个代码实现来模拟zk-SNARK协议的过程。请注意,zk-SNARK是一种复杂的加密协议,需要深入的数学和计算机科学知识来理解和实现。在此,我将为您提供一个基本的实现框架,但这只是一个简化版本,没有进行实际的加密处理。 首先,让我们来了解一下zk-SNARK协议的基本流程: 1. 生成公私钥对 2. 生成证明 3. 验证证明 我们将按照这个流程来实现这个协议。 1. 生成公私钥对 我们首先需要一个密钥对,用于加密和解密。在zk-SNARK中,这个密钥对由一个大素数p和一个随机数g生成。我们可以使用Java的`java.util.Random`类来生成随机数,并使用`java.math.BigInteger`类来进行大数运算。 ```java import java.math.BigInteger; import java.util.Random; public class Zksnark { private BigInteger p, g, privateKey, publicKey; public Zksnark() { // Generate a random prime p and a random number g Random rand = new Random(); p = BigInteger.probablePrime(512, rand); g = new BigInteger(512, rand); // Generate a random private key and corresponding public key privateKey = new BigInteger(512, rand).mod(p); publicKey = g.modPow(privateKey, p); } public void printKeys() { System.out.println("Private key: " + privateKey.toString()); System.out.println("Public key: " + publicKey.toString()); } } ``` 2. 生成证明 下一步是生成证明。在zk-SNARK中,证明包含两个部分:一个公共部分和一个私有部分。公共部分可以由任何人验证,而私有部分只能由拥有私钥的人生成。我们将使用Java的`MessageDigest`类来生成哈希值,并使用`java.security.Signature`类来生成签名。 ```java import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Signature; import java.security.SignatureException; public class Zksnark { private BigInteger p, g, privateKey, publicKey; public Zksnark() { // ... } public void printKeys() { // ... } public String generateProof(String message) { // Generate a public hash of the message String publicHash = generateHash(message); // Sign the message using the private key byte[] signature = signMessage(publicHash); // Combine the public hash and signature to generate the proof return publicHash + ":" + new BigInteger(signature).toString(); } private String generateHash(String message) { try { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] hash = md.digest(message.getBytes()); return new BigInteger(hash).toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } private byte[] signMessage(String message) { try { Signature sig = Signature.getInstance("SHA256withRSA"); sig.initSign(privateKey); sig.update(message.getBytes()); return sig.sign(); } catch (Exception e) { e.printStackTrace(); } return null; } } ``` 3. 验证证明 最后一步是验证证明。在zk-SNARK中,验证者可以通过公共证明来验证证明的正确性。我们将使用Java的`java.security.Signature`类来验证签名,并使用`java.math.BigInteger`类来进行大数运算。 ```java import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Signature; import java.security.SignatureException; import java.util.Arrays; public class Zksnark { private BigInteger p, g, privateKey, publicKey; public Zksnark() { // ... } public void printKeys() { // ... } public String generateProof(String message) { // ... } public boolean verifyProof(String proof, String message) { // Split the proof into public hash and signature String[] parts = proof.split(":"); String publicHash = parts[0]; byte[] signature = new BigInteger(parts[1]).toByteArray(); // Generate the public hash of the message String expectedHash = generateHash(message); // Verify the signature using the public key boolean signatureValid = verifySignature(signature, publicHash); // Verify that the public hash matches the expected hash boolean hashValid = publicHash.equals(expectedHash); // Return true if the signature and hash are both valid return signatureValid && hashValid; } private boolean verifySignature(byte[] signature, String message) { try { Signature sig = Signature.getInstance("SHA256withRSA"); sig.initVerify(publicKey); sig.update(message.getBytes()); return sig.verify(signature); } catch (Exception e) { e.printStackTrace(); } return false; } private String generateHash(String message) { try { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] hash = md.digest(message.getBytes()); return new BigInteger(hash).toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } } ``` 这就是一个简单的zk-SNARK协议的Java实现。请注意,这只是一个基本的实现框架,没有进行实际的加密处理。如果您需要更高级的实现,请参考相关的文献和代码库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值