① 用RSA對下列數據實現加密和解密:
拜託:老大,你的家庭作業也來問?
你自己學吧:下面是課文^
RSA加密演算法
該演算法於1977年由美國麻省理工學院MIT(Massachusetts Institute of Technology)的Ronal Rivest,Adi Shamir和Len Adleman三位年輕教授提出,並以三人的姓氏Rivest,Shamir和Adlernan命名為RSA演算法。該演算法利用了數論領域的一個事實,那就是雖然把兩個大質數相乘生成一個合數是件十分容易的事情,但要把一個合數分解為兩個質數卻十分困難。合數分解問題目前仍然是數學領域尚未解決的一大難題,至今沒有任何高效的分解方法。與Diffie-Hellman演算法相比,RSA演算法具有明顯的優越性,因為它無須收發雙方同時參與加密過程,且非常適合於電子函件系統的加密。
RSA演算法可以表述如下:
(1) 密鑰配製。假設m是想要傳送的報文,現任選兩個很大的質數p與q,使得:
(12-1);
選擇正整數e,使得e與(p-1)(q-1)互質;這里(p-1)(q-1)表示二者相乘。再利用輾轉相除法,求得d,使得:
(12-2);
其中x mod y是整數求余運算,其結果是x整除以y後剩餘的余數,如5 mod 3 = 2。
這樣得:
(e,n),是用於加密的公共密鑰,可以公開出去;以及
(d,n),是用於解密的專用鑰匙,必須保密。
(2) 加密過程。使用(e,n)對明文m進行加密,演算法為:
(12-3);
這里的c即是m加密後的密文。
(3) 解密過程。使用(d,n)對密文c進行解密,演算法為:
(12-4);
求得的m即為對應於密文c的明文。
RSA演算法實現起來十分簡捷,據說英國的一位程序員只用了3行Perl程序便實現了加密和解密運算。
RSA演算法建立在正整數求余運算基礎之上,同時還保持了指數運算的性質,這一點我們不難證明。例如:
(12-5);
(12-6)。
RSA公共密鑰加密演算法的核心是歐拉(Euler)函數ψ。對於正整數n,ψ(n)定義為小於n且與n互質的正整數的個數。例如ψ(6) = 2,這是因為小於6且與6互質的數有1和5共兩個數;再如ψ(7) = 6,這是因為互質數有1,2,3,5,6共6個。
歐拉在公元前300多年就發現了ψ函數的一個十分有趣的性質,那就是對於任意小於n且與n互質的正整數m,總有mψ(n) mod n = 1。例如,5ψ(6) mod 6 = 52 mod 6= 25 mod 6 =1。也就是說,在對n求余的運算下,ψ(n)指數具有周期性。
當n很小時,計算ψ(n)並不難,使用窮舉法即可求出;但當n很大時,計算ψ(n)就十分困難了,其運算量與判斷n是否為質數的情況相當。不過在特殊情況下,利用ψ函數的兩個性質,可以極大地減少運算量。
性質1:如果p是質數,則ψ(p) = (p-1)。
性質2:如果p與q均為質數,則ψ(p·q) = ψ(p)·ψ(q) = (p-1)(q-1)。
RSA演算法正是注意到這兩條性質來設計公共密鑰加密系統的,p與q的乘積n可以作為公共密鑰公布出來,而n的因子p和q則包含在專用密鑰中,可以用來解密。如果解密需要用到ψ(n),收信方由於知道因子p和q,可以方便地算出ψ(n) = (p-1)(q-1)。如果竊聽者竊得了n,但由於不知道它的因子p與q,則很難求出ψ(n)。這時,竊聽者要麼強行算出ψ(n),要麼對n進行因數分解求得p與q。然而,我們知道,在大數范圍內作合數分解是十分困難的,因此竊密者很難成功。
有了關於ψ函數的認識,我們再來分析RSA演算法的工作原理:
(1) 密鑰配製。設m是要加密的信息,任選兩個大質數p與q,使得 ;選擇正整數e,使得e與ψ(n) = (p-1)(q-1)互質。
利用輾轉相除法,計算d,使得ed mod ψ(n) = ,即ed = kψ(n) +1,其中k為某一正整數。
公共密鑰為(e,n),其中沒有包含任何有關n的因子p和q的信息。
專用密鑰為(d,n),其中d隱含有因子p和q的信息。
(2) 加密過程。使用公式(12-3)對明文m進行加密,得密文c。
(3) 解密過程。使用(d,n)對密文c進行解密,計算過程為:
cd mod n = (me mod n)d mod n
= med mod n
= m(kψ(n) + 1) mod n
= (mkψ(n) mod n)·(m mod n)
= m
m即為從密文c中恢復出來的明文。
例如,假設我們需要加密的明文代碼信息為m = 14,則:
選擇e = 3,p = 5,q = 11;
計算出n = p·q = 55,(p-1)(q-1) = 40,d = 27;
可以驗證:(e·d) mod (p-1)(q-1) = 81 mod 40 = 1;
加密:c = me mod n = 143 mod 55 = 49;
解密:m = cd mod n = 4927 mod 55 = 14。
關於RSA演算法,還有幾點需要進一步說明:
(1) 之所以要求e與(p-1)(q-1)互質,是為了保證 ed mod (p-1)(q-1)有解。
(2) 實際操作時,通常先選定e,再找出並確定質數p和q,使得計算出d後它們能滿足公式(12-3)。常用的e有3和65537,這兩個數都是費馬序列中的數。費馬序列是以17世紀法國數學家費馬命名的序列。
(3) 破密者主要通過將n分解成p·q的辦法來解密,不過目前還沒有辦法證明這是唯一的辦法,也可能有更有效的方法,因為因數分解問題畢竟是一個不斷發展的領域,自從RSA演算法發明以來,人們已經發現了不少有效的因數分解方法,在一定程度上降低了破譯RSA演算法的難度,但至今還沒有出現動搖RSA演算法根基的方法。
(4) 在RSA演算法中,n的長度是控制該演算法可靠性的重要因素。目前129位、甚至155位的RSA加密勉強可解,但目前大多數加密程序均採用231、308甚至616位的RSA演算法,因此RSA加密還是相當安全的。
據專家測算,攻破512位密鑰RSA演算法大約需要8個月時間;而一個768位密鑰RSA演算法在2004年之前無法攻破。現在,在技術上還無法預測攻破具有2048位密鑰的RSA加密演算法需要多少時間。美國Lotus公司懸賞1億美元,獎勵能破譯其Domino產品中1024位密鑰的RSA演算法的人。從這個意義上說,遵照SET協議開發的電子商務系統是絕對安全的。
② RSA加密文件時是將文件轉換成什麼樣的數據進行加密的
文件的內容也是由位元組數據組成的,加密原理同理
還有,RSA加密效率非常低,一般只用來握手、驗證之類的,真正傳輸數據,還是用對稱秘鑰的演算法。
至於對稱秘鑰的秘鑰,可以用RSA加密來傳遞(為了安全)。可以去看看SSL怎麼實現的。
③ sql2008 資料庫 建表 表中的某一個欄位要加密處理
/*
1.利用對稱密鑰
搭配EncryptByKey進行數據jiami
使用DecryptByKey函數進行jiemi
這種方式比較適合大數據量
*/
CREATE SYMMETRIC KEY ZXC WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = 'ZXC123456'
OPEN SYMMETRIC KEY ZXC DECRYPTION BY PASSWORD = 'ZXC123456'
--jiami
SELECT Encryptbykey(Key_guid('ZXC'), 'YHDH_C')
--jiemi
SELECT CONVERT(VARCHAR(10), Decryptbykey())
CLOSE SYMMETRIC KEY ZXC;
DROP SYMMETRIC KEY ZXC;
/*
2.利用非對稱密鑰
搭配EncryptByAsymKey進行數據jiami
使用DecryptByAsymKey函數進行jiemi
用於更高安全級別的加jiemi數據
*/
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'XIAOMA'
CREATE ASYMMETRIC KEY ABC WITH ALGORITHM=RSA_2048 ENCRYPTION BY PASSWORD = 'ZXC123456'
ALTER ASYMMETRIC KEY ABC WITH PRIVATE KEY (DECRYPTION BY PASSWORD = 'ZXC123456')
--jiami
Select Encryptbyasymkey(Asymkey_id ('ABC'), 'ZXC123456')
SELECT CONVERT(VARCHAR(100), Decryptbyasymkey (Asymkey_id('ABC'),96B1F7E7B7AC3E945E106D82 ))
DROP ASYMMETRIC KEY ABC;
DROP MASTER KEY
/*
3.利用憑證的方式
搭配EncryptByCert進行jiami
DecryptByCert函數進行jiemi
比較類似非對稱密鑰
*/
CREATE CERTIFICATE ZXC
ENCRYPTION BY PASSWORD = 'xiaoxiao'
WITH SUBJECT = 'DB_Encrypt_Demo Database Encryption Certificate',
START_DATE = '2015-10-1'
--jiami
Select Encryptbycert(Cert_id('ZXC'), '123456')
--jiemi
SELECT convert(Varchar(10), Decryptbycert(Cert_id('ZXC'), ,N'xiaoxiao'))
DROP CERTIFICATE ZXC;
/*
4.利用mima短語方式
搭配EncryptBypassPhrase進行jiami
使用DecryptByPassPhrase函數來jiemi
比較適合一般的數據加jiemi
*/
--jiami
Select Encryptbypassphrase('xiaoma', '123456')
--jiemi
SELECT CONVERT(VARCHAR(100), Decryptbypassphrase('xiaoma', ))
④ 怎麼對資料庫已有的數據進行加密
第一層
服務主密鑰
備份服務主密鑰
backup
service
master
key
to
file='c:\smk.bak'
encryption
by
password='P@ssw0rd'
restore
service
master
key
from
file='c:\smk.bak'
decryption
by
password='P@ssw0rd'
第二層
資料庫主密鑰
1)必須先在該資料庫上創建資料庫主密鑰才能使用
create
master
key
encryption
by
password='P@ssw0rd'
2)使用資料庫主密鑰
-如果資料庫主密鑰使用服務密鑰進行保護,則在使用時會自動打開
opren
master
key
decryption
by
password='P@ssw0rd'
3)查看資料庫主密鑰狀態
sys.symmetric_keys
4)備份資料庫主密鑰
backup
master
key
to
file='c:\smk.bak'
encryption
by
password='P@ssw0rd'
restore
master
key
from
file='c:\smk.bak'
decryption
by
password='P@ssw0rd'
⑤ 在數據加密類型中RSA採用的是對稱密鑰體制嗎
不是,這是典型的非對稱加解密演算法,是三個人的名字字頭。
實際應用的時候,是交換了信息,生成一個密鑰,然後就是對稱加解密了,幾分鍾一換,對稱的演算法速度快
⑥ 文件資料庫加密,怎樣加密文件資料庫,加密資料庫
加密演算法有對稱加密和非對稱加密。
對稱加密比如DES在加密和解密時使用同一個密鑰,通過密鑰就能還原了。
而非對稱加密比如RSA加密和解密時使用不同的密鑰,加密使用私鑰,而解密時需要公鑰;另外現在很多密碼存儲都是通過散列演算法的比如MD5。
而MD5是單向的,不能逆向解密(數學非常好可以嘗試下);所以很多網站門戶用戶密碼丟失時都是重置密碼而不能找回。
⑦ 與md5 一樣給用於資料庫數據加密的 還有什麼 免費付費的都可以 最好有網址
1. MD5加密,常用於加密用戶名密碼,當用戶驗證時。} }2. SHA加密,與MD5相似的用法,只是兩者的演算法不同。} }3. RSA加密,RAS加密允許解密。常用於文本內容的加密。
1. MD5加密,常用於加密用戶名密碼,當用戶驗證時。
protected byte[] encrypt(byte[] obj) ...{
try ...{
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(obj);
return md5.digest();
} catch (NoSuchAlgorithmException e) ...{
e.printStackTrace();
}
}
2. SHA加密,與MD5相似的用法,只是兩者的演算法不同。
protected byte[] encrypt(byte[] obj) ...{
try ...{
MessageDigest sha = MessageDigest.getInstance("SHA");
sha.update(obj);
return sha.digest();
} catch (NoSuchAlgorithmException e) ...{
e.printStackTrace();
}
}
3. RSA加密,RAS加密允許解密。常用於文本內容的加密。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import javax.crypto.Cipher;/** *//**
* RSAEncrypt
*
* @author maqujun
* @see
*/
public class RSAEncrypt ...{
/** *//**
* Main method for RSAEncrypt.
* @param args
*/
public static void main(String[] args) ...{
try ...{
RSAEncrypt encrypt = new RSAEncrypt();
String encryptText = "encryptText";
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
// Generate keys
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
byte[] e = encrypt.encrypt(publicKey, encryptText.getBytes());
byte[] de = encrypt.decrypt(privateKey,e);
System.out.println(encrypt.bytesToString(e));
System.out.println(encrypt.bytesToString(de));
} catch (Exception e) ...{
e.printStackTrace();
}
}
/** *//**
* Change byte array to String.
* @return byte[]
*/
protected String bytesToString(byte[] encrytpByte) ...{
String result = "";
for (Byte bytes : encrytpByte) ...{
result += (char) bytes.intValue();
}
return result;
}
/** *//**
* Encrypt String.
* @return byte[]
*/
protected byte[] encrypt(RSAPublicKey publicKey, byte[] obj) ...{
if (publicKey != null) ...{
try ...{
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(obj);
} catch (Exception e) ...{
e.printStackTrace();
}
}
return null;
}
/** *//**
* Basic decrypt method
* @return byte[]
*/
protected byte[] decrypt(RSAPrivateKey privateKey, byte[] obj) ...{
if (privateKey != null) ...{
try ...{
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(obj);
} catch (Exception e) ...{
e.printStackTrace();
}
}
return null;
}
}
以上是針對java數據加密的,其實ASP中常用到的都是MD5,偶爾有人用哈希加密(SHA-1),其它的就更少人用了。不過恰好我這里有MD5和哈希加密的原文件,如果想用我可以給你傳過去。
⑧ RSA加密為什麼很難破解
該演算法要求的是找的素數要足夠大,才能保證該演算法的安全性。首先你需要編程找出足夠足夠大的素數,然後再用 RSA 演算法去進行加密和解密。加密和解密的演算法是雙向的。
⑨ 資料庫怎麼加密
當數據被存儲時候被加密,它們被使用的時候就會自動加密。在其他的情況下,你可以選擇數據是否要被加密。SQL Server資料庫可以加密下列這些組件:密碼存儲過程,視圖,觸發器,用戶自定義函數,默認值,和規則。
在伺服器和用戶之間傳輸的數據密碼加密SQL Server自動將你分配給登陸和應用角色的密碼加密。盡管當你可以從主資料庫中直接察看系統表格而不需要密碼。你不能給對這種情況作出任何修改,事實上,你根本不能破壞它。
定義加密在有些時候,如果對對象進行加密是防止將一些信息分享給他人。例如,一個存儲進程可能包含所有者的商業信息,但是這個信息不能和讓其他的人看到,即使他們公開的系統表格並可以看到對象的定義。這就是為什麼SQL Server資料庫允許你在創建一個對象的時候進行加密。為了加密一個存儲進程,使用下面形式的CREAT PROCEDURE 語句:
CREATEPROCEDUREprocerename[;number]
[@parameterdatatype
[VARYING][=defaultvalue][OUTPUT]]
[,]
[WITHRECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION]
我們關心的僅僅是可選的WITH參數。你可以詳細說明ARECOMPILE或者ENCRYPTION,或者你可以同時說明它們。ENCRYPTION關鍵字保護SQL Server資料庫它不被公開在進程中。結果,如果ENCRYPTION在激活的時候系統存儲進程sp_helptext就會被忽視,這個存儲進程將被存儲在用戶創建進程的文本中。
如果你不想要加密,你可以使用ALTER PROCEDURE,忽略WITH ENCRYPTION子句來重新創建一個進程。
為了能夠使用加密。用戶和伺服器都應該使用TCP/IP NetworkLibraries用來連接。運行適當的Network Utility和檢查Force protocol encryption,看下錶,用戶和伺服器之間的連接將不會被加密。
加密也不能完全自由。當連接確定後源碼天空
,要繼續其他的構造,並且用戶和伺服器必須運行代碼來解釋加密和解釋的包裹。這里將需要一些開銷並且當在編譯碼的時候會使進程慢下來。
是否可以解決您的問題?