php非對稱加密演算法
最大的缺點是計算速度的問題,非對稱加密基本都是基於數學難題,計算比較麻煩,
非對稱加密的缺點是加密和解密花費時間長、速度慢,在某些極端情況下,甚至能比對稱加密慢上1000倍。以此非對稱加密演算法只適合對少量數據進行加密。
B. 非對稱加密演算法是什麼
非對稱加密(公鑰加密):指加密和解密使用不同密鑰的加密演算法,也稱為公私鑰加密。假設兩個用戶要加密交換數據,雙方交換公鑰,使用時一方用對方的公鑰加密,另一方即可用自己的私鑰解密。如果企業中有n個用戶,企業需要生成n對密鑰,並分發n個公鑰。假設A用B的公鑰加密消息,用A的私鑰簽名,B接到消息後,首先用A的公鑰驗證簽名,確認後用自己的私鑰解密消息。由於公鑰是可以公開的,用戶只要保管好自己的私鑰即可,因此加密密鑰的分發將變得 十分簡單。同時,由於每個用戶的私鑰是唯一的,其他用戶除了可以通過信息發送者的公鑰來驗證信息的來源是否真實,還可以通過數字簽名確保發送者無法否認曾發送過該信息。
鏈喬教育在線旗下學碩創新區塊鏈技術工作站是中國教育部學校規劃建設發展中心開展的「智慧學習工場2020-學碩創新工作站 」唯一獲準的「區塊鏈技術專業」試點工作站。專業站立足為學生提供多樣化成長路徑,推進專業學位研究生產學研結合培養模式改革,構建應用型、復合型人才培養體系。
C. 什麼叫非對稱加密演算法
非對稱加密演算法是一種密鑰的保密方法。
非對稱加密演算法需要兩個密鑰:公開密鑰(publickey:簡稱公鑰)和私有密鑰(privatekey:簡稱私鑰)。公鑰與私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種演算法叫作非對稱加密演算法。
D. php 非對稱加密演算法 可以破解嗎
一般用戶密碼都用的非對稱加密,或者token之類的也會採取非對稱加密
E. 給出一種非對稱加密演算法以及它的的C源代碼。
#include <iostream.h>
#include <math.h>
#include <stdio.h>
typedef int Elemtype;
Elemtype p,q,e;
Elemtype fn;
Elemtype m,c;
int flag = 0;
typedef void (*Msghandler) (void);
struct MsgMap {
char ch;
Msghandler handler;
};
/* 公鑰 */
struct PU {
Elemtype e;
Elemtype n;
} pu;
/* 私鑰 */
struct PR {
Elemtype d;
Elemtype n;
} pr;
/* 判定一個數是否為素數 */
bool test_prime(Elemtype m) {
if (m <= 1) {
return false;
}
else if (m == 2) {
return true;
}
else {
for(int i=2; i<=sqrt(m); i++) {
if((m % i) == 0) {
return false;
break;
}
}
return true;
}
}
/* 將十進制數據轉化為二進制數組 */
void switch_to_bit(Elemtype b, Elemtype bin[32]) {
int n = 0;
while( b > 0) {
bin[n] = b % 2;
n++;
b /= 2;
}
}
/* 候選菜單,主界面 */
void Init() {
cout<<"*********************************************"<<endl;
cout<<"*** Welcome to use RSA encoder ***"<<endl;
cout<<"*** a.about ***"<<endl;
cout<<"*** e.encrypt ***"<<endl;
cout<<"*** d.decrypt ***"<<endl;
cout<<"*** s.setkey ***"<<endl;
cout<<"*** q.quit ***"<<endl;
cout<<"**********************************by*Terry***"<<endl;
cout<<"press a key:"<<endl;
}
/* 將兩個數排序,大的在前面*/
void order(Elemtype &in1, Elemtype &in2) {
Elemtype a = ( in1 > in2 ? in1 : in2);
Elemtype b = ( in1 < in2 ? in1 : in2);
in1 = a;
in2 = b;
}
/* 求最大公約數 */
Elemtype gcd(Elemtype a, Elemtype b) {
order(a,b);
int r;
if(b == 0) {
return a;
}
else {
while(true) {
r = a % b;
a = b;
b = r;
if (b == 0) {
return a;
break;
}
}
}
}
/* 用擴展的歐幾里得演算法求乘法逆元 */
Elemtype extend_euclid(Elemtype m, Elemtype bin) {
order(m,bin);
Elemtype a[3],b[3],t[3];
a[0] = 1, a[1] = 0, a[2] = m;
b[0] = 0, b[1] = 1, b[2] = bin;
if (b[2] == 0) {
return a[2] = gcd(m, bin);
}
if (b[2] ==1) {
return b[2] = gcd(m, bin);
}
while(true) {
if (b[2] ==1) {
return b[1];
break;
}
int q = a[2] / b[2];
for(int i=0; i<3; i++) {
t[i] = a[i] - q * b[i];
a[i] = b[i];
b[i] = t[i];
}
}
}
/* 快速模冪演算法 */
Elemtype molar_multiplication(Elemtype a, Elemtype b, Elemtype n) {
Elemtype f = 1;
Elemtype bin[32];
switch_to_bit(b,bin);
for(int i=31; i>=0; i--) {
f = (f * f) % n;
if(bin[i] == 1) {
f = (f * a) % n;
}
}
return f;
}
/* 產生密鑰 */
void proce_key() {
cout<<"input two primes p and q:";
cin>>p>>q;
while (!(test_prime(p)&&test_prime(q))){
cout<<"wrong input,please make sure two number are both primes!"<<endl;
cout<<"input two primes p and q:";
cin>>p>>q;
};
pr.n = p * q;
pu.n = p * q;
fn = (p - 1) * (q - 1);
cout<<"fn = "<<fn<<endl;
cout<<"input e :";
cin>>e;
while((gcd(fn,e)!=1)) {
cout<<"e is error,try again!";
cout<<"input e :";
cin>>e;
}
pr.d = (extend_euclid(fn,e) + fn) % fn;
pu.e = e;
flag = 1;
cout<<"PR.d: "<<pr.d<<" PR.n: "<<pr.n<<endl;
cout<<"PU.e: "<<pu.e<<" PU.n: "<<pu.n<<endl;
}
/* 加密 */
void encrypt() {
if(flag == 0) {
cout<<"setkey first:"<<endl;
proce_key();
}
cout<<"input m:";
cin>>m;
c = molar_multiplication(m,pu.e,pu.n);
cout<<"c is:"<<c<<endl;
}
/* 解密 */
void decrypt() {
if(flag == 0) {
cout<<"setkey first:"<<endl;
proce_key();
}
cout<<"input c:";
cin>>c;
m = molar_multiplication(c,pr.d,pr.n);
cout<<"m is:"<<m<<endl;
}
/* 版權信息 */
void about() {
cout<<"*********************************************"<<endl;
cout<<"*** by Terry ***"<<endl;
cout<<"*** right 2010,All rights reserved by ***"<<endl;
cout<<"*** Terry,technology supported by weizuo !***"<<endl;
cout<<"*** If you have any question, please mail ***"<<endl;
cout<<"*** to [email protected] ! ***"<<endl;
cout<<"*** Computer of science and engineering ***"<<endl;
cout<<"*** XiDian University 2010-4-29 ***"<<endl;
cout<<"*********************************************"<<endl;
cout<<endl<<endl;
Init();
}
/* 消息映射 */
MsgMap Messagemap[] = {
,
,
,
,
};
/* 主函數,提供循環 */
void main() {
Init();
char d;
while((d = getchar())!='q') {
int i = 0;
while(Messagemap[i].ch) {
if(Messagemap[i].ch == d) {
Messagemap[i].handler();
break;
}
i++;
}
}
}
本程序由520huiqin編寫,詳情見參考資料
F. 非對稱加密演算法有哪些
RSA:RSA 是一種目前應用非常廣泛、歷史也比較悠久的非對稱秘鑰加密技術,在1977年被麻省理工學院的羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)三位科學家提出,由於難於破解,RSA 是目前應用最廣泛的數字加密和簽名技術,比如國內的支付寶就是通過RSA演算法來進行簽名驗證。它的安全程度取決於秘鑰的長度,目前主流可選秘鑰長度為 1024位、2048位、4096位等,理論上秘鑰越長越難於破解,按照維基網路上的說法,小於等於256位的秘鑰,在一台個人電腦上花幾個小時就能被破解,512位的秘鑰和768位的秘鑰也分別在1999年和2009年被成功破解,雖然目前還沒有公開資料證實有人能夠成功破解1024位的秘鑰,但顯然距離這個節點也並不遙遠,所以目前業界推薦使用 2048 位或以上的秘鑰,不過目前看 2048 位的秘鑰已經足夠安全了,支付寶的官方文檔上推薦也是2048位,當然更長的秘鑰更安全,但也意味著會產生更大的性能開銷。
DSA:既 Digital Signature Algorithm,數字簽名演算法,他是由美國國家標准與技術研究所(NIST)與1991年提出。和 RSA 不同的是 DSA 僅能用於數字簽名,不能進行數據加密解密,其安全性和RSA相當,但其性能要比RSA快。
ECDSA:Elliptic Curve Digital Signature Algorithm,橢圓曲線簽名演算法,是ECC(Elliptic curve cryptography,橢圓曲線密碼學)和 DSA 的結合,橢圓曲線在密碼學中的使用是在1985年由Neal Koblitz和Victor Miller分別獨立提出的,相比於RSA演算法,ECC 可以使用更小的秘鑰,更高的效率,提供更高的安全保障,據稱256位的ECC秘鑰的安全性等同於3072位的RSA秘鑰,和普通DSA相比,ECDSA在計算秘鑰的過程中,部分因子使用了橢圓曲線演算法。
G. 常見的非對稱加密演算法包括
包括rsa加密和橢圓加密演算法。
H. 非對稱加密的主要演算法有哪些
非對稱加密(公鑰加密):指加密和解密使用不同密鑰的加密演算法,也稱為公私鑰加密。假設兩個用戶要加密交換數據,雙方交換公鑰,使用時一方用對方的公鑰加密,另一方即可用自己的私鑰解密。如果企業中有n個用戶,企業需要生成n對密鑰,並分發n個公鑰。假設A用B的公鑰加密消息,用A的私鑰簽名,B接到消息後,首先用A的公鑰驗證簽名,確認後用自己的私鑰解密消息。由於公鑰是可以公開的,用戶只要保管好自己的私鑰即可,因此加密密鑰的分發將變得 十分簡單。同時,由於每個用戶的私鑰是唯一的,其他用戶除了可以通過信息發送者的公鑰來驗證信息的來源是否真實,還可以通過數字簽名確保發送者無法否認曾發送過該信息。
I. 非對稱加密演算法的主要應用
非對稱加密(公鑰加密):指加密和解密使用不同密鑰的加密演算法,也稱為公私鑰加密。假設兩個用戶要加密交換數據,雙方交換公鑰,使用時一方用對方的公鑰加密,另一方即可用自己的私鑰解密。如果企業中有n個用戶,企業需要生成n對密鑰,並分發n個公鑰。假設A用B的公鑰加密消息,用A的私鑰簽名,B接到消息後,首先用A的公鑰驗證簽名,確認後用自己的私鑰解密消息。由於公鑰是可以公開的,用戶只要保管好自己的私鑰即可,因此加密密鑰的分發將變得 十分簡單。同時,由於每個用戶的私鑰是唯一的,其他用戶除了可以通過信息發送者的公鑰來驗證信息的來源是否真實,還可以通過數字簽名確保發送者無法否認曾發送過該信息。非對稱加密的缺點是加解密速度要遠遠慢於對稱加密,在某些極端情況下,甚至能比對稱加密慢上1000倍。
//加密
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] PasswordBytes = encoding.GetBytes(password);//將密碼轉換為位元組數組RSACryptoServiceProvider crypt=new RSACryptoServiceProvider();//RSA加密演算法,非對稱PasswordBytes=crypt.Encrypt(password ,false);//加密位元組數組,這是加密後的密碼值,放入資料庫中的表欄位中。
string key=crypt.ToXmlString(true);//輸出密鑰為XML格式的字元串,且包含私鑰,這個字元串要作為資料庫表中的一個欄位同用戶的密碼放在一起。
//解密
RSACryptoServiceProvider crypt=new RSACryptoServiceProvider();//已隨機生成了一個密鑰對
crypt.Clear();//毀掉當前密鑰對
crypt.FromXmlString(key)//輸入密鑰對,key是從資料庫表欄位中讀取的那個XML格式的字元串,即密鑰欄位PasswordBytes=crypt.Decrypt(password ,false);//解密位元組數組,返回原始密碼給用戶
上面方法的一個特點是每個用戶對應一個密鑰(包含公鑰和私鑰),它們都是隨機生成的,所以各不相同。不過缺點也是很明顯的,就是密鑰存儲在資料庫中,如果資料庫被攻破密鑰就泄漏了。
還有另外一個方法就是依照上面方法隨機生成一個密鑰對(包含公鑰和私鑰),通過ToXmlString(true)方法導出,然後把這個XML字元串格式的密鑰放到你的Web程序的Web.config文件的AppSetting節點裡面,然後通過FromXmlString(key)方法讀入密鑰,這樣就意味著所有的用戶密碼都用同一個密鑰對加密和解密。