本篇记录下Android平台下对称加密AES、非对称加密RSA算法的具体实现,以前只是知道,或者调用别人写好的方法,这次实现了一遍,记录下,加深下印象,也为需要的朋友节省点时间。
AES
先简单了解下AES,这里摘录下维基百科对 高级加密标准 的说明:
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael为名投稿高级加密标准的甄选流程。(Rijndael的发音近于"Rhine doll")
实现AES加密算法:
-
创建Cipher对象
val cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
-
根据传入的密钥key(建议16位长),创建SecretKeySpec对象
val keySpec = SecretKeySpec(key.toByteArray(), "AES")
-
初始化cipher
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加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。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)
}