映射密码的加密,解密以及暴力破解

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

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;
}

测试结果图:

猜你喜欢

转载自www.cnblogs.com/dalgleish/p/9988201.html
今日推荐