1. 程式人生 > >數字簽名與身份認證: RSA演算法指北

數字簽名與身份認證: RSA演算法指北

簡介

RSA algorithm是一種非對稱加密演算法,解密需要兩個不同的金鑰,public keyprivate key。一個典型的非對稱加密流程是:

  • 客戶端向服務端傳送public key並請求資料
  • 服務端使用public key加密資料並響應請求
  • 客戶端接收到資料後使用private key解密

RSA演算法的核心思想

大數分解因子操作的高複雜度能有效保證RSA algorithm的安全性。public key由兩個陣列成,其中一個數為兩個大質數的乘積;private key由這兩個大質數產生。實際上只要能對公鑰中的數進行因子分解,就能破解對應的私鑰。RSA演算法的安全性隨key length

的增加呈現指數級增長。

RSA演算法的實現機制

工作機制:

  • 選擇兩個質數 p\large p and q\large q
  • 計算整個加密解密運算的模 N=pq\large{N = p*q}
  • 計算NN的尤拉函式 ϕ(N)=(p1)(q1)\large\phi(N) = (p-1)*(q-1)
  • 選擇公鑰加密所需的冪指數 eZn,st.e<ϕ(N)&gcd(e,ϕ(N))=1\large{e \in Z_n,st.e<\phi(N)\&gcd(e,\phi(N))=1}
  • 計算私鑰解密所需的冪指數 d=1+kϕ(N)e\Large{d=\frac{1+k*\phi(N)}{e}},其中kk為選定常數
  • 加密時對數字資訊mm執行 c=me mod N\large c = m^e\,mod\,N 獲得加密資訊cc
  • 解密時對加密資訊cc執行 m=cd mod N\large m = c^d\,mod\,N 獲得原資訊mm

實現程式碼如下:

#include<stdio.h>
#include<math.h>

int gcd(int a, int h)
{
    int temp;
    while (1)
    {
        temp = a%h;
        if (temp == 0)
          return h;
        a = h;
        h = temp;
    }
}

int main()
{
    double p = 3;
    double q = 7;

    double n = p*q;

    double e = 2;
    double phi = (p-1)*(q-1);
    while (e < phi)
    {
        if (gcd(e, phi)==1)
            break;
        else
            e++;
    }
    int k = 2; 
    double d = (1 + k*phi)/e;

    double msg = 20;

    printf("Message data = %lf", msg);

    double c = pow(msg, e);
    c = fmod(c, n);
    printf("\nEncrypted data = %lf", c);

    double m = pow(c, d);
    m = fmod(m, n);
    printf("\nOriginal Message Sent = %lf", m);
}

執行結果:

Message data = 20.000000
Encrypted data = 20.000000
Original Message Sent = 20.000000

