You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python Cryptodome开发Android Kivy应用时启动崩溃问题求助

Kivy+Buildozer打包APK引入Cryptodome RSA后手机崩溃的解决办法

问题描述

用Kivy开发Android应用,通过Buildozer打包成APK。引入Cryptodome实现RSA加解密前代码运行正常,电脑端测试也没问题,但手机上启动应用直接崩溃,报错如下:

ImportError: CFFI with optimize=2 fails due to pycparser bug.
AttributeError: undefined symbol: PyObject_GetBuffer

已在buildozer.spec中添加必要依赖,但问题未解决,需要修复该问题,或寻找可在Android上运行的替代Python RSA模块。


针对Cryptodome的修复方案

1. 调整CFFI优化等级规避bug

在buildozer.spec的[app]段添加配置,强制CFFI使用优化等级1,绕过pycparser的bug:

android.extra_pip_args = --no-build-isolation
# 设置环境变量修改CFFI优化等级
os.environ['CFFI_OPT_LEVEL'] = '1'

也可以直接指定兼容版本的CFFI,在requirements中添加:

requirements = python3,kivy,pycryptodome,cffi==1.15.0

2. 使用Cryptodome的纯Python封装接口

避免调用依赖编译的底层模块,改用高层纯Python实现的API,比如Crypto.PublicKey.RSA和Crypto.Cipher.PKCS1_OAEP:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

# 生成密钥对
key_pair = RSA.generate(2048)
private_key = key_pair.export_key()
public_key = key_pair.publickey().export_key()

# 加密数据
cipher = PKCS1_OAEP.new(RSA.import_key(public_key))
encrypted_data = cipher.encrypt(b"需要加密的内容")

# 解密数据
cipher = PKCS1_OAEP.new(RSA.import_key(private_key))
decrypted_data = cipher.decrypt(encrypted_data)

3. 修复ctypes符号未定义问题

在buildozer.spec的requirements中明确添加ctypes,同时检查是否有其他依赖库冲突,移除不必要的第三方模块:

requirements = python3,kivy,pycryptodome,ctypes

替代的纯Python RSA模块

如果Cryptodome的问题无法解决,推荐使用纯Python实现的rsa模块,无需编译,Android兼容性更好:

  1. 在buildozer.spec的requirements中添加rsa
  2. 示例代码:
import rsa

# 生成2048位密钥对
pub_key, priv_key = rsa.newkeys(2048)

# 加密
encrypted = rsa.encrypt(b"需要加密的内容", pub_key)

# 解密
decrypted = rsa.decrypt(encrypted, priv_key)

该模块支持PKCS#1 v1.5和OAEP加密,性能略低于Cryptodome,但足以满足常规需求。


内容的提问来源于stack exchange,提问作者big_shlomi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 23:42:44