Android RSA 加密

没想到被Android里的RSA加密折腾了几个小时,主要还是自己对RSA加密的原理不了解,然后网上相关的资料也少。
使用AndroidUtilCode工具类中的EncryptUtils.encryptRSA()加密后的数据怎么也不对,后来自己找了段加密代码,才总算是可以了,这里记录一下。

首先我们需要先 生成一个RSA的公钥和私钥。

RSA加密公钥

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOCSZxJyD9BCPF+E0AwT1v/qdv
lMhLKkNbnp1BIrh9bnfuv15mULugWq7ARtWtppZVLHu7H0No6vZQRN66BY3wWbll
NPZP2Qg2xV3ubXcDa5CtfdmDbPeN+Ol4s97Gzcn7VL1+3NXzMRLAm1E64hqkrMfE
xpr5Okdai0szIb/EvwIDAQAB
-----END PUBLIC KEY-----

RSA加密私钥

-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAM4JJnEnIP0EI8X4
TQDBPW/+p2+UyEsqQ1uenUEiuH1ud+6/XmZQu6BarsBG1a2mllUse7sfQ2jq9lBE
3roFjfBZuWU09k/ZCDbFXe5tdwNrkK192YNs94346Xiz3sbNyftUvX7c1fMxEsCb
UTriGqSsx8TGmvk6R1qLSzMhv8S/AgMBAAECgYAK8Y96KSLmbYbc6BBm/tydi0An
fBabb3Y+cpFVuVtlRi3Wn5GLC7S7krV/fwOwgo2vnno/+SwicYB9yPqvlMXyKtl0
kXlcQn6vj+Qaf1EHy35Be4sEysTvVxW7eaHtrbIbQwc51YVUmbwX5sGnLL8579kK
zcQ15K9hpY+gQ9tw0QJBAOx1dvvkOdGIrzBajpGB3V9Yu0Z4MZrl1AihzCZLgTov
3eAWtmDxa6y8ErYRXkZq8dC+H9mnrBHN53Db6Gl1xfcCQQDfEA17x1A2M45z3suk
GbDbTy/u1K64RqsnubJWBXWzY1RO43cqP7Zul7edNgMdYpOGb6w4Z01i65ACcKDg
K6V5AkB7zymEzMRFZUctj0z0/UV3JhOw20BF9a7m8ijdqE06tVN8gQfvjJkvca5u
bHurbVW+Ub6FjZi4HdLgMhToG0WTAkEAw6Zl3Tq+LTxdZ150ybPK/yFezqH3uiQp
/YcQWAkj6rtl+GflXsZRcoFaiOcWJlEPSqxqp3JcWzZ4ststEFLYKQJBAJqFy7HC
5vLOmAMqPzT1BP70MjrCFvJ80jeTIsIqfpJxxtmYthfjtmaM6UWnfDQhdbZ1bFvB
Ywuc/LNp25PThWc=
-----END PRIVATE KEY-----

然后附上RSA加密相关的代码

fun main(){
	val idCard = "12345678"
	val result = rsaEncode(idCard)
	Log.i("Z-MMM", "result:$result")
}

fun rsaEncode(str: String): String? {
    val publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOCSZxJyD9BCPF+E0AwT1v/qdv
lMhLKkNbnp1BIrh9bnfuv15mULugWq7ARtWtppZVLHu7H0No6vZQRN66BY3wWbll
NPZP2Qg2xV3ubXcDa5CtfdmDbPeN+Ol4s97Gzcn7VL1+3NXzMRLAm1E64hqkrMfE
xpr5Okdai0szIb/EvwIDAQAB"
   var outStr = ""
    try {
        // base64编码的公钥
        val decoded: ByteArray = Base64.decode(publicKey, Base64.DEFAULT)
        val pubKey = KeyFactory.getInstance("RSA")
            .generatePublic(X509EncodedKeySpec(decoded)) as RSAPublicKey
        // RSA加密
        val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
        cipher.init(Cipher.ENCRYPT_MODE, pubKey)
        outStr = Base64.encodeToString(
            cipher.doFinal(str.toByteArray(charset("UTF-8"))),
            Base64.DEFAULT
        )
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return outStr
}

打印的结果

mAHc2ZtZuzDrA295Aw4CpYhctlJA3NeC7xd0BgGRMVSzBL8WRYuxNiDK1CQXuQ7B/3wgqH72CbRw
    GjUndeZf4jIBm7GHj9xOa6GPbDhlTVeH4VAjSoEgxiRzh/0WW2KLFZjs4GCErjpMx+x1U5EMIExV
    91OfiWcHCp72gns5tRo=

ras每次加密的结果都会变

验证加密结果 : 通过该网站我们可以对其进行解密,可以看到解密后的结果是12345678
在这里插入图片描述

感谢 Android RSA加密(Java后台给出公钥)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
RSA加密算法是一种非对称加密算法,它的安全性基于两个大素数的乘积难以分解的数学难题。下面是一份Python实现的RSA加密算法代码示例: ``` import random # 生成指定位数的大素数 def generate_prime_number(bits): while True: p = random.getrandbits(bits) if is_prime(p): return p # 判断是否为素数 def is_prime(n): if n <= 1: return False if n == 2 or n == 3: return True if n % 2 == 0: return False for i in range(3, int(n**0.5)+1, 2): if n % i == 0: return False return True # 求最大公约数 def gcd(a, b): while b != 0: a, b = b, a % b return a # 扩展欧几里得算法求模反元素 def extended_euclidean_algorithm(a, b): if b == 0: return (1, 0, a) else: x, y, gcd = extended_euclidean_algorithm(b, a % b) return (y, x - (a // b) * y, gcd) # 生成RSA公私钥对 def generate_rsa_key_pair(bits): p = generate_prime_number(bits//2) q = generate_prime_number(bits//2) n = p * q phi = (p-1) * (q-1) e = random.randrange(1, phi) g = gcd(e, phi) while g != 1: e = random.randrange(1, phi) g = gcd(e, phi) d = extended_euclidean_algorithm(e, phi) if d < 0: d += phi return (n, e), (n, d) # RSA加密 def rsa_encrypt(m, public_key): n, e = public_key c = pow(m, e, n) return c # RSA解密 def rsa_decrypt(c, private_key): n, d = private_key m = pow(c, d, n) return m # 测试代码 if __name__ == '__main__': bits = 1024 message = 'Hello, RSA!' m = int.from_bytes(message.encode(), 'big') public_key, private_key = generate_rsa_key_pair(bits) c = rsa_encrypt(m, public_key) decrypted_m = rsa_decrypt(c, private_key) decrypted_message = decrypted_m.to_bytes((decrypted_m.bit_length()+7)//8, 'big').decode() print('Message:', message) print('Encrypted:', c) print('Decrypted:', decrypted_m) print('Decrypted message:', decrypted_message) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值