RSA加密解密的合法性

  • 前提:
    • gcd(p,q)=1\large gcd(p,q)=1
    • N=pq\large N=p*q
    • ed=1&ThinSpace;mod&ThinSpace;ϕ(N)\large e*d = 1\,mod\,\phi(N)
  • 結論:
    • (me)d=mmod&ThinSpace;&ThinSpace;N\large (m^e)^d = m \mod N
  • 定理:
    • 尤拉定理:
      • 對於互質的正整數aann,有 aϕ(n)=1mod&ThinSpace;&ThinSpace;n\large a^{\phi(n)} = 1 \mod n
    • 同餘運算:
      • a=bmod&ThinSpace;&ThinSpace;nc=dmod&ThinSpace;&ThinSpace;n\large a = b \mod n \land c = d \mod nac=bdmod&ThinSpace;&ThinSpace;n\large a*c = b*d \mod n
    • 另一個推論:
      • a=bmod&ThinSpace;&ThinSpace;pa=bmod&ThinSpace;&ThinSpace;qst.&ThinSpace;gcd(p,q)=1\large a = b \mod p \land a = b \mod q\quad st.\, gcd(p,q)=1 , 則 a=bmod&ThinSpace;&ThinSpace;(pq)\large a = b \mod (p*q)
  • 證明:
    • gcd(m,N)=1\large gcd(m,N)=1 時:
      • 根據尤拉定理和同餘運演算法則易證
    • gcd(m,N)1\large gcd(m,N) \neq 1 時:
      • 只需證得 med=mmod&ThinSpace;&ThinSpace;pmed=mmod&ThinSpace;&ThinSpace;q\large m^{e*d}=m \mod p \land m^{e*d}=m \mod q
      • gcd(m,N)=pgcd(m,N)=q\large gcd(m,N)=p \lor gcd(m,N)=q
      • 假設 gcd(m,N)=p\large gcd(m,N)=p , 則m=hp,hZ+\large m=h*p, h \in Z_{+}
      • med=(hp)ed=hpmod&ThinSpace;&ThinSpace;p\large m^{e*d}=(h*p)^{e*d}=hp \mod p
      • med=mk(p1)(q1)m=1k(p1)mmod&ThinSpace;&ThinSpace;q\large m^{e*d}=m^{k*(p-1)(q-1)}*m=1^{k*(p-1)}*m \mod q
      • 得證

RSA演算法的實用實現與相關優化

