首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Bouncy城堡实现电子投票系统

用Bouncy城堡实现电子投票系统
EN

Stack Overflow用户
提问于 2014-04-05 19:38:18
回答 1查看 545关注 0票数 1

我正在开发一个基于Foo92协议的电子投票系统。我是新来的巴奇城堡图书馆的。但是我不得不告诉大家,这个基于RSA算法的盲签名系统。这个计划(FOO92)有一个图表,我已经上传给你了。我想知道如何盲目地签署和验证它在巴奇城堡图书馆。请帮我解决我的问题。谢谢大家。

请注意,*操作员是致盲操作员。和/运算符是非致盲运算符。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-06 12:02:29

最后,我已经为FOO92的电子投票协议编写了一段带弹跳城堡的代码。这是一堂课:

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Org.BouncyCastle;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Signers;
using Org.BouncyCastle.Crypto.Digests;
using System.Windows.Forms;

namespace FooTest
{
    class FooImplementing
    {
        private RsaBlindingEngine rsaBlindingEngine = new RsaBlindingEngine();
        private RsaBlindingFactorGenerator blindingFactorGenerator = new RsaBlindingFactorGenerator();
        private RsaBlindingParameters blindingParameteres;
        private RsaKeyPairGenerator aliceRsaKeyGenerator = new RsaKeyPairGenerator();
        private AsymmetricCipherKeyPair aliceKeyPair;
        private RsaKeyPairGenerator bobRsaKeyGenerator = new RsaKeyPairGenerator();
        private AsymmetricCipherKeyPair bobKeyPair;
        private byte[] inputMessage;
        public FooImplementing(string message)
        {
            inputMessage = getBytes(message);
            aliceRsaKeyGenerator.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
            aliceKeyPair = aliceRsaKeyGenerator.GenerateKeyPair();
            //******************************************************************************
            bobRsaKeyGenerator.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
            bobKeyPair = bobRsaKeyGenerator.GenerateKeyPair();
            //******************************************************************************
            blindingFactorGenerator.Init(bobKeyPair.Public);
            blindingParameteres = new RsaBlindingParameters((RsaKeyParameters)bobKeyPair.Public, blindingFactorGenerator.GenerateBlindingFactor());
        }

        public byte[] getBytes(string input)
        {
            byte[] bytes = new byte[input.Length * sizeof(char)];
            System.Buffer.BlockCopy(input.ToCharArray(), 0, bytes, 0, bytes.Length);
            return bytes;
        }

        public string GetString(byte[] bytes)
        {
            char[] chars = new char[bytes.Length / sizeof(char)];
            System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
            return new string(chars);
        }

        public byte[] blindTheMessage(TextBox t1)
        {
            for (int i = 0; i < inputMessage.Length; i++)
            {
                t1.Text += inputMessage[i].ToString();
            }
            PssSigner messageBlinder = new PssSigner(rsaBlindingEngine, new Sha1Digest(), 15);
            messageBlinder.Init(true, blindingParameteres);
            messageBlinder.BlockUpdate(inputMessage, 0, inputMessage.Length);
            byte[] blindedMessage = messageBlinder.GenerateSignature();
            return blindedMessage;
        }

        public byte[] blindSignature(byte[] input)
        {
            RsaEngine rsaEngine = new RsaEngine();
            rsaEngine.Init(true, bobKeyPair.Private);
            byte[] blindSignedMessage = rsaEngine.ProcessBlock(input, 0, input.Length);
            return blindSignedMessage;
        }

        public byte[] unblindeTheSignedData(byte[] input)
        {
            rsaBlindingEngine.Init(false, blindingParameteres);
            byte[] messageForSending = rsaBlindingEngine.ProcessBlock(input, 0, input.Length);
            return messageForSending;
        }

        public bool verifyBlindSignature(byte[] input, TextBox t1)
        {            
            PssSigner verifier = new PssSigner(new RsaEngine(), new Sha1Digest(), 15);
            verifier.Init(false, bobKeyPair.Public);
            verifier.BlockUpdate(inputMessage, 0, inputMessage.Length);
            for (int i = 0; i < inputMessage.Length; i++)
            {
                t1.Text += inputMessage[i].ToString();
            }
            return verifier.VerifySignature(input);
        }

        public byte[] signedWithRsa(byte[] input)
        {
            ISigner signer = SignerUtilities.GetSigner("SHA1withRSA");
            signer.Init(true, aliceKeyPair.Private);
            signer.BlockUpdate(input, 0, input.Length);
            byte[] signedData = signer.GenerateSignature();
            return signedData;
        }

        public bool verifyRsaSignedData(byte[] input, byte[] signature)
        {
            ISigner verifier = SignerUtilities.GetSigner("SHA1withRSA");
            verifier.Init(false, aliceKeyPair.Public);
            verifier.BlockUpdate(input, 0, input.Length);
            return verifier.VerifySignature(signature);
        }

    }
}

下面是运行foo协议的步骤。当然,它没有一些步骤,比如id发送,但是它的功能和Foo协议一样真实

代码语言:javascript
运行
复制
FooImplementing foo = new FooImplementing("Behzad");
var blindedMessage = foo.blindTheMessage(textBox2);
var userSignature = foo.signedWithRsa(blindedMessage);
if (foo.verifyRsaSignedData(blindedMessage, userSignature))
{
     var signedMessage = foo.blindSignature(blindedMessage);
     var unblindedMessage = foo.unblindeTheSignedData(signedMessage);
     MessageBox.Show(foo.verifyBlindSignature(unblindedMessage, textBox3).ToString());
 }

请注意,文本框用于收集结果,而不是我的程序的一部分。谢谢你们所有人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22885825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档