Java中的加密與解密
Java中的加密與解密主要對資料的安全性提供保障,分為對稱和非對稱的,對稱表示加密金鑰和解密金鑰是同一個金鑰,因此也常常稱作私密金鑰或祕密金鑰,非對稱金鑰表示加密金鑰和解密為兩個不同的金鑰,一個為公共金鑰,另一個則為私密金鑰。對稱加密解密演算法有DES、AES等,非對稱加密解密演算法有RSA、DH等。對於資料的加密與解密我們通常通過生成金鑰,然後通過加密與解密操作類利用金鑰對資料進行加密與解密,接下來我們看看Java中如何實現對稱、非對稱加密與解密。
對稱加密與解密:通過KeyGenerator(金鑰生成器)生成Key(金鑰),然後通過Cipher(加密解密操作類)進行對資料的加密與解密。
例子:
KeyGenerator kg=KeyGenerator.getInstance("DES");//獲得指定演算法的金鑰生成器
kg.init(56);//金鑰生成器初始化,指定生成金鑰的長度
Key key=kg.generateKey();//獲得金鑰
Cipher cp=Cipher.getInstance("DES");//獲得指定演算法的加密解密操作類
cp.init(Cipher.ENCRYPT_MODE, key);//通過金鑰對其進行初始化,初始化為加密操作類
byte[] b=cp.doFinal("hello".getBytes());//對資料進行加密
System.out.println(new String(b));
cp.init(Cipher.DECRYPT_MODE, key);//通過金鑰對其進行初始化,初始化為解密操作類
System.out.println(new String(cp.doFinal(b)));//對資料進行解密
非對稱加密與解密:通過KeyPairGenerator(金鑰生成器)生成KeyPair(金鑰),然後通過KeyPair得到公共金鑰和私密金鑰,最後通過Cipher(加密解密操作類)利用公共金鑰和私密金鑰對資料的加密與解密。
KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
kpg.initialize(512);
KeyPair kp=kpg.generateKeyPair();
Cipher c=Cipher.getInstance("RSA");
c.init(Cipher.ENCRYPT_MODE, kp.getPrivate());
byte[] b=c.doFinal("zhangsan".getBytes());
System.out.println(new String(b));
c.init(Cipher.DECRYPT_MODE, kp.getPublic());
System.out.println(new String(c.doFinal(b)));
資料安全性得到保障但是對於資料的完整性又是如何保障的呢?對於提供了訊息摘要和數字簽名兩種方式來保障。訊息摘要就是通過資訊生成的雜湊值,例如A將資料傳送給B,A會將資訊和訊息摘要一起傳送過去,B接受到資訊之後,利用資訊生成訊息摘要,然後與接受到的訊息摘要相比是否一致。數字簽名既保證了資訊的完整性,也保證了資料的不可偽造性,同樣是利用訊息生成簽名,與訊息一起傳送過去,收到訊息與簽名之後,利用訊息來驗證簽名。
訊息摘要:
MessageDigest md=MessageDigest.getInstance("MD5");
md.update("zhangsan".getBytes());
System.out.println(new String(md.digest()));//生成訊息摘要
md.reset();//用於重置MessageDigest,其實當我們呼叫digest()方法之後就重置了Messagedigest
System.out.println(new String(md.digest("zhangsan".getBytes())));
/**
* MessageDigest用於產生訊息摘要,也稱為雜湊值、雜湊值,用於產生該摘要的演算法稱為雜湊函式、雜湊函式,主要用於保證
* 資料的完整性,在同一個雜湊函式情況下,只有相同的訊息才能產生相同的摘要,傳送發將訊息和摘要傳送個接收方,接受者接受
* 到訊息後使用傳送發相同的雜湊函式產生訊息摘要,並且與接收到的訊息摘要相比,對比是否相同。
*/
數字簽名:與訊息摘要不同,數字簽名通過公共金鑰生成和驗證
byte[] message="hello".getBytes();
KeyPairGenerator kpg=KeyPairGenerator.getInstance("DSA");
kpg.initialize(1024);
KeyPair kp=kpg.generateKeyPair();
Signature sign=Signature.getInstance(kpg.getAlgorithm());
//通過私密金鑰生成簽名
sign.initSign(kp.getPrivate());
sign.update(message);
byte[] s=sign.sign(); //生成簽名
//通過公共金鑰驗證簽名
sign.initVerify(kp.getPublic());
sign.update(message);
System.out.println(sign.verify(s));//驗證簽名
我們在使用的過程中可能還會接觸到Provider(安全機制提供者),簡單的來理解就是提供加密解密演算法方,在生成私密金鑰生成器和公共金鑰生成器的時候可能會用到,Provider繼承Properties,因此可以向Properties一樣使用。Security(對提供者的操作類),用於對提供者進行管理(查詢、刪除、增加)。JDK內建很多提供者,通過以下的方法可以查詢出來
Provider[] ps=Security.getProviders();
System.out.println(ps.length);
for(Provider p:ps)
{
Set<Entry<Object, Object>> entry=p.entrySet();
for(Entry<Object,Object> e:entry)
System.out.println(e.getKey()+" "+e.getValue());
}
相關文章
- JAVA中AES加密和解密Java加密解密
- Java加密解密Java加密解密
- PhpAES加密、解密與Java互操作的問題PHP加密解密Java
- 影像的加密與解密加密解密
- 使用Java加密與解密實現步驟Java加密解密
- java實現DES資料加密與解密Java加密解密
- 《Java加密與解密的藝術》讀後總結Java加密解密
- RSA加密與解密加密解密
- Java加密解密瞭解Java加密解密
- java書籍-《java加密解密的藝術》Java加密解密
- 序列密碼的加密與解密密碼加密解密
- security.js RSA加密與java客戶端解密JS加密Java客戶端解密
- 有關字元的加密與解密 (轉)字元加密解密
- utf8 加密與解密加密解密
- Java AES加密和解密教程 - BaeldungJava加密解密
- Java 常用加密解密演算法Java加密解密演算法
- java使用DES加密方式,實現對資料的加密解密Java加密解密
- iOS開發中AES的加密和解密iOS加密解密
- 26.RSA加密解密在Java專案中的簡單應用加密解密Java
- 加密解密加密解密
- 軟體狗[Dongles]的加密與解密技術加密解密
- java中的使用RSA演算法進行公鑰加密私鑰解密 .Java演算法加密解密
- python加密與解密,加簽與驗籤Python加密解密
- JavaScript前端和Java後端的AES加密和解密JavaScript前端後端加密解密
- DES加密和解密PHP,Java,ObjectC統一的方法加密解密PHPJavaObject
- java 實現 DES加密 解密演算法Java加密解密演算法
- JAVA和C# 3DES加密解密JavaC#3D加密解密
- RC4加密解密java演算法加密解密Java演算法
- PHP加密解密PHP加密解密
- js加密解密JS加密解密
- Unity 加密解密Unity加密解密
- Oracle ----加密解密Oracle加密解密
- AES 加密&解密加密解密
- AES加密解密加密解密
- C#中base64之加密解密C#加密解密
- php和.net 的加密解密PHP加密解密
- php mcrypt 加密 解密PHP加密解密
- AES CBC 加密解密加密解密