這篇文章將為大家詳細(xì)講解有關(guān)Java公鑰私鑰是什么意思,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、張灣ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的張灣網(wǎng)站制作公司
在編程中,我們?yōu)榱吮WC數(shù)據(jù)安全,免不了要經(jīng)常進(jìn)行數(shù)據(jù)加密,于是產(chǎn)生了各種各樣的加密算法.無(wú)論怎樣,都還是存在被破解的風(fēng)險(xiǎn).今天就來(lái)說(shuō)說(shuō)RSA算法.
背景
RSA公鑰加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美國(guó)麻省理工學(xué)院)開(kāi)發(fā)的。RSA取名來(lái)自開(kāi)發(fā)他們?nèi)叩拿帧SA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。RSA算法基于一個(gè)十分簡(jiǎn)單的數(shù)論事實(shí):將兩個(gè)大素?cái)?shù)相乘十分容易,但那時(shí)想要對(duì)其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開(kāi)作為加密密鑰。
雖然上面的解釋很深?yuàn)W,但是你只要知道,這個(gè)算法非常安全就行了.
加密解密過(guò)程
假設(shè)有兩個(gè)用戶A,B. B在它的一側(cè),生成了公鑰和私鑰,私鑰只有B自己知道,然后把公鑰分享給A,當(dāng)然不僅是A,B的公鑰只要分享給了所有他信賴的人,那么這些人都將能解密A的數(shù)據(jù).
過(guò)程1:
A使用B的公鑰加密數(shù)據(jù),然后B使用私鑰解密數(shù)據(jù).這時(shí)所有擁有公鑰的用戶是不能解密數(shù)據(jù)的,因?yàn)樗麄儧](méi)有私鑰.這個(gè)數(shù)據(jù)只有A和B能夠獲取,這就保證了數(shù)據(jù)的安全.
過(guò)程2:
B使用私鑰加密數(shù)據(jù),那么所有有公鑰的用戶都可以使用公要解密數(shù)據(jù).其他沒(méi)有公鑰的人是沒(méi)有辦法獲取到數(shù)據(jù)的,這也保證了數(shù)據(jù)的安全性.

非對(duì)稱加密
通過(guò)上面的過(guò)程,我們可以看到這樣一個(gè)不同于以往加密算法的現(xiàn)象,那就是非對(duì)稱.什么是非對(duì)稱?
你不能通過(guò)自己的加密密鑰,反向解密,這個(gè)過(guò)程是不可逆的,正是因?yàn)槿绱瞬糯蟠筇岣吡怂陌踩裕€和私鑰都可以進(jìn)行加密解密,但他們必須配對(duì)使用.在私鑰被高度保護(hù)的情況下,永遠(yuǎn)不會(huì)出現(xiàn)被破解的可能.
java實(shí)現(xiàn)
package com.mike;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import javax.crypto.Cipher;
import org.apache.commons.codec.binary.Base64;
/**
* The class Rsa.java
*/
public class Rsa {
private static String PUBLIC_KEY_FILE = "C:\\my\\PublicKey";
private static String PRIVATE_KEY_FILE = "C:\\my\\PrivateKey";
/**
* 初始化密鑰
*
* @return
*/
public static void productKey() {
try {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair keyPair = keyGen.generateKeyPair();// 生成密鑰對(duì)
Key pubKey = keyPair.getPublic(); // 獲取公鑰
Key priKey = keyPair.getPrivate(); // 獲取私鑰
ObjectOutputStream oos1 = null;
ObjectOutputStream oos2 = null;
try {
/** 用對(duì)象流將生成的密鑰寫入文件 */
oos1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE));
oos2 = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE));
oos1.writeObject(pubKey);
oos2.writeObject(priKey);
} catch (Exception e) {
throw e;
} finally {
/** 清空緩存,關(guān)閉文件輸出流 */
oos1.close();
oos2.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 公鑰加密方法 私鑰加密也一樣
*
* @param source
* 源數(shù)據(jù)
* @return
* @throws Exception
*/
public static String encrypt(String source) throws Exception {
Key publicKey;
ObjectInputStream ois = null;
try {
/** 將文件中的公鑰對(duì)象讀出 */
ois = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE));
publicKey = (Key) ois.readObject();
} catch (Exception e) {
throw e;
} finally {
ois.close();
}
/** 得到Cipher對(duì)象來(lái)實(shí)現(xiàn)對(duì)源數(shù)據(jù)的RSA加密 */
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] b = source.getBytes();
/** 執(zhí)行加密操作 */
byte[] b1 = cipher.doFinal(b);
return Base64.encodeBase64String(b1);
}
/**
* 私鑰解密算法 公鑰解密一樣
*
* @param cryptograph
* 密文
* @return
* @throws Exception
*/
public static String decrypt(String cryptograph) throws Exception {
Key privateKey;
ObjectInputStream ois = null;
try {
/** 將文件中的私鑰對(duì)象讀出 */
ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE));
privateKey = (Key) ois.readObject();
} catch (Exception e) {
throw e;
} finally {
ois.close();
}
/** 得到Cipher對(duì)象對(duì)已用公鑰加密的數(shù)據(jù)進(jìn)行RSA解密 */
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] b1 = Base64.decodeBase64(cryptograph);
/** 執(zhí)行解密操作 */
byte[] b = cipher.doFinal(b1);
return new String(b);
}
public static void main(String[] args) throws Exception {
Rsa.productKey();
String msg = "我是加密信息";
String encryt = Rsa.encrypt(msg);
System.out.println("加密后的字符:"+encryt);
System.out.println("解密后的字符:"+Rsa.decrypt(encryt));
}
}這樣有了密鑰文件,你就可以進(jìn)行加密和簽名了。
關(guān)于Java公鑰私鑰是什么意思就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
文章名稱:Java公鑰私鑰是什么意思
文章出自:http://www.chinadenli.net/article20/gpcgjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、外貿(mào)建站、云服務(wù)器、網(wǎng)站策劃、網(wǎng)站內(nèi)鏈、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)