1. 程式人生 > >密碼學之仿射加密解密演算法

密碼學之仿射加密解密演算法

仿射變換的加密解密分別是:

c = Ea,b(m)  ≡ a, + b(mod 26)

m = Da,b(c) ≡ a^-1(c - b)(mod 26)

其中,a,b是金鑰,為滿足0≤a,b≤25和gcd(a,26)等於1的整數。

其中gcd(a,26)表示a和26的最大公因子,gcd(a,26)=1表示a和26是

互素的,a^-1表示a的逆元,即a^-1*a ≡ 1mod26。

解析:

加密過程較為容易

加密演算法:c = a*m + b(mod n)
加密過程:
1,獲取a,b,n;(若未知)
2,獲取明文字串;
3,
1,將每一個明文字元轉換成對應的數字;
2,將明文數字帶入公式c = a*m + b(mod n),獲取密文對應數字;
3,將密文數字轉換成對應的密文字元。

解密過程是是其中難點。

解密演算法:m = a^-1(m - b) (mod n)(注:a^用_a表示)

解密過程:

1, 獲取a, b,n;(若未知)
2,獲取密文字串;(若未知)
3
1,設定陣列coprime為存放與n互素的元素
2,獲取value1,value2的最大公約數
3,在coprime中尋找a的模n可逆元_a
4,1,將每一個密文字元轉換成對應的數字;
2,將密文數字帶入公式m = a^-1(m - b) (mod n),獲取明文對應數字;
3,將明文數字轉換成對應的明文字元。

下面附上原始碼

main函式

#include <stdio.h>
#include <assert.h>

#define N 26 //仿射變換預設模數為26
 
//加密演算法
char *encode(char *c_str, int a, int b, int n);
//解密演算法
char *decode(char *m_str, int a, int b, int n);

//設定陣列coprime為存放與n互素的元素
void setCoprime(int coprime[], int n);
//獲取value1,value2的最大公約數
int getGcd(int value1, int value2);
//在coprime中尋找a的模n可逆元_a
int get_a(int coprime[], int a, int n);

int main()
{	
	int a = 0;
	int b = 0;

	//str儲存明文
	char str[128] = "";

	printf("輸入a, b的值\n");
	scanf("%d %d", &a, &b);

	getchar(); //抵消換行符的干擾

	printf("輸入str的內容\n");
	gets(str); //注意輸入大寫字母字串

	//輸出明文
	printf("明文:%s\n", str);

	//加密
	encode(str, a, b, N);

	//檢驗是否加密成功
	printf("密文:%s\n", str);

	//解密
	decode(str, a, b, N);

	//檢驗是否解密成功
	printf("明文:%s\n", str);

	return 0;
}

加密函式encode()
//加密演算法
char *encode(char *c_str, int a, int b, int n)
{
	char *p_str = c_str; //減小副作用
	assert (c_str);  //判斷明文字串c_str是否為NULL
	
	while (*c_str)
	{
	if (' ' == *c_str)	//遇到空格就跳過
		{
			++c_str;
			continue;
		}

		if ((*c_str < 'A') || (*c_str > 'Z')) //不是‘A’到‘Z’之間的就中斷
			assert(0);
		
		*c_str -= 'A';	//將字元轉化為對應數字
		*c_str = (a*(*c_str) + b)%n;//加密核心演算法
		*c_str += 'A';	//將數字轉化為字元

		++c_str;
	}

	return p_str;
}

解密函式decode()

//解密演算法
char *decode(char *m_str, int a, int b, int n)
{
	char *p_str = m_str; //減小副作用
	int coprime[32] = {0}; //存放小於n並且與n互素的元素
	int _a = 0; //存放a的模n可逆元
	int i = 0; //迭代因子

	assert (m_str);  //判斷密文字串m_str是否為NULL

	for (; i < 32; i++)  //將陣列元素賦為0
		coprime[i] = 0;

	setCoprime(coprime, n);//設定陣列coprime存放與n互素的元素

	_a = get_a(coprime, a, n);//在coprime中尋找a的逆元_a

	
	while (*m_str)
	{
		if (' ' == *m_str)  //遇到空格就跳過
		{
			++m_str;
			continue;
		}

		if ((*m_str < 'A') || (*m_str > 'Z')) //不是‘A’到‘Z’之間的就中斷
			assert(0);
		*m_str -= 'A';	//將字元轉化為對應數字
		*m_str = (_a*(*m_str - b + n))%n;//解密核心演算法
		*m_str += 'A';	//將數字轉化為字元

		++m_str;
	}

	return p_str;
}

