導航:首頁 > 文檔加密 > 私鑰加密例子

私鑰加密例子

發布時間:2022-06-22 11:34:59

① 關於加密、解密演算法、密鑰,哪位能給我舉個形象的例子

加密就像你鑰匙深進鑰匙孔,逆時針轉一下
解密就像你鑰匙深進鑰匙孔,順時針轉一下
密鑰就像你那把鑰匙上面的齒
暴力破解就像做了世界上所有可能的齒的鑰匙,一把一把試。不可以理解為直接砸開。
就像商場裡衣服上有個鎖,如果沒有鑰匙,就算怎麼弄開,那件衣服都沒法穿了。所以就一定要有鑰匙。
所以密鑰叫作key(鑰匙)

應該很形象了吧。

加密從數學角度就是一個像函數c=E(m,k)
輸入:m是消息明文,k是密鑰,
輸出:c是消息密文

D是E的反函數,m'=D(c',k')
輸入:c'是消息密文,k'是密鑰,
輸出:m'是消息明文

當c=c', k=k'時,一定有m=m'

c,m,k可以看成一個個大整數,比如c=394783579347293479382。
最簡單的一個加密就是
E(m,k)=m+k
D(c,k)=c-k

② 公鑰和私鑰技術的區別

(一)對稱加密(Symmetric Cryptography)
對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key),這種方法在密碼學中叫做對稱加密演算法。對稱加密有很多種演算法,由於它效率很高,所以被廣泛使用在很多加密協議的核心當中。
對稱加密通常使用的是相對較小的密鑰,一般小於256 bit。因為密鑰越大,加密越強,但加密與解密的過程越慢。如果你只用1 bit來做這個密鑰,那黑客們可以先試著用0來解密,不行的話就再用1解;但如果你的密鑰有1 MB大,黑客們可能永遠也無法破解,但加密和解密的過程要花費很長的時間。密鑰的大小既要照顧到安全性,也要照顧到效率,是一個trade-off。
2000年10月2日,美國國家標准與技術研究所(NIST--American National Institute of Standards and Technology)選擇了Rijndael演算法作為新的高級加密標准(AES--Advanced Encryption Standard)。.NET中包含了Rijndael演算法,類名叫RijndaelManaged,下面舉個例子。
加密過程:

private string myData = "hello";
private string myPassword = "OpenSesame";
private byte[] cipherText;
private byte[] salt = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0 };

private void mnuSymmetricEncryption_Click(object sender, RoutedEventArgs e)
{
var key = new Rfc2898DeriveBytes(myPassword, salt);
// Encrypt the data.
var algorithm = new RijndaelManaged();
algorithm.Key = key.GetBytes(16);
algorithm.IV = key.GetBytes(16);
var sourceBytes = new System.Text.UnicodeEncoding().GetBytes(myData);
using (var sourceStream = new MemoryStream(sourceBytes))
using (var destinationStream = new MemoryStream())
using (var crypto = new CryptoStream(sourceStream, algorithm.CreateEncryptor(), CryptoStreamMode.Read))
{
moveBytes(crypto, destinationStream);
cipherText = destinationStream.ToArray();
}
MessageBox.Show(String.Format("Data:{0}{1}Encrypted and Encoded:{2}", myData, Environment.NewLine, Convert.ToBase64String(cipherText)));
}
private void moveBytes(Stream source, Stream dest)
{
byte[] bytes = new byte[2048];
var count = source.Read(bytes, 0, bytes.Length);
while (0 != count)
{
dest.Write(bytes, 0, count);
count = source.Read(bytes, 0, bytes.Length);
}
}

解密過程:

private void mnuSymmetricDecryption_Click(object sender, RoutedEventArgs e)
{
if (cipherText == null)
{
MessageBox.Show("Encrypt Data First!");
return;
}
var key = new Rfc2898DeriveBytes(myPassword, salt);
// Try to decrypt, thus showing it can be round-tripped.
var algorithm = new RijndaelManaged();
algorithm.Key = key.GetBytes(16);
algorithm.IV = key.GetBytes(16);
using (var sourceStream = new MemoryStream(cipherText))
using (var destinationStream = new MemoryStream())
using (var crypto = new CryptoStream(sourceStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read))
{
moveBytes(crypto, destinationStream);
var decryptedBytes = destinationStream.ToArray();
var decryptedMessage = new UnicodeEncoding().GetString(
decryptedBytes);
MessageBox.Show(decryptedMessage);
}
}

