大三的資料安全課程設計,,希望能對你的課設或專案有所幫助
文章目錄
- 一、題目要求
- 二、模板規劃
- 讀取模板:
- 記錄模板:
- 三、原始碼
- 四、演示界面
一、題目要求
程式可以輸入日記內容
需要將日記內容進行加密
能夠將加密資料寫入區塊鏈
能夠讀取鏈上加密資料
讀取的加密資料進行解密
解密后在程式中顯示
二、模板規劃
讀取模板:

記錄模板:

三、原始碼
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://www.uj5u.com/qukuanlian/300046.html
標籤:區塊鏈
上一篇:BTC原始碼分析 準備
