當前位置:首頁 » 安全設置 » rsac網路安全盛會
擴展閱讀
電腦鎖屏密碼設置沒用 2024-05-05 01:55:35
蘋果遮蔽更新的軟體 2024-05-05 01:55:25

rsac網路安全盛會

發布時間: 2022-07-13 11:14:36

⑴ RSA演算法的安全問題

當carcker知道了你的私鑰,再加上公開的公鑰。那麼p和q就能很容易算出來。
而你現在不改變p和q(也就是不改變n)
。只改變e和d
也就是只改變e.因為d 是根據p.q.e計算出來的。
而e又是公開的。那麼。。。
你改變e。也就是什麼也沒做。

⑵ 求正確的RSA加密解密演算法C語言的,多謝。

//rsa.h
#include<stdio.h>
#defineMAX_NUM63001
#defineMAX_PRIME251

//!返回代碼
#defineOK100
#defineERROR_NOEACHPRIME101
#defineERROR_NOPUBLICKEY102
#defineERROR_GENERROR103

unsignedintMakePrivatedKeyd(unsignedintuiP,unsignedintuiQ);
unsignedintGetPrivateKeyd(unsignedintiWhich);
unsignedintMakePairkey(unsignedintuiP,unsignedintuiQ,unsignedintuiD);
unsignedintGetPairKey(unsignedint&d,unsignedint&e);
voidrsa_encrypt(intn,inte,char*mw,intiLength,int*&cw);
voidrsa_decrypt(intn,intd,int*&cw,intcLength,char*mw);
voidoutputkey();

//rsa.c
#include"rsa.h"
//!保存私鑰d集合
structpKeyset
{
unsignedintset[MAX_NUM];
unsignedintsize;
}pset;

//!保存公、私鑰對
structpPairkey
{
unsignedintd;
unsignedinte;
unsignedintn;
}pairkey;

//名稱:isPrime
//功能:判斷兩個數是否互質
//參數:m:數a;n:數b
//返回:m、n互質返回true;否則返回false

boolisPrime(unsignedintm,unsignedintn)
{
unsignedinti=0;
boolFlag=true;

if(m<2||n<2)
returnfalse;

unsignedinttem=(m>n)?n:m;
for(i=2;i<=tem&&Flag;i++)
{
boolmFlag=true;
boolnFlag=true;
if(m%i==0)
mFlag=false;
if(n%i==0)
nFlag=false;
if(!mFlag&&!nFlag)
Flag=false;
}
if(Flag)
returntrue;
else
returnfalse;
}

//名稱:MakePrivatedKeyd
//功能:由素數Q、Q生成私鑰d
//參數:uiP:素數P;uiQ:素數Q
//返回:私鑰d

unsignedintMakePrivatedKeyd(unsignedintuiP,unsignedintuiQ)
{
unsignedinti=0;

//!得到所有與z互質的數(私鑰d的集合)
unsignedintz=(uiP-1)*(uiQ-1);
pset.size=0;
for(i=0;i<z;i++)
{
if(isPrime(i,z))
{
pset.set[pset.size++]=i;
}
}

returnpset.size;
}

//名稱:MakePairKey
//功能:生成RSA公、私鑰對
//參數:uiP:素數P;uiQ:素數Q;uiD:私鑰d
//返回:錯誤代碼

unsignedintMakePairkey(unsignedintuiP,unsignedintuiQ,unsignedintuiD)
{
boolbFlag=true;
unsignedinti=0,e;
unsignedintz=(uiP-1)*(uiQ-1);
unsignedintd=pset.set[uiD];
//d=uiD;

if(!isPrime(z,d))
returnERROR_NOEACHPRIME;

for(i=2;i<z;i++)
{
if((i*d)%z==1)
{
e=i;
bFlag=false;
}
}
if(bFlag)
returnERROR_NOPUBLICKEY;

if((d*e)%z!=1)
ERROR_GENERROR;

pairkey.d=d;
pairkey.e=e;
pairkey.n=uiP*uiQ;
returnOK;
}

