zoukankan      html  css  js  c++  java
  • 映射密码的加密,解密以及暴力破解

    算法描述:数据按照线性函数加密

    y =  (a*x+b) mod m (gcd(a,m)=1)

    解密

    x = (y-b)*af mond m (gcd(af,m)=1, af和a互逆)

    暴力破解

    枚举a, b,其中a, b范围是[1,m-1]

    C/C++语言代码

    加密函数

    void Encrypt(char *txt, int a, int b) {
    	int len = lstrlenA(txt);
    	for (int i = 0; i < len; i++)
    		txt[i] = (a*txt[i] + b) % 0x7F;
    }
    

    解密函数

    int gcd(int m, int n) {
    	int r, t;
    	if (m < n) {
    		t = m;
    		m = n;
    		n = t;
    	}
    	while ((r = m % n) != 0) {
    		m = n;
    		n = r;
    	}
    	return n;
    }
    
    void Decrypt(char *txt, int a, int b) {//b位移[1,0x7E],有意义
    	int len = lstrlenA(txt), af = 2, x;
    	while (true) {
    		if (af*a % 0x7F == 1 && gcd(af, 0x7F) == 1)
    			break;
    		af++;//取得a逆
    	}
    	for (int i = 0; i < len; i++) {
    		x = txt[i] - b;
    		txt[i] = (x >= 0 ? x : x + 0x7F)*af % 0x7F;
    	}
    }
    

    暴力破解函数

    void Crack(char *txt) {
    	int len = lstrlenA(txt) + 1, a, b;
    	char *tmp = new char[len];
    	for (a = 1; a < 0x7F; a++) {
    		if (gcd(a, 0x7F) == 1) {//存在a逆
    			for (b = 1; b < 0x7F; b++) {
    				memcpy(tmp, txt, len);
    				Decrypt(tmp, a, b);
    				std::cout << "Cracked at a=" << a << ",b=" << b << ": " << tmp << std::endl;
    			}
    		}
    	}
    	delete[] tmp;
    }
    

    Main函数

    int main(){
    	char szText[200];
    	std::cout << "Enter text: ";
    	std::cin.getline(szText, 200);
    	Encrypt(szText, 9, 13);
    	std::cout << "Encrypt text: " << szText << std::endl;
    	Crack(szText);
    	Decrypt(szText, 9, 13);
    	std::cout << "Decrypt text: " << szText << std::endl;
    }
    

    测试结果图:

  • 相关阅读:
    centos 7 安装zabbix 4.0
    django Middleware
    初探paramiko
    python中的反射
    python异常处理
    双绞线
    简易的CMDB服务端
    4-初识Django Admin
    数据资产管理实践纲要
    matplotlib 散点图,为不同区域的点添加不同颜色
  • 原文地址:https://www.cnblogs.com/dalgleish/p/9988201.html
Copyright © 2011-2022 走看看