android rsa 加密
android rsa 加密
import java.io.ByteArrayOutputStream
import java.security.KeyFactory
import java.security.KeyPairGenerator
import java.security.PrivateKey
import java.security.PublicKey
import java.security.spec.PKCS8EncodedKeySpec
import java.security.spec.X509EncodedKeySpec
import javax.crypto.Cipher
import kotlin.io.encoding.Base64
object RSACrypt { // const val TRANSFORMATION = "RSA" const val TRANSFORMATION = "RSA/ECB/PKCS1Padding" const val ENCRYPT_MAX_SIZE = 117//每次最大加密长度 const val DECRYPT_MAX_SIZE = 128//每次最大解密长度 fun getPrivateKey(privateKeyStr: String): PrivateKey { return KeyFactory.getInstance("RSA").generatePrivate(PKCS8EncodedKeySpec(Base64.decode(privateKeyStr))) } fun getPublicKey(publicKeyStr: String): PublicKey { return KeyFactory.getInstance("RSA").generatePublic(X509EncodedKeySpec(Base64.decode(publicKeyStr))) } /** * 私钥分段加密 * @param input 原文 * @param privateKeyStr 私钥 */ fun encryptByPrivateKey(input: String, privateKeyStr: String): String { val privateKey: PrivateKey = getPrivateKey(privateKeyStr) val byteArray = input.toByteArray() //创建cipher对象 val cipher = Cipher.getInstance(TRANSFORMATION) //初始化cipher cipher.init(Cipher.ENCRYPT_MODE, privateKey) //分段加密 var temp: ByteArray? = null var offset = 0//当前偏移位置 val bos = ByteArrayOutputStream() while (byteArray.size - offset > 0) { //没有加密完成 //每次加密245个字节 if (byteArray.size - offset >= ENCRYPT_MAX_SIZE) { //剩余部分大于245 //bytearray,偏移,加密245个字节 temp = cipher.doFinal(byteArray, offset, ENCRYPT_MAX_SIZE) //重新计算offset offset += ENCRYPT_MAX_SIZE } else { temp = cipher.doFinal(byteArray, offset, byteArray.size - offset) offset = byteArray.size } //存储到临时缓冲区 bos.write(temp) } bos.close() return Base64.encode(bos.toByteArray()) } /** * 公钥分段加密 * @param input 原文 * @param publicKeyStr 公钥 */ fun encryptByPublicKey(input: String, publicKeyStr: String): String { val publicKey = getPublicKey(publicKeyStr) val byteArray = input.toByteArray() val cipher = Cipher.getInstance(TRANSFORMATION) cipher.init(Cipher.ENCRYPT_MODE, publicKey) var temp: ByteArray? = null var offset = 0//当前偏移位置 val bos = ByteArrayOutputStream() while (byteArray.size - offset > 0) { //没有加密完成 if (byteArray.size - offset >= ENCRYPT_MAX_SIZE) { temp = cipher.doFinal(byteArray, offset, ENCRYPT_MAX_SIZE) offset += ENCRYPT_MAX_SIZE } else { temp = cipher.doFinal(byteArray, offset, byteArray.size - offset) offset = byteArray.size } bos.write(temp) } bos.close() return Base64.encode(bos.toByteArray()) } /** * 公钥分段解密 * @param input 密文 * @param publicKeyStr 公钥 */ fun decryptByPublicKey(input: String, publicKeyStr: String): String { val publicKey = getPublicKey(publicKeyStr) val byteArray = Base64.decode(input) val cipher = Cipher.getInstance(TRANSFORMATION) cipher.init(Cipher.DECRYPT_MODE, publicKey) var temp: ByteArray? = null var offset = 0//当前偏移位置 val bos = ByteArrayOutputStream() while (byteArray.size - offset > 0) { //没有解密完成 if (byteArray.size - offset >= DECRYPT_MAX_SIZE) { temp = cipher.doFinal(byteArray, offset, DECRYPT_MAX_SIZE) offset += DECRYPT_MAX_SIZE } else { temp = cipher.doFinal(byteArray, offset, byteArray.size - offset) offset = byteArray.size } bos.write(temp) } bos.close() return String(bos.toByteArray()) } /** * 私钥分段解密 * @param input 密文 * @param privateKeyStr 私钥 */ fun decryptByPrivateKey(input: String, privateKeyStr: String): String { val privateKey: PrivateKey = getPrivateKey(privateKeyStr) val byteArray = Base64.decode(input) val cipher = Cipher.getInstance(TRANSFORMATION) cipher.init(Cipher.DECRYPT_MODE, privateKey) var temp: ByteArray? = null var offset = 0//当前偏移位置 val bos = ByteArrayOutputStream() while (byteArray.size - offset > 0) { //没有解密完成 if (byteArray.size - offset >= DECRYPT_MAX_SIZE) { temp = cipher.doFinal(byteArray, offset, DECRYPT_MAX_SIZE) offset += DECRYPT_MAX_SIZE } else { temp = cipher.doFinal(byteArray, offset, byteArray.size - offset) offset = byteArray.size } bos.write(temp) } bos.close() return String(bos.toByteArray()) } } fun generateKey(){ //如何生成密钥对 val generator = KeyPairGenerator.getInstance("RSA") generator.initialize(1024) val keyPair = generator.genKeyPair()//声明密钥对 val publicKey = keyPair.public//公钥 val privateKey = keyPair.private//私钥 println("publicKey="+ Base64.encode(publicKey.encoded)) println("privateKey="+Base64.encode(privateKey.encoded)) } val encryptByPublicKey = RSACrypt.encryptByPrivateKey(input, privateKeyStr) println("encryptByPublicKey:$encryptByPublicKey") val decryptByPrivateKey = RSACrypt.decryptByPublicKey(encryptByPublicKey, publicKeyStr) println("decryptByPrivateKey2:$decryptByPrivateKey")
参考:https://www.jianshu.com/p/485dee91ac19
浙公网安备 33010602011771号