//名稱:GetPairKey
//功能:對外提供介面,獲得公、私鑰對
//參數:uiP:素數P;uiQ:素數Q;uiD:私鑰d
//返回:

unsignedintGetPairKey(unsignedint&d,unsignedint&e)
{
d=pairkey.d;
e=pairkey.e;
returnpairkey.n;
}

//名稱:GetPrivateKeyd
//功能:對外提供介面,由用戶選擇ID得以私鑰d
//參數:iWhich:用戶選擇私鑰d的ID
//返回:私鑰d值

unsignedintGetPrivateKeyd(unsignedintiWhich)
{
if(pset.size>=iWhich)
returnpset.set[iWhich];
else
return0;
}

//名稱:rsa_encrypt
//功能:RSA加密運算
//參數:n:公鑰n;e:公鑰e;mw:加密明文;iLength:明文長度;cw:密文輸出
//返回:無

voidrsa_encrypt(intn,inte,char*mw,intmLength,int*&cw)
{
inti=0,j=0;
__int64temInt=0;

for(i=0;i<mLength;i++)
{
temInt=mw[i];
if(e!=0)
{
for(j=1;j<e;j++)
{
temInt=(temInt*mw[i])%n;
}
}
else
{
temInt=1;
}

cw[i]=(int)temInt;
}
}

//名稱:rsa_decrypt
//功能:RSA解密運算
//參數:n:私鑰n;d:私鑰d;cw:密文;cLength:密文長度;mw:明文輸出
//返回:無

voidrsa_decrypt(intn,intd,int*&cw,intcLength,char*mw)
{
inti=0,j=-1;
__int64temInt=0;

for(i=0;i<cLength/4;++i)
{
mw[i]=0;
temInt=cw[i];

if(d!=0)
{
for(j=1;j<d;j++)
{
temInt=(__int64)(temInt*cw[i])%n;
}
}
else
{
temInt=1;
}

mw[i]=(char)temInt;
}
}
voidoutputkey()
{
printf("PublicKey(e,n):(%d,%d) ",pairkey.e,pairkey.n);
printf("PrivateKey(d,n):(%d,%d) ",pairkey.d,pairkey.n);
}

//main.c
//工程:RSA
//功能:RSA加、解密文件
//作者:jlcss|ExpNIS


#include<stdio.h>
#include<afxwin.h>
#include<math.h>
#include"rsa.h"

#defineDECRYPT_FILE"RSA加密密文.txt"
#defineENCRYPT_FILE"RSA解密明文.txt"
//!約束文件最大2M
#defineMAX_FILE1024*1024*2

//名稱:usage
//功能:幫助信息
//參數:應用程序名稱
//返回:提示信息

voidUsage(constchar*appname)
{
printf(" usage:rsa-k素數P素數Q ");
printf(" usage:rsa-e明文文件公鑰e公鑰n ");
printf(" usage:rsa-d密文文件私鑰d私鑰n ");
}

//名稱:IsNumber
//功能:判斷數字字元數組
//參數:strNumber:字元數組
//返回:數字字組數組返回true,否則返回false;

boolIsNumber(constchar*strNumber)
{
unsignedinti;

if(!strNumber)
returnfalse;

for(i=0;i<strlen(strNumber);i++)
{
if(strNumber[i]<'0'||strNumber[i]>'9')
returnfalse;
}

returntrue;
}

//名稱:IsPrimeNumber
//功能:判斷素數
//參數:num:輸入整數
//返回:素數返回true,否則返回false;

boolIsPrimeNumber(unsignedintnum)
{
unsignedinti;
if(num<=1)
returnfalse;

unsignedintsqr=(unsignedint)sqrt((double)num);
for(i=2;i<=sqr;i++)
{
if(num%i==0)
returnfalse;
}

returntrue;
}

//名稱:FileIn
//功能:讀取磁碟文件到內存
//參數:strFile:文件名稱;inBuff:指向文件內容緩沖區
//返回:實際讀取內容大小(位元組)

