Generate public key from private key in keychain

本文介绍了一种方法,即如何在丢失公钥的情况下仅使用私钥重新生成公钥。通常,公钥和私钥是一对生成的,但在某些情况下可能会丢失公钥。本文详细解释了如何将私钥导出为.p12文件,然后将其转换为.pem格式,并从中提取出公钥,最终将公钥导入到密钥链中。

ref link: http://stackoverflow.com/questions/16847081/i-lost-my-public-key-can-i-recover-it-from-a-private-key


如何通过private key来恢复public key?

public / private key都是成对生成的,但下面2种常见情况会丢失public key

1. 不小心从keychain里删掉public key

2. apple program admin会生成一个p12传给developer来通过它生成distribution ipa file,而developer在把这个p12导入到keychain之后,它只包含private key and certificate,并不包括public key。


另外如果key chain里只有private key,而没有对应的public key,那么当你right-click the private key -> "Request a certificate",就会出现error “The specified item could not be found in the keychain


下面方法可以通过private key in keychain来生成对应的public key.

1. In Keychain Access, right click the private key and select "Export..." as eg "private.p12". 在导出过程中,你需要给该.p12 file设置一个密码,假设为 “123456”.

2. 执行下列命令把.p12 file转换成.pem file (e.g. private.pem)。在此过程中你需要输入步骤1设置的密码,然后还需要给生成的pem file设置一个密码,假设依然为“123456”.

openssl pkcs12 -in private.p12 -out private.pem

3.执行下列命令来获取public key的pem file (e.g. public.pem) 。在此过程中你需要输入步骤2设置的密码

openssl rsa -in private.pem -pubout > public.pem

4. 执行下列命令把public.pem file导入到keychain tool里的"login" keychain里。

security import public.pem -k login.keychain

5. 打开keychain tool,进入"login" keychain > keys,你会看到一个“Imported public key” item,这就是步骤4导入的public key。double click it,你可以为其更改名称

6. !!注意:最后记得要清楚步骤1和2生成的private key .p12 and .pem file!!



`from Crypto.PublicKey import RSA` 是 Python 中用于处理 **RSA 非对称加密算法**的一个模块导入语句,它来自于第三方库 `pycryptodome`(即 `PyCryptodome`),是旧版 `pycrypto` 的现代替代品。 --- ### ✅ 功能描述: 该模块的主要功能是:**生成、读取、导出和操作 RSA 公钥与私钥对象。** 具体来说: ```python from Crypto.PublicKey import RSA ``` 这行代码的作用是从 `Crypto.PublicKey` 模块中导入 `RSA` 类,允许你执行以下操作: 1. **生成新的 RSA 密钥对(公钥 + 私钥)** 2. **从字符串或文件中导入已有的 RSA 密钥** 3. **将密钥以 PEM 或 DER 格式导出** 4. **检查密钥参数(如模数、指数、位数等)** 5. **为后续的加密、解密、签名、验签做准备** --- ### 🧩 常见用途示例: #### 1. 生成 RSA 密钥对 ```python from Crypto.PublicKey import RSA # 生成 2048 位的 RSA 密钥 key = RSA.generate(2048) # 提取私钥 private_key = key.export_key() # 默认为 PEM 格式 with open("private.pem", "wb") as f: f.write(private_key) # 提取公钥 public_key = key.publickey().export_key() with open("public.pem", "wb") as f: f.write(public_key) print("RSA 密钥对已生成并保存") ``` #### 2. 从文件加载 RSA 公钥或私钥 ```python from Crypto.PublicKey import RSA # 加载私钥 with open("private.pem", "r") as f: private_key = RSA.import_key(f.read()) # 加载公钥 with open("public.pem", "r") as f: public_key = RSA.import_key(f.read()) print("私钥信息:", private_key.size_in_bits(), "位") print("公钥信息:", public_key.n) # n 是模数 ``` #### 3. 使用密钥进行后续操作(如签名) 虽然 `Crypto.PublicKey.RSA` 不直接提供加密/签名方法,但它可以与其他模块配合使用,例如: ```python from Crypto.Signature import pkcs1_15 from Crypto.Hash import SHA256 import hashlib # 签名数据 message = b"Hello, World!" h = SHA256.new(message) signer = pkcs1_15.new(private_key) signature = signer.sign(h) ``` --- ### 🔐 应用场景: | 场景 | 说明 | |------|------| | HTTPS 客户端认证 | 使用 RSA 私钥进行客户端身份认证 | | API 请求签名 | 对请求内容进行数字签名,防止篡改 | | 数据加密传输 | 使用对方公钥加密敏感数据 | | JWT / OAuth 安全令牌 | RS256 算法基于 RSA 签名 | | 软件授权系统 | 使用私钥签发许可证,公钥验证合法性 | --- ### ⚠️ 注意事项: - `Crypto.PublicKey.RSA` 只负责密钥管理,不包含完整的加解密逻辑(需结合 `Crypto.Cipher.PKCS1_v1_5` 或 `PKCS1_OAEP`)。 - 秘钥必须妥善保护,尤其是私钥不能泄露。 - 推荐使用至少 2048 位强度的密钥,4096 位更安全但性能略低。 - 安装依赖命令:`pip install pycryptodome` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值