不可逆加密:MD5
輸入明文后由系統(tǒng)直接經(jīng)過加密算法處理成密文,無法根據(jù)密文推算出明文
對(duì)稱加密:AES
雙方都持有密鑰
通過一個(gè)密鑰進(jìn)行加密和解密
明文 <-> 密鑰 <-> 密文
非對(duì)稱加密:RSA
- 原理
生成私鑰,公鑰對(duì)
一方都持有私鑰,一方持有公鑰,泄露風(fēng)險(xiǎn)小
你只要想:既然是加密,那肯定是不希望別人知道我的消息,所以只有我才能解密,所以可得出公鑰負(fù)責(zé)加密,私鑰負(fù)責(zé)解密;
同理,既然是簽名,那肯定是不希望有人冒充我發(fā)消息,只有我才能發(fā)布這個(gè)簽名,所以可得出私鑰負(fù)責(zé)簽名,公鑰負(fù)責(zé)驗(yàn)證。
RSA公鑰加密對(duì)填充有“ 0”和一串隨機(jī)位的消息進(jìn)行加密。
在此過程中,通過加密哈希和XOR運(yùn)算將隨機(jī)字符串“隱藏”在密文中。
解密時(shí),RSA解密從密文中恢復(fù)隨機(jī)字符串,并使用它來恢復(fù)消息。
這就是為什么同一文本消息使用相同公鑰多次加密會(huì)得到不同的結(jié)果的原因
- 使用
通過字節(jié)數(shù)組(二進(jìn)制文件)得到key對(duì)象
publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(byteArray));
通過cipher對(duì)象加密
cipher.init(Cipher.ENCRYPT_MODE, pubKey)
通過字節(jié)數(shù)組(二進(jìn)制文件)密鑰得到string形式的密鑰
new String(Base64.encodeBase64(byteArray),CharacterEncodings.CHARSET_UTF_8)
string形式的密鑰轉(zhuǎn)換為字節(jié)數(shù)組(二進(jìn)制文件)
byte[] decoded = Base64.decodeBase64(publicKeyString);
PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));