對稱加密的一大缺點是密鑰的管理與分配,換句話說,如何把密鑰發送到需要解密你的消息的人的手裡是一個問題。在發送密鑰的過程中,密鑰有很大的風險會被黑客們攔截。現實中通常的做法是將對稱加密的密鑰進行非對稱加密,然後傳送給需要它的人。

(二)非對稱加密(Asymmetric Cryptography)
1976年,美國學者Dime和Henman為解決信息公開傳送和密鑰管理問題,提出一種新的密鑰交換協議,允許在不安全的媒體上的通訊雙方交換信息,安全地達成一致的密鑰,這就是「公開密鑰系統」。相對於「對稱加密演算法」這種方法也叫做「非對稱加密演算法」。
非對稱加密為數據的加密與解密提供了一個非常安全的方法,它使用了一對密鑰,公鑰(public key)和私鑰(private key)。私鑰只能由一方安全保管,不能外泄,而公鑰則可以發給任何請求它的人。非對稱加密使用這對密鑰中的一個進行加密,而解密則需要另一個密鑰。比如,你向銀行請求公鑰,銀行將公鑰發給你,你使用公鑰對消息加密,那麼只有私鑰的持有人--銀行才能對你的消息解密。與對稱加密不同的是,銀行不需要將私鑰通過網路發送出去,因此安全性大大提高。
目前最常用的非對稱加密演算法是RSA演算法,是Rivest, Shamir, 和Adleman於1978年發明,他們那時都是在MIT。.NET中也有RSA演算法,請看下面的例子:
加密過程:

private byte[] rsaCipherText;
private void mnuAsymmetricEncryption_Click(object sender, RoutedEventArgs e)
{
var rsa = 1;
// Encrypt the data.
var cspParms = new CspParameters(rsa);
cspParms.Flags = CspProviderFlags.UseMachineKeyStore;
cspParms.KeyContainerName = "My Keys";
var algorithm = new RSACryptoServiceProvider(cspParms);
var sourceBytes = new UnicodeEncoding().GetBytes(myData);
rsaCipherText = algorithm.Encrypt(sourceBytes, true);
MessageBox.Show(String.Format("Data: {0}{1}Encrypted and Encoded: {2}",
myData, Environment.NewLine,
Convert.ToBase64String(rsaCipherText)));
}

解密過程:

private void mnuAsymmetricDecryption_Click(object sender, RoutedEventArgs e)
{
if(rsaCipherText==null)
{
MessageBox.Show("Encrypt First!");
return;
}
var rsa = 1;
// decrypt the data.
var cspParms = new CspParameters(rsa);
cspParms.Flags = CspProviderFlags.UseMachineKeyStore;
cspParms.KeyContainerName = "My Keys";
var algorithm = new RSACryptoServiceProvider(cspParms);
var unencrypted = algorithm.Decrypt(rsaCipherText, true);
MessageBox.Show(new UnicodeEncoding().GetString(unencrypted));
}

雖然非對稱加密很安全,但是和對稱加密比起來,它非常的慢,所以我們還是要用對稱加密來傳送消息,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發送出去。為了解釋這個過程,請看下面的例子:
(1) Alice需要在銀行的網站做一筆交易,她的瀏覽器首先生成了一個隨機數作為對稱密鑰。
(2) Alice的瀏覽器向銀行的網站請求公鑰。
(3) 銀行將公鑰發送給Alice。
(4) Alice的瀏覽器使用銀行的公鑰將自己的對稱密鑰加密。
(5) Alice的瀏覽器將加密後的對稱密鑰發送給銀行。
(6) 銀行使用私鑰解密得到Alice瀏覽器的對稱密鑰。
(7) Alice與銀行可以使用對稱密鑰來對溝通的內容進行加密與解密了。

