使用RSA签名和散列

直接上代码:

        public CngKey _aliceKey;
        public byte[] _alicePubKeyBlob;
        static void Main(string[] args)
        {
            byte[] doc;
            byte[] hash;
            byte[] signature;
            var pro = new Program();
            pro.AliceTasks(out doc,out hash,out signature);
            pro.BobTasks(doc, hash, signature);
            Console.ReadLine();
        }
        public void AliceTasks(out byte[] data, out byte[] hash, out byte[] signature)
        {
            InitAliceKeys();
            data = Encoding.UTF8.GetBytes("艾丽斯的问候");
            hash = HashDocument(data);
            signature = AddSignatureToHash(hash, _aliceKey);
        }

        private void InitAliceKeys()
        {
            _aliceKey = CngKey.Create(CngAlgorithm.Rsa);
            _alicePubKeyBlob = _aliceKey.Export(CngKeyBlobFormat.GenericPublicBlob);
        }
        private byte[] HashDocument(byte[] data)
        {
            using (var hashAlg = SHA384.Create())
            {
                return hashAlg.ComputeHash(data);
            }
        }
        private byte[] AddSignatureToHash(byte[] hash, CngKey key)
        {
            using (var signingAlg = new RSACng(key))
            {
                byte[] signed = signingAlg.SignHash(hash, HashAlgorithmName.SHA384, RSASignaturePadding.Pss);
                return signed;
            }
        }
        public void BobTasks(byte[] data, byte[] hash, byte[] signature)
        {
            CngKey aliceKey = CngKey.Import(_alicePubKeyBlob,CngKeyBlobFormat.GenericPublicBlob);
            if (!IsSignatureValid(hash, signature, aliceKey))
            {
                Console.WriteLine("签名无效");
                return;
            }
            if (!IsDocumentUnChanged(hash, data))
            {
                Console.WriteLine("文档已更改");
            }
            Console.WriteLine("签名有效文档未更改");
            Console.WriteLine($"来自Alice的文档:{Encoding.UTF8.GetString(data)}");
        }
        private bool IsSignatureValid(byte[] hash, byte[] signature, CngKey key)
        {
            using (var SigningAlg = new RSACng(key))
            {
                return SigningAlg.VerifyHash(hash, signature, HashAlgorithmName.SHA384, RSASignaturePadding.Pss);
            }
        }
        private bool IsDocumentUnChanged(byte[] hash, byte[] data)
        {
            byte[] newHash = HashDocument(data);
            return newHash.SequenceEqual(hash);
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双叶红于二月花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值