設定陣列coprime內容

//設定陣列coprime存放與n互素的元素
void setCoprime(int coprime[], int n)
{
	int i = 1;

	for (; i < n; i++)
		if (1 == getGcd(n, i))//判斷是否n,i是否互素
			*(coprime++) = i; //將i存入coprime中
}
獲取兩數最大公約數getGcd()
//獲取value1和value2的最大公約數
int getGcd(int value1, int value2)
{
	int gcd = 0; //最大公約數
	int divisor = 0; //餘數
	
	do	//輾轉相除法
	{	
		divisor = value1 % value2;

		gcd = value2;

		value1 = value2;
		value2 = divisor;

	}while(divisor);

	return gcd;}

獲取可逆元_a

//在陣列coprime中尋找a的模n可逆元
int get_a(int coprime[], int a, int n)
{
	int i = 0;

	for (; coprime[i] != 0; i++)
		if (1 == (a*coprime[i])%n)
			return coprime[i];

	return 0;
}

相關推薦

密碼仿加密解密演算法

仿射變換的加密解密分別是: c = Ea,b(m)  ≡ a, + b(mod 26) m = Da,b(c) ≡ a^-1(c - b)(mod 26) 其中,a,b是金鑰,為滿足0≤a,b≤25和gcd(a,26)等於1的整數。 其中gcd(a,26)表示a和26的最大

密碼各種加解密演算法比較