(三)總結
(1) 對稱加密加密與解密使用的是同樣的密鑰,所以速度快,但由於需要將密鑰在網路傳輸,所以安全性不高。
(2) 非對稱加密使用了一對密鑰,公鑰與私鑰,所以安全性高,但加密與解密速度慢。
(3) 解決的辦法是將對稱加密的密鑰使用非對稱加密的公鑰進行加密,然後發送出去,接收方使用私鑰進行解密得到對稱加密的密鑰,然後雙方可以使用對稱加密來進行溝通。

③ 公鑰與私鑰的區別與應用。

現實生活中,我要給依依轉1個比特幣,我需要在比特幣交易平台、比特幣錢包或者比特幣客戶端裡面,輸入我的比特幣錢包地址、依依的錢包地址、轉出比特幣的數量、手續費。然後,我們等十分鍾左右,礦工處理完交易信息之後,這1個比特幣就成功地轉給依依了。

這個過程看似很簡單也很便捷,跟我們現在的銀行卡轉賬沒什麼區別,但是,你知道這個過程是怎樣在比特幣系統裡面實現的嗎?它隱藏了哪些原理呢?又或者,它是如何保證交易能夠在一個安全的環境下進行呢?

我們今天就來講一講。

對於轉出方和接收方來講,也就是我和依依(我是轉出方,依依是接收方)我們都需要出具兩個東西:錢包地址、私鑰。

我們先說錢包地址。比特幣錢包地址其實就相當於銀行卡、支付寶賬號、微信錢包賬號,是比特幣支付轉賬的「憑證」,記錄著平台與平台、錢包與錢包、錢包與平台之間的轉賬信息。

我們在使用銀行卡、支付寶、微信轉賬時都需要密碼,才能夠支付成功。那麼,在比特幣轉賬中,同樣也有這么一個「密碼」,這個「密碼「被稱作「私鑰」。掌握了私鑰,就掌握了其對應比特幣地址上的生殺大權。

「私鑰」是屬於「非對稱加密演算法」裡面的概念,與之對應的還有另一個概念,名叫:「公鑰」。

公鑰和私鑰,從字面意思我們就可以理解:公鑰,是可以公開的;而私鑰,是私人的、你自己擁有的、需要絕對保密的。

公鑰是根據私鑰計算形成的,比特幣系統使用的是橢圓曲線加密演算法,來根據私鑰計算出公鑰。這就使得,公鑰和私鑰形成了唯一對應的關系:當你用了其中一把鑰匙加密信息時,只有配對的另一把鑰匙才能解密。所以,正是基於這種唯一對應的關系,它們可以用來驗證信息發送方的身份,還可以做到絕對的保密。

我們舉個例子講一下,在非對稱加密演算法中,公鑰和私鑰是怎麼運作的。

我們知道,公鑰是可以對外公開的,那麼,所有人都知道我們的公鑰。在轉賬過程中,我不僅要確保比特幣轉給依依,而不會轉給別人,還得讓依依知道,這些比特幣是我轉給她的,不是鹿鹿,也不是韭哥。

比特幣系統可以滿足我的上述訴求:比特幣系統會把我的交易信息縮短成固定長度的字元串,也就是一段摘要,然後把我的私鑰附在這個摘要上,形成一個數字簽名。因為數字簽名裡面隱含了我的私鑰信息,所以,數字簽名可以證明我的身份。

完成之後,完整的交易信息和數字簽名會一起廣播給礦工,礦工用我的公鑰進行驗證、看看我的公鑰和我的數字簽名能不能匹配上,如果驗證成功,都沒問題,那麼,就能夠說明這個交易確實是我發出的,而且信息沒有被更改。

接下來,礦工需要驗證,這筆交易花費的比特幣是否是「未被花費」的交易。如果驗證成功,則將其放入「未確認交易」,等待被打包;如果驗證失敗,則該交易會被標記為「無效交易」,不會被打包。

其實,公鑰和私鑰,簡單理解就是:既然是加密,那肯定是不希望別人知道我的消息,所以只能我才能解密,所以可得出:公鑰負責加密,私鑰負責解密;同理,既然是簽名,那肯定是不希望有人冒充我的身份,只有我才能發布這個數字簽名,所以可得出:私鑰負責簽名,公鑰負責驗證。