intFileIn(constchar*strFile,unsignedchar*&inBuff)
{
intiFileLen=0,iBuffLen=0;

//!打開密文文件
CFilefile(strFile,CFile::modeRead);
iFileLen=(int)file.GetLength();
if(iFileLen>MAX_FILE)
{
printf("文件長度不能大於%dM,! ",MAX_FILE/(1024*1024));
gotoout;
}
iBuffLen=iFileLen;

inBuff=newunsignedchar[iBuffLen];
if(!inBuff)
gotoout;

ZeroMemory(inBuff,iBuffLen);

file.Read(inBuff,iFileLen);
file.Close();

out:
returniBuffLen;
}

//名稱:FileOut
//功能:加/解密結果輸出到當前目錄磁碟文件中
//參數:strOut指向輸出字元緩沖區,輸出大小len,strFile為輸出文件
//返回:無

voidFileOut(constvoid*strOut,intlen,constchar*strFile)
{
//!輸出到文件
CFileoutfile(strFile,CFile::modeCreate|CFile::modeWrite);
outfile.Write(strOut,len);
outfile.Close();
}

//名稱:CheckParse
//功能:校驗應用程序入口參數
//參數:argc等於main主函數argc參數,argv指向main主函數argv參數
//返回:若參數合法返回true,否則返回false
//備註:簡單的入口參數校驗

boolCheckParse(intargc,char**argv)
{
boolbRes=false;

if(argc!=4&&argc!=5)
gotoout;

if(argc==4&&argv[1][1]=='k')
{
//!生成公、私鑰對
if(!IsNumber(argv[2])||
!IsNumber(argv[3])||
atoi(argv[2])>MAX_PRIME||
atoi(argv[3])>MAX_PRIME)
gotoout;
}
elseif((argc==5)&&(argv[1][1]=='e'||argv[1][1]=='d'))
{
//!加密、解密操作
if(!IsNumber(argv[3])||
!IsNumber(argv[4])||
atoi(argv[3])>MAX_NUM||
atoi(argv[4])>MAX_NUM)
gotoout;
}
else
Usage(*argv);
bRes=true;

out:
returnbRes;
}

//名稱:kOption1
//功能:程序k選項操作:由素數P、Q生成私鑰d集合
//參數:uiP:程序入口參數P;uiQ:程序入口參數Q
//返回:執行正確返回生成私鑰數目,否則返回0

unsignedintkOption1(unsignedintuiP,unsignedintuiQ)
{
unsignedintuiRes=0;

if(!IsPrimeNumber(uiP))
{
printf("P輸入錯誤,P必須為(0,%d]素數",MAX_PRIME);
returnuiRes;
}
if(!IsPrimeNumber(uiQ))
{
printf("Q輸入錯誤,Q必須為(0,%d]素數",MAX_PRIME);
returnuiRes;
}
if(uiP==uiQ)
{
printf("素數P與素數Q相同,很容易根據公鑰n開平方得出素數P和Q,這種加密不安全,請更換素數! ");
returnuiRes;
}
printf("正在生成私鑰d集合...... ");
uiRes=MakePrivatedKeyd(uiP,uiQ);

returnuiRes;
}

//!程序主函數
intmain(intargc,char**argv)
{
unsignedintp,q,d,n,e;//twoprimep&q,publickey(n,e),privatekey(n,d)
CheckParse(argc,argv);

d=4828;//uid
if(argc==4)
{
p=atoi(argv[2]);
q=atoi(argv[3]);
MakePrivatedKeyd(p,q);
MakePairkey(p,q,d);
outputkey();
}
elseif(argc==5)
{
charFileName[20];
strcpy(FileName,argv[2]);
intlen;
if(argv[1][1]=='e')
{
unsignedchar*inBuffer=(unsignedchar*)malloc(MAX_FILE);//輸入緩沖區
int*cw=(int*)malloc(MAX_FILE);
len=FileIn(FileName,inBuffer);
e=atoi(argv[3]);
n=atoi(argv[4]);
rsa_encrypt(n,e,(char*)inBuffer,len,cw);
FileOut(cw,4*len,DECRYPT_FILE);
}
elseif(argv[1][1]=='d')
{
char*Buffer=(char*)malloc(MAX_FILE);//輸入緩沖區
int*cw=(int*)malloc(MAX_FILE);
len=FileIn(FileName,(unsignedchar*&)cw);
d=atoi(argv[3]);
n=atoi(argv[4]);
rsa_decrypt(n,d,cw,len,Buffer);
FileOut(Buffer,len/4,ENCRYPT_FILE);
}
}

return0;
}

