区块链日记程序

Posted Natuki丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链日记程序相关的知识,希望对你有一定的参考价值。

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



一、题目要求

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

二、模板规划

读取模板:

记录模板:

三、源码

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网站中根据控制台提供的信息查询交易;

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

以上是关于区块链日记程序的主要内容,如果未能解决你的问题,请参考以下文章

王团长区块链日记974篇:我老感觉最近币圈要涨

用Java为Hyperledger Fabric(超级账本)编写区块链智能合约链代码

低代码开发区块链应用

区块链新趋势,IPFS风口来袭,Filecoin价值千万

LeetCode刷题日记精选例题(附代码+链接)

区块链项目之平台类|币经百科