程式碼如下:

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;//RSA演算法所需引數
typedef struct  RSA_PARAM_Tag
{
	unsigned __int64    p, q;   //兩個素數,不參與加密解密運算
	unsigned __int64    f;      //f=(p-1)*(q-1),不參與加密解密運算
	unsigned __int64    n, e;   //公匙,n=p*q,gcd(e,f)=1
	unsigned __int64    d;      //私匙,e*d=1 (mod f),gcd(n,d)=1
	unsigned __int64    s;      //塊長,滿足^s<=n的最大的s,即log2(n)
} RSA_PARAM;
//小素數表
const static long g_PrimeTable[] =
{ 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 };
const static long   g_PrimeCount = sizeof(g_PrimeTable) / sizeof(long);
const unsigned __int64  multiplier = 12747293821;
const unsigned __int64  adder = 1343545677842234541;
//隨機數類
class  RandNumber
{
private:
	unsigned __int64    randSeed;
public:
	RandNumber(unsigned __int64 s = 0);
	unsigned __int64    Random(unsigned __int64 n);
};
RandNumber::RandNumber(unsigned __int64 s)
{
	if (!s)
		randSeed = (unsigned __int64)time(NULL);
	else
		randSeed = s;
}
unsigned __int64 RandNumber::Random(unsigned __int64 n)
{
	randSeed = multiplier * randSeed + adder;
	return randSeed % n;
}
static RandNumber   g_Rnd;
/* 模乘運算,返回值x=a*b mod n  */
inline unsigned __int64 MulMod(unsigned __int64 a, unsigned __int64 b, unsigned __int64 n)
{
	return a * b % n;
}
/* 模冪運算,返回值x=base^pow mod n */
unsigned __int64 PowMod(unsigned __int64 &base, unsigned __int64 &pow, unsigned __int64 &n)
{
	unsigned __int64    a = base, b = pow, c = 1;
	while (b)
	{
		while (!(b & 1))
		{
			b >>= 1;  //a=a * a % n;    
			//函式看起來可以處理位的整數,但由於這裡a*a在a>=2^32時已經造成了溢位,因此實際處理範圍沒有位
			a = MulMod(a, a, n);
		}
		b--;
		//c=a * c % n;        
		//這裡也會溢位,若把位整數拆為兩個位整數不知是否可以解決這個問題。
		c = MulMod(a, c, n);
	}
	return c;
}
/*  Rabin-Miller素數測試,通過測試返回,否則返回。n是待測素數。
注意:通過測試並不一定就是素數,非素數通過測試的概率是1/4  */
long RabinMillerKnl(unsigned __int64 &n)
{
	unsigned __int64    b, m, j, v, i;
	m = n - 1;
	j = 0;
	//0、先計算出m、j,使得n-1=m*2^j,其中m是正奇數,j是非負整數
	while (!(m & 1))
	{
		++j;
		m >>= 1;
	}
	//1、隨機取一個b,<=b<n-1
	b = 2 + g_Rnd.Random(n - 3);
	//2、計算v=b^m mod n
	v = PowMod(b, m, n);
	//3、如果v==1,通過測試
	if (v == 1)
	{
		return 1;
	}
	//4、令i=1
	i = 1;
	b = 
            
           

相關推薦

數字簽名身份認證: RSA演算法

簡介 RSA algorithm是一種非對稱加密演算法,解密需要兩個不同的金鑰,public key和private key。一個典型的非對稱加密流程是: 客戶端向服務端傳送public key並請求資料 服務端使用public key加密資料並響應請求 客戶

數字簽名身份認證中的作用

問題一 http協議是無狀態的,那麼大多數網站是如何記住使用者身份的?問題二 類似於第一個問題,但又略微有些不同,基於http協議的app應用又是如何記錄使用者身份的?問題三 如何保持自動登入狀態?其實,做過相關開發的同學很快就能說出很多,你們說的都對。問題一,通過session和co

數字證書身份認證攻防

vat -- 證書頒發機構 篡改 證書認證 客戶 攻擊 第一步 沒有 數字證書是一個電子文檔,其中包含了持有者的信息、公鑰以及證明該證書有效的數字簽名。 證書簽名與驗簽: 簽名: 上級證書擁有者,搜集到下級證書申請信息後,將整體信息使用私鑰簽名; 驗簽: 使用上

安全體系(零)—— 加解密演算法、訊息摘要、訊息認證技術、數字簽名公鑰證書

鋒影 email:[email protected] 如果你認為本系列文章對你有所幫助,請大家有錢的捧個錢場,點選此處贊助,贊助額0.1元起步,多少隨意 本文講解對稱加密、非對稱加密、訊息摘要、MAC、數字簽名、公鑰證書的用途、不足和解決的問題。 0.概

【React全家桶入門之十】登錄身份認證

cto json head AC push 操作 undefine 防盜 項目依賴 細致想想。我們的後臺系統還沒有一個登錄功能,太不靠譜,趕緊把防盜門安上! SPA

JAR包數字簽名驗證

經簽名的Jar包內包含了以下內容: 原Jar包內的class檔案和資原始檔 簽名檔案 META-INF/*.SF:這是一個文字檔案,包含原Jar包內的class檔案和資原始檔的Hash 簽名block檔案 META-INF/*.DSA:這是一個數據檔案,包含簽名者的 c

GnuPG數字簽名驗證應用

先準備好要簽名的檔案。 [[email protected] gnupg-2.1.4]# cat message.txt hello gpg 一 數字簽名一個檔案的方法A 1 使用如下命令對message.txt進行數字簽名 [[email pro

公鑰密碼學_數字簽名和訊息認證的區別

在公鑰密碼學不足的問題在於怎麼讓接收方確定訊息的傳送者是誰,以及傳送的訊息是否被攻擊者篡改過,解決這兩個問題就可以讓公鑰加密變得完善   訊息認證 訊息認證就是確定接收者接收到的訊息是否真實,例如有沒有被改動過啊,訊息認證又叫完整性校驗,在我們通訊OSI安全模型中稱

http相關的session及cookie的工作原理身份認證

型別選原創是有點慚愧 其實是我看了這篇文章的總結:http://blog.csdn.net/kgd1120/article/details/2159458 寫得很好,就是略長,後面java的httpsession我就沒看了 正題: 經常上98什麼的時候,發現只要不點退出,

數字簽名數字證書

前言 先看一下百度百科對數字簽名和數字證書的解釋: 數字簽名: 將報文按雙方約定的HASH演算法計算得到一個固定位數的報文摘要。在數學上保證:只要改動報文中任何一位,重新計算出的報文摘要值就會與原先的值不相符。這樣就保證了報文的不可更改性。 將該報文摘要值用傳送者的私人

【React全家桶入門之十】登入身份認證

仔細想想,我們的後臺系統還沒有一個登入功能,太不靠譜,趕緊把防盜門安上! SPA的鑑權方式和傳統的web應用不同:由於頁面的渲染不再依賴服務端,與服務端的互動都通過介面來完成,而REASTful風格的介面提倡無狀態(state less),通常不使用cooki

數字簽名數字證書形象解釋

前言 先看一下百度百科對數字簽名和數字證書的解釋: 數字簽名: 將報文按雙方約定的HASH演算法計算得到一個固定位數的報文摘要。在數學上保證:只要改動報文中任何一位,重新計算出的報文摘要值就會與原先的值不相符。這樣就保證了報文的不可更改性。 將該報文摘要值用傳送者

數字簽名數字證書的原理

在瞭解數字簽名和數字證書之前,可以先了解一下加密演算法的一些常見分類,我之前寫了一篇介紹常見加密演算法的文章。https://www.cnblogs.com/mysticbinary/p/12615063.html # 將軍與士兵通訊 ---- 數字簽名原理 為了用最簡單的方式來講解數字簽名,我下面

網絡安全管理精講視頻筆記4-數字信封、數字簽名、完整性驗證、數據加解密及身份認證流程

工具 發送 認證 ems str 結合 一個 驗證 過程 第二章 ?數字信封、數字簽名、完整性驗證、數據加解密及身份認證流程 數字信封:將對稱加密技術和非對稱加密技術結合使用的過程。數字簽名:驗證發送方的身份,發送方用自己的私鑰簽名,接收方用發送方的公鑰驗證。完整性驗證:H

加密,認證疑難名詞總結----RSA, 公鑰,私鑰,CA,數字簽名數字證書

成功 digital 出現 直觀 證明 col 文件簽名 nat blog 在網絡和操作系統安全通信中經常涉及到這幾個名詞: RSA, 公鑰,私鑰,CA,數字簽名,數字證書。我找了很多資料,很少有把疑難點講全面的。但不講清楚這幾個,很難有一個清晰的認識和理解。我現在也嘗試這

雜湊演算法加密通訊、數字簽名

作為通訊工程的學生,我在學習《資訊理論與編碼》這門課的時候瞭解過關於加密解密的一些知識,但覺得不夠深入,不甚過癮。 這幾天學習了跟密碼學有很大關聯的雜湊演算法,跟大家分享一下。   雜湊演算法是什麼       雜湊,英文為Hash,有時翻譯為雜湊,所以雜湊

SM2演算法第二十五篇:ECDSA數字簽名演算法原理實現

---------------------------------------------轉載原因------------------------------------------------- 這邊部落格中有關 EC_KEY_set_private_key和EC_KEY_set_public_key

數字簽名加密演算法RSA、DSA、ECDSA)

RSA的例子: import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.securi

Java 數字簽名演算法RSA 的使用教程

JAVA 20小時前 36瀏覽 0評論 最近用到了 RSA 演算法,百度了一下,發現很多文章都是互相轉載的。有的實現太過複雜,有的完全沒有中心,是錯誤的實現。今天小編就特意為大家整理了一下 java 使用 RSA 演算法的案例,希望能對大家有所幫助! 關於 RSA

Android簽名認證詳細分析之一(CERT.RSA剖析)

一、Android簽名概述 我們已經知道的是:Android對每一個Apk檔案都會進行簽名,在Apk檔案安裝時,系統會對其簽名信息進行比對,判斷程式的完整性,從而決定該Apk檔案是否可以安裝,在一定程度上達到安全的目的。 給定一個Apk檔案,解壓,可以看到一個META