⑶ 簡述RSA演算法中密鑰的產生,數據加密和解密的過程,並簡單說明RSA演算法安全性的原理。

RSA演算法的數學原理

RSA演算法的數學原理:
先來找出三個數, p, q, r,

其中 p, q 是兩個相異的質數, r 是與 (p-1)(q-1) 互質的數。

p, q, r 這三個數便是 private key。接著, 找出m, 使得 rm == 1 mod (p-1)(q-1)..... 這個 m 一定存在, 因為 r 與 (p-1)(q-1) 互質, 用輾轉相除法就可以得到了..... 再來, 計算 n = pq....... m, n 這兩個數便是 public key。

編碼過程是, 若資料為 a, 將其看成是一個大整數, 假設 a < n.... 如果 a >= n 的話, 就將 a 表成 s 進位 (s <= n, 通常取 s = 2^t), 則每一位數均小於 n, 然後分段編碼...... 接下來, 計算 b == a^m mod n, (0 <= b < n), b 就是編碼後的資料...... 解碼的過程是, 計算 c == b^r mod pq (0 <= c < pq), 於是乎, 解碼完畢...... 等會會證明 c 和 a 其實是相等的 :) 如果第三者進行竊聽時, 他會得到幾個數: m, n(=pq), b...... 他如果要解碼的話, 必須想辦法得到 r...... 所以, 他必須先對 n 作質因數分解......... 要防止他分解, 最有效的方法是找兩個非常的大質數 p, q, 使第三者作因數分解時發生困難......... <定理> 若 p, q 是相異質數, rm == 1 mod (p-1)(q-1), a 是任意一個正整數, b == a^m mod pq, c == b^r mod pq, 則 c == a mod pq 證明的過程, 會用到費馬小定理, 敘述如下: m 是任一質數, n 是任一整數, 則 n^m == n mod m (換另一句話說, 如果 n 和 m 互質, 則 n^(m-1) == 1 mod m) 運用一些基本的群論的知識, 就可以很容易地證出費馬小定理的........ <證明> 因為 rm == 1 mod (p-1)(q-1), 所以 rm = k(p-1)(q-1) + 1, 其中 k 是整數 因為在 molo 中是 preserve 乘法的 (x == y mod z and u == v mod z => xu == yv mod z), 所以, c == b^r == (a^m)^r == a^(rm) == a^(k(p-1)(q-1)+1) mod pq 1. 如果 a 不是 p 的倍數, 也不是 q 的倍數時, 則 a^(p-1) == 1 mod p (費馬小定理) => a^(k(p-1)(q-1)) == 1 mod p a^(q-1) == 1 mod q (費馬小定理) => a^(k(p-1)(q-1)) == 1 mod q 所以 p, q 均能整除 a^(k(p-1)(q-1)) - 1 => pq | a^(k(p-1)(q-1)) - 1 即 a^(k(p-1)(q-1)) == 1 mod pq => c == a^(k(p-1)(q-1)+1) == a mod pq 2. 如果 a 是 p 的倍數, 但不是 q 的倍數時, 則 a^(q-1) == 1 mod q (費馬小定理) => a^(k(p-1)(q-1)) == 1 mod q => c == a^(k(p-1)(q-1)+1) == a mod q => q | c - a 因 p | a => c == a^(k(p-1)(q-1)+1) == 0 mod p => p | c - a 所以, pq | c - a => c == a mod pq 3. 如果 a 是 q 的倍數, 但不是 p 的倍數時, 證明同上 4. 如果 a 同時是 p 和 q 的倍數時, 則 pq | a => c == a^(k(p-1)(q-1)+1) == 0 mod pq => pq | c - a => c == a mod pq Q.E.D. 這個定理說明 a 經過編碼為 b 再經過解碼為 c 時, a == c mod n (n = pq).... 但我們在做編碼解碼時, 限制 0 <= a < n, 0 <= c < n, 所以這就是說 a 等於 c, 所以這個過程確實能做到編碼解碼的功能.....