對稱加密演算法 對稱加密演算法用來對敏感資料等資訊進行加密,常用的演算法包括: DES(Data Encryption Standard):資料加密標準,速度較快,適用於加密大量資料的場合。 3DES(Triple DES):是基於DES,對一塊資料用三個不同的金鑰進行三次加密,強度更高。 AES(Adva

密碼程式設計_換位加密法的解密

import math,pyperclip def main(): myMessage='Cenoonommstmme oo snnio. s s c' myKey=8 plaintext=decryptMessage(myKey,myMessage) print(p

密碼Hash雜湊演算法

      前言 在第一篇文章中已經有介紹區塊鏈技術概念,我們知道區塊鏈主要是由共識演算法機制、p2p網路、密碼學這幾個核心技術組成,前面幾篇文章講了共識演算法,p2p網路,這次我們談一下密碼學,密碼學是區塊鏈系統的基礎,如果沒有密碼學技術支撐,區

使用js實現5種加密解密演算法(凱撒密碼、字母倒排序、單表置換、維基利亞、轉換加密演算法

在學習作業系統的時候,我們會學到系統安全的章節,而在這一塊會有關於加密解密演算法的學習。 一共有5種常見的加密解密演算法:凱撒密碼、字母倒排序、單表置換、維基利亞、轉換加密演算法。  我使用了js實現了這5種演算法,而且做了視覺化處理、輸入輸出格式化處理,使得操作起來非常

密碼學習(二) 置換加密演算法(Transposition Cipher)及python實現

置換加密演算法 加密 比如我們想要加密的明文是Common sense is not so common.並且取key為8 首先,把明文寫成每行key個字元,也就是8個字元的形式,空格也算一個字元 C o m m o n (s) s e n s e (s) i s (s)

網路安全學習C語言版DES加密解密演算法的程式設計與實現

其實明白了DES演算法的流程程式設計實現是不難的,當然可能會在S盒實現那碰到點問題。下面的DES演算法包括加密和解密兩個功能,主要有生成16個子金鑰和DES演算法的主程式組成。輸出的資訊有16輪子金鑰以及每輪的中間值以及最後的結果。具體的程式碼中都有註釋,就看程式碼吧。關於D

密碼Pohlig-Helliman演算法求離散對數

對於一個素數p,先求n=p-1並將其分解為x個素數因子,對於每一個因子q及其指數c,應用Pohlig-Helliman演算法求解(a0,a1,a3............ac-1) 根據a=(for i=0 to c-1:ai*q^i)+s*q^(s為某一整數) 求得  x

應用密碼從零開始③-密碼的數學基礎其一

html 使用 數據結構 密碼學 運行 狀態 機器 加法 加密 本文作者:i春秋簽約作家——黑照 前文筆者介紹了應用密碼學下傳統密碼、現代密碼對稱和非對稱算法的作用和簡介。傳統密碼原理簡單,筆者幾乎沒有計算,在現代密碼學裏面的非對稱加密沒有進行哪怕一位的加密計算過程因為

系統安全數據加密解密

數據加密解密1.為什麽要進行數據加密? 若不對數據加密,難免在進程間通信時,會有第三者竊聽甚至修改通信數據;因此為了更好的確保數據的機密性,完整性,需要對數據加密。2.加密方案組成 加密算法及協議 加密密鑰3.常用的數據加密算法 1.對稱加密算法: 特點:加密密鑰和解密密鑰相

CTF密碼密文腳本解密及WP(凱撒解密

CTF python wp 題目來源實驗吧 分析題意,說是困在柵欄中,所以將字符柵欄解密看看有什麽,利用工具CTFcraktools 得到三條密文 然後說是密碼是凱撒,在將四欄依次凱撒解碼,尋找可能的key,這裏很顯然,在嘗試第一個的時候,解出的明文裏有一個“CTF{}”字樣的一欄 解題成功

密碼程式設計 _換位加密

import pyperclip def main(): myMessage='Commen sense is not so common.' myKey=8 ciphertext=encryptMessage(myKey,myMessage) print(ciphe

JT809 加密解密演算法

平臺對接標準上說“在資料包傳送之前,二進位制資料包與偽隨機序列按位元組進行異或運算。加密演算法如下:用N模偽隨機序列發生器產生偽隨機位元組序列。將待傳輸的資料與偽隨機碼按位元組進行異或運算”下面程式碼是C語言的程式碼: Const unsigned long M1 =A; Const unsigned

介紹三種PHP加密解密演算法

PHP加密解密演算法 這裡主要介紹三種常用的加密解密演算法: 方法一: /** * @param $string 要加密/解密的字串 * @param string $operation 型別,ENCODE 加密;DECODE 解密 * @param string

[C#] [安全] [加密解密] 逆向某GIS軟體驗證函式後生成的加密解密演算法

目錄 1.Intro 2.Details 3.Theory 4.Environment  5.Source 註冊機概覽: 註冊碼生成(加密模組): 註冊碼驗證(解密模組): 許可呼叫的功能模組: 6.Conclusion 1.Intro

密碼維吉尼亞密碼

密碼學淺談 密碼學五元組:明文(P),密文(C),金鑰(K),加密演算法(E),解密演算法(D),S={P,C,K,E,D} 密碼學的資訊安全系統目標:C,I,A C(Confidentiality):機密性 I(Integrity):完整性 A(Availabi

資料的加密傳輸——微控制器上實現TEA加密解密演算法

http://www.eeworld.com.cn/mcu/article_2016121632367.html 各位大俠在做資料傳輸時,有沒有考慮過把資料加密起來進行傳輸,若在串列埠或者無線中把所要傳的資料加密起來,豈不是增加了通訊的安全性。常用的加密解密演算法比如DES、RSA等,受限於微控

一個最簡單的加密解密演算法 人人能懂 異或加密

                #include <iostream>// KEY 非常重要,不能對公眾洩露KEY值// 傳送端和接收端提前祕密約定好KEY值#define KEY 1313113 // 萬歲萬歲萬萬歲using namespace std;// 加密演算法可以公開int encr

golang常用加密解密演算法總結(AES、DES、RSA、Sha1MD5)

在專案開發過程中,當操作一些使用者的隱私資訊,諸如密碼、帳戶金鑰等資料時,往往需要加密後可以在網上傳輸。這時,需要一些高效地、簡單易用的加密演算法加密資料,然後把加密後的資料存入資料庫或進行其他操作;當需要讀取資料時,把加密後的資料取出來,再通過演算法解密。 關於加密解密 當前我們專案中常用

密碼HMAC

密碼學之HMAC 簡述 HMAC演算法表示 運算步驟 應用 安全性淺析 缺點 在objective中應用的程式碼示例 MAC(Message Authentication Code,訊息認證碼演算法)是含有金鑰雜湊函式演