本篇记录下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)
}
复制代码