到這里,我們簡單概括一下上面的內容。上面我們主要講到這么幾個詞:私鑰、公鑰、錢包地址、數字簽名,它們之間的關系我們理一下:

(1)私鑰是系統隨機生成的,公鑰是由私鑰計算得出的,錢包地址是由公鑰計算得出的,也就是:私鑰——公鑰——錢包地址,這樣一個過程;

(2)數字簽名,是由交易信息+私鑰信息計算得出的,因為數字簽名隱含私鑰信息,所以可以證明自己的身份。

私鑰、公鑰都是密碼學范疇的,屬於「非對稱加密」演算法中的「橢圓加密演算法」,之所以採用這種演算法,是為了保障交易的安全,二者的作用在於:

(1)公鑰加密,私鑰解密:公鑰全網公開,我用依依的公鑰給信息加密,依依用自己的私鑰可以解密;

(2)私鑰簽名,公鑰驗證:我給依依發信息,我加上我自己的私鑰信息形成數字簽名,依依用我的公鑰來驗證,驗證成功就證明的確是我發送的信息。

只不過,在比特幣交易中,加密解密啦、驗證啦這些都交給礦工了。

至於我們現在經常用的錢包APP,只不過是私鑰、錢包地址和其他區塊鏈數據的管理工具而已。錢包又分冷錢包和熱錢包,冷錢包是離線的,永遠不聯網的,一般是以一些實體的形式出現,比如小本子什麼的;熱錢包是聯網的,我們用的錢包APP就屬於熱錢包。

④ 關於私鑰加密 公鑰解密

如果只是單方面採用非對稱性加密演算法,其實有兩種方式,用於不同用處.
第一種是簽名,使用私鑰加密,公鑰解密,用於讓所有公鑰所有者驗證私鑰所有者的身份並且用來防止私鑰所有者發布的內容被篡改.但是不用來保證內容不被他人獲得.
第二種是加密,用公鑰加密,私鑰解密,用於向公鑰所有者發布信息,這個信息可能被他人篡改,但是無法被他人獲得.
如果甲想給乙發一個安全的保密的數據,那麼應該甲乙各自有一個私鑰,甲先用乙的公鑰加密這段數據,再用自己的私鑰加密這段加密後的數據.最後再發給乙,這樣確保了內容即不會被讀取,也不會被篡改.

⑤ 最著名的私鑰加密演算法是

MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明,經MD2、MD3和MD4發展而來。
MD5將任意長度的「位元組串」變換成一個128bit的大整數,並且它是一個不可逆的字元串變換演算法,換句話說就是,即使你看到源程序和演算法描述,也無法將一個MD5的值變換回原始的字元串,從數學原理上說,是因為原始的字元串有無窮多個,這有點象不存在反函數的數學函數。
MD5的典型應用是對一段Message(位元組串)產生fingerprint(指紋),以防止被「篡改」。舉個例子,你將一段話寫在一個叫 readme.txt文件中,並對這個readme.txt產生一個MD5的值並記錄在案,然後你可以傳播這個文件給別人,別人如果修改了文件中的任何內容,你對這個文件重新計算MD5時就會發現。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的「抵賴」,這就是所謂的數字簽名應用。
MD5還廣泛用於加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它演算法)的方式保存的, 用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然後再去和系統中保存的MD5值進行比較,而系統並不「知道」用戶的密碼是什麼。
RSA是第一個既能用於數據加密也能用於數字簽名的演算法。它易於理解和操作,也很流行。演算法的名字以發明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理論上的證明。它經歷了各種攻擊,至今未被完全攻破。
DES演算法
美國國家標准局1973年開始研究除國防部外的其它部門的計算機系統的數據加密標准,於1973年5月15日和1974年8月27日先後兩次向公眾發出了徵求加密演算法的公告。 1977年1月,美國政府頒布:採納IBM公司設計的方案作為非機密數據的正式數據加密標准(DES?Data Encryption Standard)。