⑷ RSA演算法的原理及演算過程

RSA演算法非常簡單,概述如下:
找兩素數p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一個數e,要求滿足e<t並且e與t互素(就是最大公因數為1)
取d*e%t==1

這樣最終得到三個數: n d e

設消息為數M (M <n)
設c=(M**d)%n就得到了加密後的消息c
設m=(c**e)%n則 m == M,從而完成對c的解密。
註:**表示次方,上面兩式中的d和e可以互換。

在對稱加密中:
n d兩個數構成公鑰,可以告訴別人;
n e兩個數構成私鑰,e自己保留,不讓任何人知道。
給別人發送的信息使用e加密,只要別人能用d解開就證明信息是由你發送的,構成了簽名機制。
別人給你發送信息時使用d加密,這樣只有擁有e的你能夠對其解密。

rsa的安全性在於對於一個大數n,沒有有效的方法能夠將其分解
從而在已知n d的情況下無法獲得e;同樣在已知n e的情況下無法
求得d。

RSA簡潔幽雅,但計算速度比較慢,通常加密中並不是直接使用RSA 來對所有的信息進行加密,
最常見的情況是隨機產生一個對稱加密的密鑰,然後使用對稱加密演算法對信息加密,之後用
RSA對剛才的加密密鑰進行加密。

最後需要說明的是,當前小於1024位的N已經被證明是不安全的
自己使用中不要使用小於1024位的RSA,最好使用2048位的。

網路安全技術主要有哪些

1、防火牆

網路防火牆技術是一種特殊的網路互聯設備,用於加強網路間的訪問控制,防止外網用戶通過外網非法進入內網,訪問內網資源,保護內網運行環境。它根據一定的安全策略,檢查兩個或多個網路之間傳輸的數據包,如鏈路模式,以決定網路之間的通信是否允許,並監控網路運行狀態。

目前防火牆產品主要有堡壘主機、包過濾路由器、應用層網關(代理伺服器)、電路層網關、屏蔽主機防火牆、雙宿主機等。

2、殺毒軟體技術

殺毒軟體絕對是使用最廣泛的安全技術解決方案,因為這種技術最容易實現,但是我們都知道殺毒軟體的主要功能是殺毒,功能非常有限,不能完全滿足網路安全的需求,這種方式可能還是能滿足個人用戶或者小企業的需求,但是如果個人或者企業有電子商務的需求,就不能完全滿足。

幸運的是,隨著反病毒軟體技術的不斷發展,目前主流的反病毒軟體可以防止木馬等黑客程序的入侵。其他殺毒軟體開發商也提供軟體防火牆,具有一定的防火牆功能,在一定程度上可以起到硬體防火牆的作用,比如KV300、金山防火牆、諾頓防火牆等等。

3、文件加密和數字簽名技術

與防火牆結合使用的安全技術包括文件加密和數字簽名技術,其目的是提高信息系統和數據的安全性和保密性。防止秘密數據被外界竊取、截獲或破壞的主要技術手段之一。隨著信息技術的發展,人們越來越關注網路安全和信息保密。

目前,各國除了在法律和管理上加強數據安全保護外,還分別在軟體和硬體技術上採取了措施。它促進了數據加密技術和物理防範技術的不斷發展。根據功能的不同,文件加密和數字簽名技術主要分為數據傳輸、數據存儲、數據完整性判別等。

