Merkle-Hellman背包密码算法
来源:互联网 发布:手机硬件信息软件 编辑:程序博客网 时间:2024/05/22 00:24
#include <stdio.h>#include <iostream>#include <string.h>#include <cmath>#include <string>#include <set>#include <map>#include <vector>#include <time.h>using namespace std;long long gcd(long long a, long long b){ if (b == 0) return a; else return gcd(b, a%b);}long long ext_gcd(long long a, long long b, long long &x, long long &y){ if (a == 0 && b == 0) return -1; if (b == 0) { x = 1; y = 0; return a; } long long d = ext_gcd(b, a%b, y, x); y -= a / b*x; return d;}long long mod_reverse(long long a, long long n){ long long x, y; long long d = ext_gcd(a, n, x, y); if (d == 1) return (x%n + n) % n; else return -1;}struct Hellman{ int n; int a[100010]; int b[100010]; int c[100010]; void solve() { cout << "*******************************" << endl; printf("本数据假定递增序列(1,3,5,10)\nM=20,W=7\n明文为13的加密解秘过程\n"); cout << "*******************************" << endl<<endl<<endl; //scanf("%d", &n);//输入长度n int sum = 0; int pos = 1; n = 4; //随机生成超递增序列 /* while (1) { srand(time(NULL)); int tmp = rand() % 1000; if (tmp > sum) { a[pos++] = tmp;//私钥 sum += tmp; } if (pos == n + 1) break; } */ sum = 19; a[1] = 1; a[2] = 3; a[3] = 5; a[4] = 10; //随机生成M W int M = double(rand() / RAND_MAX)* (sum + 1001 - sum + 1) + sum + 1; int W = M - 1; /* while (gcd(M, W) != 1) { srand(time(0)); int aa = 1; int bb = M - 1; W = rand() / RAND_MAX * (bb - aa) + aa; } */ M = 20; W = 7; //公钥 for (int i = 1;i <= n;i++) { b[i] = W * a[i] % M; } ///////取明文 cout << "请输入明文:" << endl; int clear; scanf("%d", &clear); int len = 1; int num[100010]; int tmp = clear; cout << "加密:" << endl; cout << "start" << endl; cout << ".............." << endl; cout << "end" << endl; //获得比特流 while (tmp) { if (tmp & 1) num[len++] = 1; else num[len++] = 0; tmp >>= 1; } //加密c int c = 0; for (int i = 1;i < len;i++) c += num[len - i] * b[i]; cout << "加密得到的数字c为:" << endl; cout << c << endl; //int d = mod_reverse(W, M) * c % M; int d = 3; c = c*d%M; cout << "加密得到的转换的c为:" << endl; cout << c << endl; int ans[10010]; memset(ans, 0, sizeof(ans)); for (int i = n;i >= 1;i--) { if (c >= a[i]) { ans[i] = 1; c = c - a[i]; } } cout << "解密:"<< endl; int tt = 0; for (int i = 1;i <= n;i++) { printf("%d", ans[i]); if (ans[i]) tt += pow(2,n-i); } cout << "----" << tt << endl; }}hellman;int main(){ hellman.solve(); return 0;}
0 0
- Merkle-Hellman背包密码算法
- 两种公钥加密算法——Merkle-Hellman背包、RSA
- Merkle Tree算法详解
- Merkle tree算法
- Merkle Tree算法详解
- Merkle Tree算法
- 区块链中的密码学技术——哈希算法、Merkle树、公钥密码算法
- Diffie-Hellman算法
- Diffie-Hellman算法
- Diffie-Hellman算法(密钥)
- Diffie-Hellman 算法描述
- 密钥交换方法 在线可信任第三方、Merkle Puzzles及Diffie-Hellman原理简介
- Diffle-Hellman密钥交换算法
- Diffie-Hellman 密钥交换算法
- Diffie-Hellman密钥交换算法
- Diffie-Hellman密钥交换算法及其优化
- Diffie–Hellman密钥交换算法
- 用java编程实现Diffie-Hellman算法
- C split 截取特定字符串功能实现
- JavaEE中分层解耦合与事物控制-方案
- Python Requsets库
- C 发送http request
- ios入门攻略 04篇 C语言基础【分支结构之if语句】
- Merkle-Hellman背包密码算法
- 2015 南阳理工CCPC Ancient Go
- device eth0 does not seem to be present, delaying initialization
- 自定义servlet
- [leetcode]Add Two Numbers
- qt5和opencv3在linux上安装配置
- 二级路由器设置图解教程
- OC学习第一站
- iHasApp----如何获取本机已安装的程序(未越狱一)