本篇記錄下Android平臺下對稱加密AES、非對稱加密RSA算法的具體實現,之前只是知道,或者調用別人寫好的方法,此次實現了一遍,記錄下,加深下印象,也爲須要的朋友節省點時間。算法
先簡單瞭解下AES,這裏摘錄下維基百科對 高級加密標準 的說明:加密
高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣爲全世界所使用。通過五年的甄選流程,高級加密標準由美國國家標準與技術研究院(NIST)於2001年11月26日發佈於FIPS PUB 197,並在2002年5月26日成爲有效的標準。2006年,高級加密標準已然成爲對稱密鑰加密中最流行的算法之一。spa
該算法爲比利時密碼學家Joan Daemen和Vincent Rijmen所設計,結合兩位做者的名字,以Rijndael爲名投稿高級加密標準的甄選流程。(Rijndael的發音近於"Rhine doll")設計
實現AES加密算法:code
建立Cipher對象orm
val cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
對象
根據傳入的密鑰key(建議16位長),建立SecretKeySpec對象ip
val keySpec = SecretKeySpec(key.toByteArray(), "AES")
ci
初始化cipherget
cipher.init(Cipher.ENCRYPT_MODE, keySpec)
對明文進行加密,並將結果轉換爲Base64串
val cipherByteArray = cipher.doFinal(plainText.toByteArray())
String(Base64.encode(cipherByteArray, Base64.NO_WRAP))
複製代碼
雖然就這簡單四步,但在第二步是查了很多資料,由於不肯定init傳入的Key對象具體該怎麼生成。
AES解密算法實現是同樣的
val keySpec = SecretKeySpec(key.toByteArray(), "AES")
val cipher = Cipher.getInstance(transformation)
cipher.init(Cipher.DECRYPT_MODE, keySpec)
val base64DecodeArray = Base64.decode(cipherText, Base64.NO_WRAP)
val plainByteArray = cipher.doFinal(base64DecodeArray)
複製代碼
仍是先了解下 百科
RSA加密算法是一種非對稱加密算法,在公開密鑰加密和電子商業中被普遍使用。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一塊兒提出的。當時他們三人都在麻省理工學院工做。RSA就是他們三人姓氏開頭字母拼在一塊兒組成的。[1]
1973年,在英國政府通信總部工做的數學家克利福德·柯克斯(Clifford Cocks)在一個內部文件中提出了一個與之等效的算法,但該算法被列入機密,直到1997年才獲得公開。[2]
對極大整數作因數分解的難度決定了RSA算法的可靠性。換言之,對一極大整數作因數分解愈困難,RSA算法愈可靠。假若有人找到一種快速因數分解的算法的話,那麼用RSA加密的信息的可靠性就會極度降低。但找到這樣的算法的可能性是很是小的。今天只有短的RSA鑰匙纔可能被強力方式破解。到當前爲止,世界上尚未任何可靠的攻擊RSA算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息其實是不能被破解的。
1983年9月12日麻省理工學院在美國爲RSA算法申請了專利。[3]這個專利於2000年9月21日失效。[4]因爲該算法在申請專利前就已經被髮表了[5],在世界上大多數其它地區這個專利權不被認可。
因爲實現RSA算法也是用Cipher對象,具體實現大同小異,就不分步說明了
// 公鑰加密
fun encrypt(publicKey: String, plainText: String): String {
val byteArray = Base64.decode(publicKey, Base64.NO_WRAP)
val keyFactory = KeyFactory.getInstance(ALGORITHM)
val keySpec = X509EncodedKeySpec(byteArray)
val pubKey = keyFactory.generatePublic(keySpec) as PublicKey
val cipher = Cipher.getInstance(transformation)
cipher.init(Cipher.ENCRYPT_MODE, pubKey)
val cipherByteArray = cipher.doFinal(plainText.toByteArray())
val base64 = Base64.encode(cipherByteArray, Base64.NO_WRAP)
return String(base64)
}
// 私鑰解密
fun decrypt(privateKey: String, cipherText: String): String {
val base64Buffer = Base64.decode(privateKey, Base64.NO_WRAP)
val keySpec = PKCS8EncodedKeySpec(base64Buffer)
val keyFactory = KeyFactory.getInstance(ALGORITHM)
val priKey = keyFactory.generatePrivate(keySpec) as PrivateKey
val cipher = Cipher.getInstance(transformation)
cipher.init(Cipher.DECRYPT_MODE, priKey)
val rawByteArray = Base64.decode(cipherText.toByteArray(), Base64.NO_WRAP)
val plainBuffer = cipher.doFinal(rawByteArray)
return String(plainBuffer)
}
//生成公私鑰對
fun generateKeyPair(): Pair<String, String> {
val keyPairGenerator = KeyPairGenerator.getInstance("RSA")
val keypair = keyPairGenerator.genKeyPair()
val private = Base64.getEncoder().encodeToString(keypair.private.encoded)
val public = Base64.getEncoder().encodeToString(keypair.public.encoded)
return Pair(private, public)
}
複製代碼