当前位置:首页 » 《资源分享》 » 正文

区块链日记程序_Natukiaaa的博客

16 人参与  2021年10月23日 10:43  分类 : 《资源分享》  评论

点击全文阅读


大三的数据安全课程设计。。希望能对你的课设或项目有所帮助


文章目录

  • 一、题目要求
  • 二、模板规划
    • 读取模板:
    • 记录模板:
  • 三、源码
  • 四、演示界面


一、题目要求

程序可以输入日记内容
需要将日记内容进行加密
能够将加密数据写入区块链
能够读取链上加密数据
读取的加密数据进行解密
解密后在程序中显示

二、模板规划

读取模板:

在这里插入图片描述

记录模板:

在这里插入图片描述

三、源码

using System;
using System.Collections.Generic;
using BsvSimpleLibrary;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using NBitcoin;
using NBitcoin.DataEncoders;
using BitcoinSVCryptor;

namespace 日记
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if(textBox1.Text=="")
            {
                MessageBox.Show("私钥不能为空");
            }
            string privateKeyStr = textBox1.Text;
            BitcoinSecret privateKey;
            try
            {
                privateKey = new BitcoinSecret(privateKeyStr);
                string network = "";
                if (privateKey.Network == Network.TestNet)
                {
                    network = bsvConfiguration_class.testNetwork;
                }
                else if (privateKey.Network == Network.Main)
                {
                    network = bsvConfiguration_class.mainNetwork;
                }
                else
                {
                    MessageBox.Show("网络错误!");
                }
                PubKey pubKey = privateKey.PubKey;  
                string pubkeyStr = pubKey.ToHex();
                KeyId pkhash = pubKey.Hash;
                string pkhashStr = pkhash.ToString();
                BitcoinAddress address = pkhash.GetAddress(privateKey.Network);
                string addressStr = address.ToString();
                string addrStr = privateKey.PubKeyHash.GetAddress(privateKey.Network).ToString();
                string destAddress = addressStr;
                string uri = bsvConfiguration_class.RestApiUri;
                Base58Encoder base58Encoder = new Base58Encoder();
                byte[] cipherBase58Bytes = base58Encoder.DecodeData(richTextBox3.Text);
                string plaintextStr = AES_class.AesDecrypt(cipherBase58Bytes, privateKeyStr);
                richTextBox2.Clear();
                richTextBox2.AppendText(plaintextStr + '\n');
                Task<RestApiAddressHistoryTx[]> addrHistoryTask = Task.Run(() =>
                {
                    RestApiAddressHistoryTx[] addrHistory2 = RestApi_class.getAddressHistory(uri, network, addrStr);
                    return addrHistory2;
                });
                addrHistoryTask.Wait();
                RestApiAddressHistoryTx[] addrHistory = addrHistoryTask.Result;
                List<string> txHashs = new List<string> { };

                for (int i = 0; i < addrHistory.Length; i++)
                {
                    txHashs.Add(addrHistory[i].TxHash);
                }
                Task<RestApiTransaction[]> transactionsTask = Task.Run(() =>
                {
                    RestApiTransaction[] transactionsTemp = new RestApiTransaction[txHashs.Count];
                    for (int i = 0; i < txHashs.Count; i++)
                    {
                        transactionsTemp[i] = RestApi_class.getTransaction(uri, network, txHashs[i]);
                    }
                    return transactionsTemp;
                });
                transactionsTask.Wait();
                RestApiTransaction[] transactions = transactionsTask.Result;
               List<string> opReturnDataStrings = new List<string> { };
                for (int i = 0; i < txHashs.Count; i++)
                {
                    opReturnDataStrings.Add(RestApi_class.getOpReturnData
                        (transactions[i], bsvConfiguration_class.encoding));
                }
                Console.WriteLine();
                foreach (var opReturnDataString in opReturnDataStrings)
                {
                    if (opReturnDataString != null)
                    {

                        try
                        {
                            byte[] tempBase58Bytes = base58Encoder.DecodeData(opReturnDataString);
                            richTextBox4.AppendText(opReturnDataString + '\n');
                            string tempDecrypt = AES_class.AesDecrypt(tempBase58Bytes, privateKeyStr);
                            richTextBox1.AppendText(tempDecrypt + '\n');
                        }
                        catch (Exception)
                        {
                            richTextBox1.AppendText(opReturnDataString);
                        }
                    }
                }
            }
            catch (Exception)
            {

                MessageBox.Show("私钥无效!");
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string wifPrivateKeyStr = textBox1.Text;
            BitcoinSecret privateKey = new BitcoinSecret(wifPrivateKeyStr);
            string privateKeyStr = privateKey.ToString();
            string plaintextStr = richTextBox2.Text;
            byte[] aesEncryptedTextBytes = AES_class.AesEncrypt(plaintextStr, privateKeyStr);

            Base58Encoder base58Encoder = new Base58Encoder();
            string base58TextData = base58Encoder.EncodeData(aesEncryptedTextBytes);

            string network = string.Empty;

            if (privateKey.Network == Network.TestNet)
            {
                network = bsvConfiguration_class.testNetwork;
            }
            else if (privateKey.Network == Network.Main)
            {
                network = bsvConfiguration_class.mainNetwork;
            }
            else
            {
                MessageBox.Show("网络错误!");
            }

            string destAddress = privateKey.PubKeyHash.GetAddress(privateKey.Network).ToString();
            try
            {
                Task<Dictionary<string, string>> sendTask = Task.Run(() =>
                {

                    Dictionary<string, string> response = bsvTransaction_class.send(privateKeyStr, 0, network, destAddress, null, base58TextData, 0.5, 0);
                    return response;

                });
                sendTask.Wait();

            }
            catch (Exception)

            {

                MessageBox.Show("发送失败!");
            }
            richTextBox3.Clear();

            richTextBox3.Text += base58TextData;

            richTextBox1.AppendText(plaintextStr+'\n');
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void richTextBox4_TextChanged(object sender, EventArgs e)
        {
        }
        private void richTextBox4_TextChanged_1(object sender, EventArgs e)
        {

        }
        private void label5_Click(object sender, EventArgs e)
        {

        }

}

}