(5)rsac網路安全盛會擴展閱讀:

首屆全VR線上網路安全大會舉辦

日前,DEF CON CHINA組委會正式官宣,歷經20餘月的漫長等待,DEF CON CHINA Party將於3月20日在線上舉辦。

根據DEF CON CHINA官方提供的信息,本次DEF CON CHINA Party將全程使用VR的方式在線上進行,這也是DEF CON歷史上的首次「全VR」大會。為此,主辦方構建了名為The DEF CONstruct的虛擬空間和賽博世界。在計算機語言中,Construct通常被譯為結構體。

⑹ 一個漏洞就能讓數百萬輛車被黑客操控,智能汽車的安全誰來保障

文/Hanmeimei

而在智能汽車行業真正騰飛之前,必須繫上這根「安全帶」,因為安全永遠應該跑在速度前面。從RSAC2020上釋放的信息來看,如今車企與互聯網安全企業的合作已經成為主流趨勢,有360這樣專業的安全企業保駕護航,風口上的智能汽車行業才能飛得更高、更遠也更穩。

本文來源於汽車之家車家號作者,不代表汽車之家的觀點立場。

⑺ 網路安全作業,會話密鑰演算法效率最高的是,有一題選RSA,另外一題問的一樣,卻選RC-5!求學霸幫忙

RC-5是對稱密碼體制,用的是輪詢迭代,每次輪詢和迭代演算法很簡單,幾乎是計算機最基礎的加法與移位運算,輪詢迭代次數也是常數數量級。RSA是非對稱密碼體制,涉及到的是指數運算且每次參與運算的數都是大數,so
一般非對稱密碼體制用於建立會話,而會話中使用對稱密碼體制加密

⑻ RSA演算法安全么

你用33當然很簡單,rsa最低要求密鑰1024比特,你可以試著分解一下。

⑼ rsa security是什麼工作原理

