分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!
http://www.captainbed.net/xiaohei <http://www.captainbed.net/xiaohei>

<>C/C++实现区块链(中)之算法实现(原创代码,转载必究)


上一篇文章我们讲述了区块链实现的基本算法原理,传送门https://blog.csdn.net/qq_27180763/article/details/82588136
这一节我将用C/C++技术来和大家分享区块链技术中的加密算法实现。

###1、矩阵类实现
class Martix { public: static const int circle_s = 1; //假定向量环路为1; static const
int KEY =Martix::circle_s * 8; private: unsigned long long
martix_4_2[Martix::KEY / 2][2]; //存储向量矩阵 unsigned long long
martix_8_8[Martix::KEY][Martix::KEY]; //存储由向量矩阵得到的转置矩阵 unsigned long long
martix_complete[KEY * 2]; //存储操作完成后的矩阵(一维) public: Martix(string a) {};
Martix(int a, int b,int circle) { int key = 8; int cir = circle; while (cir--)
{ martix_4_2[key / 2 - 4][0] = (-1)*b; martix_4_2[key / 2 - 4][1] = (-1)*a;
martix_4_2[key / 2 - 3][0] = b; martix_4_2[key / 2 - 3][1] = (-1)*a;
martix_4_2[key / 2 - 2][0] = b; martix_4_2[key / 2 - 2][1] = a; martix_4_2[key
/ 2 - 1][0] = (-1)*b; martix_4_2[key / 2 - 1][1] = a; key += 8; } } void
Change_New_Martix() { for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++)
{ martix_8_8[i][j] = 0; } } for (int j = 2; j < KEY / 2 + 2; j++) {
martix_8_8[0][j] = martix_4_2[j - 2][0] * (-1); martix_8_8[1][j] = martix_4_2[j
- 2][1] * (-1); } for (int i = 2; i < KEY / 2 + 2; i++) { martix_8_8[i][0] =
martix_4_2[i - 2][0] * (-1); martix_8_8[i][1] = martix_4_2[i - 2][1] * (-1); }
for (int i = 2; i < KEY / 2 + 2; i++) { for (int j = 2; j < KEY / 2 + 2; j++) {
martix_8_8[i][j] = 0; } } } public: void Save_Martix() { int key = 0; for (int
i = 0; i < KEY / 2 + 2; i++) { for (int j = 0; j < KEY / 2 + 2; j++) { if
(martix_8_8[i][j] != 0) { martix_complete[key++] = martix_8_8[i][j]; } } } }
unsigned long long GetPublicKey() { unsigned long long public_key =
martix_complete[0]; for (int i = 1; i < KEY * 2; i++) { if (i % 2 == 0) {
public_key = public_key + martix_complete[i]; } else { public_key = public_key
* martix_complete[i]; } } return public_key; } };
###2、加密算法实现
class Cryptography :Martix { public: /*作为私钥,发送方保存内容*/ unsigned long long a;
//椭圆长轴的半轴长度 unsigned long long b; //椭圆短轴的半轴长度 /*作为公钥,接收方接受公钥*/ unsigned long
long public_Key; //通过椭圆矩阵算法得到的公钥G Moving_Point p; //随机选定的在椭圆上的点 public:
Cryptography(string a) :Martix("OK") {}; Cryptography(unsigned long long in_a,
unsigned long long in_b,int diffcult) :Martix(in_a, in_b,diffcult) { this->a =
in_a; this->b = in_b; p.x = 0; p.y = 0; public_Key = Getpublickey(); } unsigned
long long Getpublickey() { Get_Public_Key(); return public_Key; } Moving_Point
GetPoint() { Get_Point(); return p; } public: void PrintPrivateKey() { cout <<
"#############私钥:#############" << endl; cout << "长轴:" << 2*this->a << "\t\t";
cout << "短轴:" << 2*this->b << endl; } private: void Get_Point() { if (p.x == 0
&& p.y == 0) { while (!Is_Moving_Point()) { Get_Moving_Point_P(); } } } void
Get_Public_Key() { this->Change_New_Martix(); this->Save_Martix();
this->public_Key = this->GetPublicKey(); } void Get_Moving_Point_P()
//得到一个随机的在椭圆上的点的坐标 { for (int i = 0; i < this->a; i++) { for (int j = 0; j <
this->b; j++) { p.x = i; p.y = j; } } } bool Is_Moving_Point() { if (pow(b,
2)*pow(p.y, 2) + pow(a, 2)*pow(p.x, 2) == pow(a, 2)*pow(b, 2) && p.y <= a &&
p.x <= b) return true; else return false; } };
###不过我觉得以上代码中的POINT(代表动点M)可能目前来看没有什么太大的意义,但是在后面身份认证的时候可能会用到,所以先留着。

<>区块结构定义
struct block { unsigned long long this_hash; unsigned long long pre_hash;
unsigned long long data; };
###以上为区块链中加密算法的实现部分,下一章将会详细介绍区块链的创建和解答的算法实现。
传送门:https://blog.csdn.net/qq_27180763/article/details/82588305
<https://blog.csdn.net/qq_27180763/article/details/82588305>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信