四、演示界面

初始界面如图所示
在这里插入图片描述

本程序的健壮性有一定的保证,在默认私钥为空时是不能读取和记录的
在这里插入图片描述

输入无效的秘钥也有处理:
在这里插入图片描述

在Electrum钱包中找到本账户的私钥,如图所示:
在这里插入图片描述

在输入相应私钥后,点击读取,读取本账户链上的信息,该信息是经过Aes高级加密标准加密过的,读取时读到的是密文,在右上角输出框中显示
经过AES解密后还原其相应的明文在左上角输出框,如图所示

在这里插入图片描述

同时,控制台中会显示相应交易信息的历史记录详细信息:
例如txid、哈希值、区块大小等信息

在这里插入图片描述

本地记录信息时在左下角的输入框中输入需要记录上链的信息,本例以”you are the best”为例,在输入完成后点击记录按钮,程序自动对明文进行加密,加密后的内容如右下角所示,
再将加密后的密文发送上链,同时在本地将记录的信息发送到左上角明文输出框中

在这里插入图片描述

上链完成后,其区块信息在控制台中显示如图:
在这里插入图片描述

我们可以在whatsonchain网站中根据控制台提供的信息查询交易;
在这里插入图片描述

可以看到本交易密文和网站上记录的内容一致:

![在这里插入图片描述](https://img-blog.csdnimg.cn/1421a796b60a4a6e87de95fb8530f752.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATmF0dWtp5Li2,size_20,color_FFFFFF,t_70,g_se,x_16


点击全文阅读


本文链接:http://www.zhangshiyu.com/post/30126.html

加密  读取  记录  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 我转岗做文员后,自称尸语者的男友小青梅急了江晚晴陆景行完本_我转岗做文员后,自称尸语者的男友小青梅急了(江晚晴陆景行)
  • 前传苏小朵卫献知续集:全文+番外穿成炮灰原配,首长白天总拉窗帘:结局+番外新上热文
  • 犹若清风梦了云列表_犹若清风梦了云(晏临渊叶知薇谢执玉)
  • 春风不渡无心人结局+完结(林至南霍以峦)_春风不渡无心人结局+完结(林至南霍以峦)
  • 犹若清风梦了云晏临渊全新叶知薇
  • 被太子捡到后,小娇花她又野又飒小说(钟离廷如花花)最近更新(被太子捡到后,小娇花她又野又飒)整本无套路阅读
  • 全书浏览盛景如诗不歇免费(顾崇高夏凌霜)_盛景如诗不歇免费(顾崇高夏凌霜)全书结局
  • 夏凌霜的盛景如诗不歇结局+番外顾崇高夏凌霜全书在线
  • 开局逆天改命,不是哥们你奇门真通神?后续+完结_叶小道陈笑笑强推_小说后续在线阅读_无删减免费完结_
  • 相公考中状元,我却自甘为青楼花魁杀他全家全文+后续_裴知夜裴家云娘结局_小说后续在线阅读_无删减免费完结_
  • 全书浏览我转岗做文员后自称尸语者的男友小青梅急了篇(江晚晴陆景行韩依依)_我转岗做文员后自称尸语者的男友小青梅急了篇(江晚晴陆景行韩依依)全书结局
  • 碰瓷糙野硬汉后,八零美人三年抱俩小说(沈茵茵霍枭)+起点章节(碰瓷糙野硬汉后,八零美人三年抱俩)阅读

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1