Rivest-Shamir-Adleman(RSA)公鑰加密廣泛用戶計算機行業中的身份驗證和加密。Netscape已獲得在起產品中好使用RSA Data Security Inc.的RSA公鑰加密的許可,具體用途是身份驗證。、 公鑰加密是一種使用一對不對稱密鑰進行加密和解密的技術。每對密鑰由一個公鑰和一個私鑰組成。檔公鑰被廣泛分發時,它就變得公開了。私鑰從不分發;它始終是保密的。 用公鑰加密的數據只能用私鑰解密。繁殖,用私鑰加密的數據只能用公鑰解密。正是這種不對稱性使得公鑰加密非常有用。 使用公鑰加密進行身份驗證 身份驗證是驗證身份以使一個實體可以確認另一個實體的身份的過程。 示例: 用戶A 和用戶B使用公鑰加密驗證用戶B的身份。 key //表示項目已經用密鑰加密法進行了加密或解密 //something是對加密項或解密項的描述,key是用來加密或解密該項的密鑰 示例: 用戶A想驗證用戶B的身份 用戶B有一對密鑰:一個公鑰和一個私鑰。用戶B向用戶A披露公鑰。 用戶A生成隨機消息並將它發送給用戶B,如下所示: A->B random_message 用戶B使用私鑰對隨機數進行加密,並將加密後的版本返回給用戶A: B->A User_B's_private_key 用戶A收到此消息並使用B早先公開的公鑰將它解密。 用戶A將解密後的消息與其最初發送給用戶B的消息進行比較;如果這兩個消息匹配,則用戶A就知道後來的消息來自用戶B,因為冒名頂替者應該不會知道用戶B的私鑰,因此無法正確地對隨機消息加密並發送給用戶A。 注意事項:示例(更加安全性) 用戶B沒有對用戶A發送的原始消息進行加密,而是創建了消息摘要並對消息摘要進行加密。消息摘要是從原始隨機消息中派生的,具有以下兩種屬性: 摘要很難逆轉。冒名頂替用戶B的人無法根據摘要確定原始消息。 冒名頂替者很難找到一個能夠計算出相同摘要值的不同消息。 用戶B通過使用摘要而得到了保護。用戶B計算用戶A發送的隨機消息的摘要,然後對結果進行加密。用戶B將加密的摘要發揮給用戶A。通過對用戶B的消息進行解密並比較生成的值,用戶A可以計算出相同的摘要並驗證B的身份。 注意事項里介紹的技術稱之為「數字簽名」 生成用於身份驗證的數據 此技術要求用戶B對用戶A生成的消息進行簽名;對於用戶B而言,這與對用戶A生成的隨機數值進行加密幾乎是同樣危險的。因此此示例身份驗證協議需要再增加一個步驟以保證安全;用戶B需要生成以下所示的一些(或所有)數據 A->B B->A hello,are you user B?UserA,This is User B {digest[User A , This is User B]}User_B's_private_key 當用B使用此協議時,他就會知道發送給用戶A的是什麼消息,因此就可以放心地對消息進行簽名。用戶B先發送未加密版本的消息,"User A , This is User B";然後再發送加密版本。用戶A很容易驗證用戶B是否真是用戶B,並且用戶B不需要對任何不是由用戶B生成的消息進行簽名。 交付公鑰 A->B B->A A->B B->A hello Hi,I'm User B, User_B's_public_key prove it UserA, This is User B{digest[User A ,This is User B]}User_B's_private_key 如果使用此協議,任何人都可以冒名頂替用戶B。冒名頂替者需要的只是一個公鑰和一個密鑰而已。冒名頂替這可以對用戶A說謊,並通過提供冒名頂替者自己的公鑰,而不是B的公鑰來冒名頂替用戶B。然後使用冒名頂替者的私鑰對內容進行加密,來「證明」冒名頂替者就是用戶B,而用戶A將看不出冒名頂替者並不是用戶B。 為了解決這個問題,標准團體發明了成為證書的對象。證書包含下列含義: 證書頒發者的名稱 證書頒發給的實體(也成為接收方) 接收方的公鑰 一些時間戳 給證書簽名時需要使用證書頒發者的私鑰。每個人都知道證書頒發者的公鑰(即,證書頒發者也有證書)。證書是將公鑰綁定到姓名上的標准方法。 如果使用證書技術,每個人都可以檢查用戶B的證書,以查證書是不是偽造的。如果用戶B嚴密控制著他的私鑰,並且他確實獲取了證書,則證書技術是安全的。 下面是採用此項技術修訂後的協議: A->B B->A A->B B->A hello Hi,I'm User B,User_B's_certificate prove it User A,This is User B{digest[User A,This Is User B]}User_B's_private_key 當用戶A收到用戶B的第一個消息時,用戶A可以查看證書,查看簽名(如前面的示例所示,通過使用摘要和公鑰解密),然後檢查接收方(即用戶B的姓名),看他是否確實是用戶B。然後用戶A可以相信公鑰是用戶B的公鑰,並可以請求用戶B提供身份證明。 通過設計消息摘要,然後用經過簽名的的摘要版本相應用戶A,用戶B就可以執行簽名示例中概括介紹的過程。用戶A可以通過使用證書中的公鑰並檢查結果,來驗證用戶B的消息摘要。 想要干擾安全通信的人(此示例中為用戶C)可創建下列方案來常識進行干擾 A->C C-A A->C C->A hello, Hi,I'm User B,User_B's_certificateprove it??? 但是,用戶C無法在最終消息中滿足用戶A的要求。用戶C沒有用戶B的私鑰,因此他無法創建一條消息使用戶A相信該消息來自用戶B。 交換機密信息 用戶A驗證完用戶B的身份後,他可以向用戶B發送只有用戶B可以解碼的消息,如下所示: A->B User_B's_public_key 這里,確定secret的唯一方法是用用戶B的私密對上述消息進行解密。交換機密信息是又一種使用公鑰加密方法的有效方式。即使用戶A和用戶B之間的通信收到監視,但除了用戶B以外,任何其他人都無法確定機密信息的內容。 通過對機密信息用作另一個密鑰,此技術增強了Internet的安全性;但是,這種情況下,此密鑰是對稱加密算算(例如數據加密標准(DES)、RC4或IDEA)的密鑰。用戶A知道機密信息,因為是用戶A生成了機密信息並將其發送給了用戶B。用戶B也直到機密信息,因為用戶B有私鑰,因而可以對用戶A的消息進行解密。由於用戶A和用戶B都直到此機密信息,所以他們可以啟動對稱密碼演算法,然後發送給對稱密碼演算法加密的消息。下面採用此技術修訂後的協議: A->B B->A A->B B->A A->B hello Hi,I'm User B,User_B's_certificate prove it User A,This is User B{digest[User A,This is User B]}User_B's_private_key ok User B,here is a secretUser_B's_public_key secret_key 用戶計算secret_key的方法因定義的協議而異,但是secret_key可能僅僅是機密信息的一個副本 安全乾擾 即使使用了上述技術,想要干擾安全通信的人(用戶C)仍然有可能得逞。雖然用戶C無法發現用戶A和用戶B交換機的機密信息,但是用戶C可以通過重新排列機密信息的內容(或使內容發生錯亂)來干擾他們的會話。比如,如果用戶C正處於用戶A和用戶B之間,他就可以使大部分信息毫無變化的來回傳遞,並篡改某些消息(他很容易做到這一點,因為他知道用戶A和用戶B通信時使用的協議): A->C C-> B B->C C->A A->C C->B B->C C->A A->C C->B B->C C->A hello hello Hi,I'm User B , User_B's_certificate Hi,I'm User B,User_B's_certificate prove it prove it User A,This is User B{digest[User A,This is User B]}User_B's_private_key User A,This is User B{digest[User A,This is User B]}User_B's_private key ok User B here is a secretUser_B's_public key ok User B here is a secretUser_B's_public_key secret_key Garble[secret_key] 在用戶A和用戶B共享機密信息之前,用戶C移植傳遞未經修改的數據。然後用戶C篡改用戶B發送給用戶的消息。此時用戶A已經相信B,因此用戶A可能會相信被篡改的消息並依據這些消息進行操作。注意,用戶C不知道機密信息,他能做的就是破壞用密鑰加密的數據。用戶C可能無法生成有效消息,也可能會僥幸生成有效的消息,具體如何取決於協議。 為了阻止這種破壞行為,用戶A和用戶B可以在他們的協議中引入消息身份驗證代碼。消息身份驗證代碼是通過使用機密信息和傳輸的某些數據計算出來的一組數據。上面介紹的摘要演算法正好具有那些用於構造消息身份驗證代碼功能(可以防禦用戶C)的特性: message_authentication_cod:=digest[some_message,secret] 由於用戶C不知道機密信息,所以他無法計算正確的摘要值。即使用戶C任意篡改消息,如果有大量的摘要數據,用計C成功的可能性也很小。例如,通過使用MD5(RSA開發的一種很好的加密摘要演算法),用戶A和用戶B可以在消息中發送128位消息身份雁陣個代碼值。用戶C猜中正確的消息身份雁陣個代碼的可能性大約是1:18,446,744,073,709,551,616.實際上,用戶C根本不可能猜中正確的消息身份驗證代碼。 以下是採用此技術在此修訂的示例協議: A->B B->A A->B B->A hello Hi,I'm User B,User_B's_certificate prove it User A,This is User B{digest[User A,This is User B]}User_B's_private_key ok,User B,here is a secretUser_B's_public_keysecret_key 用戶C可以嘗試篡改消息,但消息身份驗證代碼計算過程會現實此消息不是來自用戶B。用戶A或用戶B可以發現不正確的消息身份驗證代碼值並停止通信。這樣,用戶C就無法再冒名頂替用戶B。