⑥ CryptoAPI怎樣公鑰加密私鑰解密

本文主要談一下密碼學中的加密和數字簽名,以及其在java中如何進行使用。對密碼學有興趣的夥伴,推薦看Bruce Schneier的著作:Applied Crypotography。在jdk1.5的發行版本中安全性方面有了很大的改進,也提供了對RSA演算法的直接支持,現在我們從實例入手解決問題(本文僅是作為簡單介紹): 一、密碼學上常用的概念 1)消息摘要: 這是一種與消息認證碼結合使用以確保消息完整性的技術。主要使用單向散列函數演算法,可用於檢驗消息的完整性,和通過散列密碼直接以文本形式保存等,目前廣泛使用的演算法有MD4、MD5、SHA-1,jdk1.5對上面都提供了支持,在java中進行消息摘要很簡單, java.security.MessageDigest提供了一個簡易的操作方法: /** *MessageDigestExample.java *Copyright 2005-2-16 */ import java.security.MessageDigest; /** *單一的消息摘要演算法,不使用密碼.可以用來對明文消息(如:密碼)隱藏保存 */ public class MessageDigestExample{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.err.println("Usage:java MessageDigestExample text"); System.exit(1); } byte[] plainText=args[0].getBytes("UTF8"); //使用getInstance("演算法")來獲得消息摘要,這里使用SHA-1的160位演算法 MessageDigest messageDigest=MessageDigest.getInstance("SHA-1"); System.out.println(" "+messageDigest.getProvider().getInfo()); //開始使用演算法 messageDigest.update(plainText); System.out.println(" Digest:"); //輸出演算法運算結果 System.out.println(new String(messageDigest.digest(),"UTF8")); } } 還可以通過消息認證碼來進行加密實現,javax.crypto.Mac提供了一個解決方案,有興趣者可以參考相關API文檔,本文只是簡單介紹什麼是摘要演算法。 2)私鑰加密: 消息摘要只能檢查消息的完整性,但是單向的,對明文消息並不能加密,要加密明文的消息的話,就要使用其他的演算法,要確保機密性,我們需要使用私鑰密碼術來交換私有消息。 這種最好理解,使用對稱演算法。比如:A用一個密鑰對一個文件加密,而B讀取這個文件的話,則需要和A一樣的密鑰,雙方共享一個私鑰(而在web環境下,私鑰在傳遞時容易被偵聽): 使用私鑰加密的話,首先需要一個密鑰,可用javax.crypto.KeyGenerator產生一個密鑰(java.security.Key),然後傳遞給一個加密工具(javax.crypto.Cipher),該工具再使用相應的演算法來進行加密,主要對稱演算法有:DES(實際密鑰只用到56位),AES(支持三種密鑰長度:128、192、256位),通常首先128位,其他的還有DESede等,jdk1.5種也提供了對對稱演算法的支持,以下例子使用AES演算法來加密: /** *PrivateExmaple.java *Copyright 2005-2-16 */ import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import java.security.Key; /** *私鈅加密,保證消息機密性 */ public class PrivateExample{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.err.println("Usage:java PrivateExample "); System.exit(1); } byte[] plainText=args[0].getBytes("UTF8"); //通過KeyGenerator形成一個key System.out.println(" Start generate AES key"); KeyGenerator keyGen=KeyGenerator.getInstance("AES"); keyGen.init(128); Key key=keyGen.generateKey(); System.out.println("Finish generating DES key"); //獲得一個私鈅加密類Cipher,ECB是加密方式,PKCS5Padding是填充方法 Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding"); System.out.println(" "+cipher.getProvider().getInfo()); //使用私鈅加密 System.out.println(" Start encryption:"); cipher.init(Cipher.ENCRYPT_MODE,key); byte[] cipherText=cipher.doFinal(plainText); System.out.println("Finish encryption:"); System.out.println(new String(cipherText,"UTF8")); System.out.println(" Start decryption:"); cipher.init(Cipher.DECRYPT_MODE,key); byte[] newPlainText=cipher.doFinal(cipherText); System.out.println("Finish decryption:"); System.out.println(new String(newPlainText,"UTF8")); } } 3)公鑰加密: 上面提到,私鑰加密需要一個共享的密鑰,那麼如何傳遞密鑰呢?web環境下,直接傳遞的話很容易被偵聽到,幸好有了公鑰加密的出現。公鑰加密也叫不對稱加密,不對稱演算法使用一對密鑰對,一個公鑰,一個私鑰,使用公鑰加密的數據,只有私鑰能解開(可用於加密);同時,使用私鑰加密的數據,只有公鑰能解開(簽名)。但是速度很慢(比私鑰加密慢100到1000倍),公鑰的主要演算法有RSA,還包括Blowfish,Diffie-Helman等,jdk1.5種提供了對RSA的支持,是一個改進的地方: /** *PublicExample.java *Copyright 2005-2-16 */ import java.security.Key; import javax.crypto.Cipher; import java.security.KeyPairGenerator; import java.security.KeyPair; /** *一個簡單的公鈅加密例子,Cipher類使用KeyPairGenerator生成的公鈅和私鈅 */ public class PublicExample{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.err.println("Usage:java PublicExample "); System.exit(1); } byte[] plainText=args[0].getBytes("UTF8"); //構成一個RSA密鑰 System.out.println(" Start generating RSA key"); KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair key=keyGen.generateKeyPair(); System.out.println("Finish generating RSA key"); //獲得一個RSA的Cipher類,使用公鈅加密 Cipher cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding"); System.out.println(" "+cipher.getProvider().getInfo()); System.out.println(" Start encryption"); cipher.init(Cipher.ENCRYPT_MODE,key.getPublic()); byte[] cipherText=cipher.doFinal(plainText); System.out.println("Finish encryption:"); System.out.println(new String(cipherText,"UTF8")); //使用私鈅解密 System.out.println(" Start decryption"); cipher.init(Cipher.DECRYPT_MODE,key.getPrivate()); byte[] newPlainText=cipher.doFinal(cipherText); System.out.println("Finish decryption:"); System.out.println(new String(newPlainText,"UTF8")); } } 4)數字簽名: 數字簽名,它是確定交換消息的通信方身份的第一個級別。上面A通過使用公鑰加密數據後發給B,B利用私鑰解密就得到了需要的數據,問題來了,由於都是使用公鑰加密,那麼如何檢驗是A發過來的消息呢?上面也提到了一點,私鑰是唯一的,那麼A就可以利用A自己的私鑰進行加密,然後B再利用A的公鑰來解密,就可以了;數字簽名的原理就基於此,而通常為了證明發送數據的真實性,通過利用消息摘要獲得簡短的消息內容,然後再利用私鑰進行加密散列數據和消息一起發送。java中為數字簽名提供了良好的支持,java.security.Signature類提供了消息簽名: /** *DigitalSignature2Example.java *Copyright 2005-2-16 */ import java.security.Signature; import java.security.KeyPairGenerator; import java.security.KeyPair; import java.security.SignatureException; /** *數字簽名,使用RSA私鑰對對消息摘要簽名,然後使用公鈅驗證 測試 */ public class DigitalSignature2Example{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.err.println("Usage:java DigitalSignature2Example "); System.exit(1); } byte[] plainText=args[0].getBytes("UTF8"); //形成RSA公鑰對 System.out.println(" Start generating RSA key"); KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair key=keyGen.generateKeyPair(); System.out.println("Finish generating RSA key"); //使用私鈅簽名 Signature sig=Signature.getInstance("SHA1WithRSA"); sig.initSign(key.getPrivate()); sig.update(plainText); byte[] signature=sig.sign(); System.out.println(sig.getProvider().getInfo()); System.out.println(" Signature:"); System.out.println(new String(signature,"UTF8")); //使用公鈅驗證 System.out.println(" Start signature verification"); sig.initVerify(key.getPublic()); sig.update(plainText); try{ if(sig.verify(signature)){ System.out.println("Signature verified"); }else System.out.println("Signature failed"); }catch(SignatureException e){ System.out.println("Signature failed"); } } } 5)數字證書。 還有個問題,就是公鑰問題,A用私鑰加密了,那麼B接受到消息後,用A提供的公鑰解密;那麼現在有個討厭的C,他把消息攔截了,然後用自己的私鑰加密,同時把自己的公鑰發給B,並告訴B,那是A的公鑰,結果....,這時候就需要一個中間機構出來說話了(相信權威,我是正確的),就出現了Certificate Authority(也即CA),有名的CA機構有Verisign等,目前數字認證的工業標準是:CCITT的X.509: 數字證書:它將一個身份標識連同公鑰一起進行封裝,並由稱為認證中心或 CA 的第三方進行數字簽名。 密鑰庫:java平台為你提供了密鑰庫,用作密鑰和證書的資源庫。從物理上講,密鑰庫是預設名稱為 .keystore 的文件(有一個選項使它成為加密文件)。密鑰和證書可以擁有名稱(稱為別名),每個別名都由唯一的密碼保護。密鑰庫本身也受密碼保護;您可以選擇讓每個別名密碼與主密鑰庫密碼匹配。 使用工具keytool,我們來做一件自我認證的事情吧(相信我的認證): 1、創建密鑰庫keytool -genkey -v -alias feiUserKey -keyalg RSA 默認在自己的home目錄下(windows系統是c:documents and settings<你的用戶名> 目錄下的.keystore文件),創建我們用 RSA 演算法生成別名為 feiUserKey 的自簽名的證書,如果使用了-keystore mm 就在當前目錄下創建一個密鑰庫mm文件來保存密鑰和證書。 2、查看證書:keytool -list 列舉了密鑰庫的所有的證書 也可以在dos下輸入keytool -help查看幫助。 4)數字簽名: 數字簽名,它是確定交換消息的通信方身份的第一個級別。上面A通過使用公鑰加密數據後發給B,B利用私鑰解密就得到了需要的數據,問題來了,由於都是使用公鑰加密,那麼如何檢驗是A發過來的消息呢?上面也提到了一點,私鑰是唯一的,那麼A就可以利用A自己的私鑰進行加密,然後B再利用A的公鑰來解密,就可以了;數字簽名的原理就基於此,而通常為了證明發送數據的真實性,通過利用消息摘要獲得簡短的消息內容,然後再利用私鑰進行加密散列數據和消息一起發送。java中為數字簽名提供了良好的支持,java.security.Signature類提供了消息簽名: /** *DigitalSignature2Example.java *Copyright 2005-2-16 */ import java.security.Signature; import java.security.KeyPairGenerator; import java.security.KeyPair; import java.security.SignatureException; /** *數字簽名,使用RSA私鑰對對消息摘要簽名,然後使用公鈅驗證 測試 */ public class DigitalSignature2Example{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.err.println("Usage:java DigitalSignature2Example "); System.exit(1); } byte[] plainText=args[0].getBytes("UTF8"); //形成RSA公鑰對 System.out.println(" Start generating RSA key"); KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair key=keyGen.generateKeyPair(); System.out.println("Finish generating RSA key"); //使用私鈅簽名 Signature sig=Signature.getInstance("SHA1WithRSA"); sig.initSign(key.getPrivate()); sig.update(plainText); byte[] signature=sig.sign(); System.out.println(sig.getProvider().getInfo()); System.out.println(" Signature:"); System.out.println(new String(signature,"UTF8")); //使用公鈅驗證 System.out.println(" Start signature verification"); sig.initVerify(key.getPublic()); sig.update(plainText); try{ if(sig.verify(signature)){ System.out.println("Signature verified"); }else System.out.println("Signature failed"); }catch(SignatureException e){ System.out.println("Signature failed"); } } } 5)數字證書。 還有個問題,就是公鑰問題,A用私鑰加密了,那麼B接受到消息後,用A提供的公鑰解密;那麼現在有個討厭的C,他把消息攔截了,然後用自己的私鑰加密,同時把自己的公鑰發給B,並告訴B,那是A的公鑰,結果....,這時候就需要一個中間機構出來說話了(相信權威,我是正確的),就出現了Certificate Authority(也即CA),有名的CA機構有Verisign等,目前數字認證的工業標準是:CCITT的X.509: 數字證書:它將一個身份標識連同公鑰一起進行封裝,並由稱為認證中心或 CA 的第三方進行數字簽名。 密鑰庫:java平台為你提供了密鑰庫,用作密鑰和證書的資源庫。從物理上講,密鑰庫是預設名稱為 .keystore 的文件(有一個選項使它成為加密文件)。密鑰和證書可以擁有名稱(稱為別名),每個別名都由唯一的密碼保護。密鑰庫本身也受密碼保護;您可以選擇讓每個別名密碼與主密鑰庫密碼匹配。 使用工具keytool,我們來做一件自我認證的事情吧(相信我的認證): 1、創建密鑰庫keytool -genkey -v -alias feiUserKey -keyalg RSA 默認在自己的home目錄下(windows系統是c:documents and settings<你的用戶名> 目錄下的.keystore文件),創建我們用 RSA 演算法生成別名為 feiUserKey 的自簽名的證書,如果使用了-keystore mm 就在當前目錄下創建一個密鑰庫mm文件來保存密鑰和證書。 2、查看證書:keytool -list 列舉了密鑰庫的所有的證書 也可以在dos下輸入keytool -help查看幫助。

