Android对称、非对称加解密

Android对称、非对称加解密

本篇记录下Android平台下对称加密AES、非对称加密RSA算法的具体实现,之前只是知道,或者调用别人写好的方法,此次实现了一遍,记录下,加深下印象,也为须要的朋友节省点时间。算法

AES

先简单了解下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

  1. 建立Cipher对象orm

    val cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")对象

  2. 根据传入的密钥key(建议16位长),建立SecretKeySpec对象ip

    val keySpec = SecretKeySpec(key.toByteArray(), "AES")ci

  3. 初始化cipherget

    cipher.init(Cipher.ENCRYPT_MODE, keySpec)

  4. 对明文进行加密,并将结果转换为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)
}
复制代码
相关文章
相关标签/搜索