⑦ 常用的加密演算法有哪些

對稱密鑰加密

對稱密鑰加密 Symmetric Key Algorithm 又稱為對稱加密、私鑰加密、共享密鑰加密:這類演算法在加密和解密時使用相同的密鑰,或是使用兩個可以簡單的相互推算的密鑰,對稱加密的速度一般都很快。

⑧ 私鑰的加密演算法

基類庫中提供的塊密碼類使用稱作密碼塊鏈 (CBC) 的鏈模式,它使用一個密鑰和一個初始化向量 (IV) 對數據執行加密轉換。對於給定的私鑰 k,一 個不使用初始化向量的簡單塊密碼將把相同的明文輸入塊加密為同樣的密文輸出塊。如果在明文流中有重復的塊,那麼在密文流中將存在重復的塊。如果未經授權的 用戶知道有關明文塊的結構的任何信息,就可以使用這些信息解密已知的密文塊並有可能發現您的密鑰。若要克服這個問題,可將上一個塊中的信息混合到加密下一 個塊的過程中。這樣,兩個相同的明文塊的輸出就會不同。由於該技術使用上一個塊加密下一個塊,因此使用了一個 IV 來加密數據的第一個塊。使用該系統, 未經授權的用戶有可能知道的公共消息標頭將無法用於對密鑰進行反向工程。
可 以危及用此類型密碼加密的數據的一個方法是,對每個可能的密鑰執行窮舉搜索。根據用於執行加密的密鑰大小,即使使用最快的計算機執行這種搜索,也極其耗 時,因此難以實施。使用較大的密鑰大小將使解密更加困難。雖然從理論上說加密不會使對手無法檢索加密的數據,但這確實極大增加了這樣做的成本。如果執行徹 底搜索來檢索只在幾天內有意義的數據需要花費三個月的時間,那麼窮舉搜索的方法是不實用的。
私鑰加密的缺點是它假定雙方已就密鑰和 IV 達成協議,並且互相傳達了密鑰和 IV 的值。並且,密鑰必須對未經授權的用戶保密。由於存在這些問題,私鑰加密通常與公鑰加密一起使用,來秘密地傳達密鑰和 IV 的值。

⑨ 公鑰與私鑰

我也剛學,有這樣一個例子給你看看,很有用:
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的你能夠對其解密

而常用公鑰體制主要有兩個作用:加密信息和認證。由於內容,我把鏈接給你,你參考著看看……挺好理解的
http://hi..com/piao2007/blog/item/ae2ec4f881f73202d8f9fd57.html

閱讀全文

與私鑰加密例子相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:421
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:191
pdf劈開合並 瀏覽:28
不能修改的pdf 瀏覽:752
同城公眾源碼 瀏覽:489
一個伺服器2個埠怎麼映射 瀏覽:297
java字元串ascii碼 瀏覽:79
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:945
安卓導航無聲音怎麼維修 瀏覽:332
app怎麼裝視頻 瀏覽:430
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491